How TODO in Terrasoft CRM 3.0 Содержание Вызов окна из скрипта самого окна ............................................................................................. 1 Логирование сообщений ............................................................................................................... 1 2.1. Вывод сообщений в лог......................................................................................................... 1 2.2. Вывод активного действия в лог .......................................................................................... 1 3. Создание соединения с системой ................................................................................................. 2 3.1. Создание соединения для конкретного пользователя ........................................................ 2 3.2. Соединение с вызовом формы логина ................................................................................. 3 4. Импорт данных в Excel из Terrasoft CRM 3.0 ............................................................................. 4 5. Создание COM объекта и вызов COM объекта из скрипта ....................................................... 5 6. Экспорт данных из Terrasoft CRM 3.0 в Excel ............................................................................ 5 1. 2. 1. Вызов окна из скрипта самого окна Для вызова окна необходимо добавить в текст скрипта следующую функцию Main в которой указать имя требуемого окна, после чего нажать F9: function Main() { var Window = Services.GetNewItemByUSI('wnd_TestWindow'); Window.IsDesigning = false; Window.Prepare(); Window.Show(); } 2. Логирование сообщений 2.1. Вывод сообщений в лог Для вывода сообщений в лог системы можно воспользоваться методом объекта Log.Write(). Для использования констант необходимо в скрипт включить модуль scr_SysEnums function Main() { Log.Write(lmtInformation, 'Information Text'); Log.Write(lmtWarning, 'Warning Text'); Log.Write(lmtError, 'Error Text'); } 2.2. Вывод активного действия в лог Вывод сообщений можно эффективно дополнить функцией вывода активного сообщения. Активное сообщение позволяет не только вывести информацию, но и произвести соответсвующее действие пользователем. Для этого необходимо воспользоваться методом объекта Log.WriteAction(). Например, следующее действие открывает дизайнер сервиса Select Query 'sq_Opportunity': function Main() { Log.Write(lmtError, 'Error In Service sq_Opportunity'); Log.WriteAction('Edit', 'Edit sq_Opportunity', 'function Main() {' + ' Designers = Core.DesignerCore.Designers;' + ' Designers.DesignServiceByUSI("sq_Opportunity", "", false);' + '}'); } Данный метод можно активно использовать для создания интуитивно понятных сообщений, наподобие таких: 'Если вы хотите отредактировать сервис sq_Opportunity нажмите на «Редактировать», если хотите удалить, нажмите на «Удалить», хотите создать новый, нажмите «Создать»'. 3. Создание соединения с системой 3.1. Создание соединения для конкретного пользователя Для создания соединения необходимо создать объект "TSObjectLibrary.Connector" и вызвать его метод OpenConfiguration: function OpenConfiguration(const Configuration: IConfiguration; const UserName: WideString; const UserPassword: WideString): WordBool; Пример создания соединения из Excel: Sub Macro1() Dim Connector Dim Configuration Dim Window Set Connector = CreateObject("TSObjectLibrary.Connector") Set Configuration = Connector.Configurations.ItemsByName("TSCRM") If (Not Connector.OpenConfiguration(Configuration, "Supervisor", "")) Then Exit Sub End If Set Window = Connector.Services.GetNewItemByUSI("wnd_TestWindow") Window.WindowCaption = "Test Caption" Window.Prepare Window.ShowModal End Sub Для вызова из Delphi: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, TSObjectLibrary_TLB, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses TSWindowLibrary_TLB, ComObj; procedure TForm1.Button1Click(Sender: TObject); var //Value: OleVariant; Connector: IConnector; Configuration: IConfiguration; Service: IService; Window: IWindow; begin {Value := CreateOleObject('TSObjectLibrary.Connector'); if (not Supports(Value, IConnector, Connector)) then begin Exit; end;} Connector := CoConnector.Create(); Configuration := Connector.Configurations.ItemsByName['TSCRM']; if (not Connector.OpenConfiguration(Configuration, 'Supervisor', '')) then begin Exit; end; Service := Connector.Services.GetNewItemByUSI('wnd_Customer'); if (not Supports(Service, IWindow, Window)) then begin Exit; end; Window.Prepare(); Window.ShowModal(); end; end. 3.2. Соединение с вызовом формы логина Для создания соединения с вызовом формы логина необходимо создать объект "TSDskObjectLibrary.DskConnector" и вызвать его метод Login: function Login(const ApplicationName: WideString): WordBool; Пример создания соединения с вызовом формы из Excel: Sub Macro1() Dim Connector Dim Window Set Connector = CreateObject("TSDskObjectLibrary.DskConnector") If (Not Connector.Login("Test Application")) Then Exit Sub End If Set Window = Connector.Services.GetNewItemByUSI("wnd_TestWindow") Window.WindowCaption = "Test Caption" Window.Prepare Window.ShowModal End Sub Для Delphi: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, TSObjectLibrary_TLB, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses TSWindowLibrary_TLB, TSDskObjectLibrary_TLB, ComObj; procedure TForm1.Button1Click(Sender: TObject); var Connector: IDskConnector; Configuration: IConfiguration; Service: IService; Window: IWindow; begin Connector := CoDskConnector.Create(); if (not Connector.Login()) then begin Exit; end; Service := Connector.Services.GetNewItemByUSI('wnd_Customer'); if (not Supports(Service, IWindow, Window)) then begin Exit; end; Window.Prepare(); Window.ShowModal(); end; end. 4. Импорт данных в Excel из Terrasoft CRM 3.0 Sub ImportContacts() Dim Connector Dim Configuration Set Connector = CreateObject("TSObjectLibrary.Connector") Set Configuration = Connector.Configurations.ItemsByName("TSCRM") If (Not Connector.OpenConfiguration(Configuration, "Supervisor", "")) Then Exit Sub End If Dim Dataset Set Dataset = Connector.Services.GetNewItemByUSI("ds_Contact") Dim Sheet As Worksheet Dataset.Open Set Sheet = ActiveSheet i = 2 Sheet.Cells(1, 1) = "Name" Sheet.Cells(1, 2) = "Address" While Not Dataset.IsEOF Sheet.Cells(i, 1) = Dataset.ValAsStr("Name") Sheet.Cells(i, 2) = Dataset.ValAsStr("Address") Dataset.GotoNext i = i + 1 Wend Dataset.Close End Sub 5. Создание COM объекта и вызов COM объекта из скрипта 1) Для создания COM объекта необходимо в Delphi создать проект (меню File New Other… Закладка ActiveX ActiveX Library ) и сохранить его с именем «TestComObject». 2) В проект добавляем объект автоматизации (меню File New Other… Закладка ActiveX ActiveX Library Automation Object), вводим CoClassName «Test». 3) В редакторе библиотеки типа в интерфейсе ITest добавляем метод «MsgBox» с параметром Name = Message, Type = WideString. Добавляем в раздел implementation модуль Dialogs: implementation uses ComServ, Dialogs; А в тело метода MsgBox добавляем вызов функции ShowMessage: procedure TTest.MsgBox(const Message: WideString); begin ShowMessage(Message); end; Сохраняем модуль объекта в файле Test.pas 4) Регистрируем библиотеку (меню Run Register ActiveX Server). 5) Для вызова COM объекта необходимо создать произвольный сервис скрипта и добавить в текст скрипта следующую функцию Main, после чего нажать F9: function Main() { var TestObject = System.CreateObject('TestComObject.Test'); TestObject.MsgBox('Test Message'); } 6. Экспорт данных из Terrasoft CRM 3.0 в Excel Для экспорта данных в Excel необходимо создать ActiveXObject с именем 'Excel.Application', затем создать Excel-книгу (Workbook) и вывести данные в соответствующие столбцы: function btnExportToExcelOnClick(Control) { var ExcelApplication = new ActiveXObject('Excel.Application'); var WorkBook = ExcelApplication.WorkBooks.Add(); var Sheet = WorkBook.ActiveSheet; var Dataset = dlCustomer.Dataset; Dataset.DisableEvents(); try { for (var i = 0; i < Dataset.Datafields.Count; i++) { var Datafield = Dataset.Datafields.Items(i); Sheet.Cells(1, i + 1) = Datafield.Name; } var i = 2; var IDField = Dataset.Datafields.ItemsByName('ID'); var NameField = Dataset.Datafields.ItemsByName('Name'); var AddressField = Dataset.Datafields.ItemsByName('Address'); var BalanceField = Dataset.Datafields.ItemsByName('Balance'); Dataset.GotoFirst(); while (!Dataset.IsEOF) { Sheet.Cells(i, 1) = IDField.Value; Sheet.Cells(i, 2) = NameField.Value; Sheet.Cells(i, 3) = AddressField.Value; Sheet.Cells(i, 4) = BalanceField.Value; Dataset.GotoNext(); i = i + 1; } } finally { Dataset.EnableEvents(); } Sheet.Cells.Select(); Sheet.Cells.EntireColumn.AutoFit(); Sheet.Range('A2').Select(); ExcelApplication.Visible = true; } 7. Динамическое создание сервисов Для экспорта данных в Excel необходимо создать ActiveXObject с именем 'Excel.Application', затем создать Excel-книгу (Workbook) и вывести данные в соответствующие столбцы: function btnExportToExcelOnClick(Control) { .. TODO 8. Обновление грида детали раздела Пример: необходимо после создания задачи для указанного проекта обновить делать «задачи проекта». Для обновление грида детали раздела необходимо изменить в скрипте карточки задачи scr_TaskEdit метод btnOKOnClick() (вставленный код выделенный жирным шрифтом) и добавить в скрипт дополнительный модуль (Inclusions Script) scr_DB: function btnOKOnClick(Control) { var Dataset = dlData.Dataset; var IsFinished = GetTaskStatusIsFinishByID(Dataset.Values('StatusID')); var WorkflowItemID = Dataset.Values('WorkflowItemID'); var MadeByWorkflow = (WorkflowItemID != null); if (IsFinished && MadeByWorkflow) { Dataset.DataFields('ResultID').IsRequired = true; } else { Dataset.DataFields('ResultID').IsRequired = false; } if (!CheckTaskData(Dataset)) { return; } CreateRemindings(); TaskEdit.IsCompleting = true; try { var ResultFlag = scr_BaseDBEdit.btnOKOnClick(Control); } finally { TaskEdit.IsCompleting = false; } if (Self.IsVisible) { return; } var MainWindow = Connector.Attributes('MainWindow'); var wndWorkspace = MainWindow.ComponentsByName('wndWorkspace'); var WorkspaceWindow = wndWorkspace.Window; var WorkspaceWindowUSICode = System.ExtractUSICode(WorkspaceWindow.USI); if (WorkspaceWindowUSICode == 'wnd_OpportunitiesWorkspace') { var wndTasksDetail = WorkspaceWindow.ComponentsByName('wndTasksDetail'); var TasksDetailWindow = wndTasksDetail.Window; var DatasetLink = TasksDetailWindow.ComponentsByName('dlData'); RefreshDataset(DatasetLink.Dataset); } var WorkflowItemID = Dataset.ValAsStr('WorkflowItemID'); if ((!TaskEdit.StatusChanged) || (!IsFinished) || (IsEmptyGUID(WorkflowItemID))) { return; } var WorkflowEngine = GetAttribute(Connector, 'WorkflowEngine'); if (Assigned(WorkflowEngine)) { WorkflowEngine.ProcessWorkflowItem(WorkflowItemID); } } 9. Экспорт данных из Excel в Terrasoft CRM 3.0 Sub ExportToTSCRM() Dim Connector Dim Configuration Set Connector = CreateObject("TSObjectLibrary.Connector") Set Configuration = Connector.Configurations.ItemsByName("TSCRM") If (Not Connector.OpenConfiguration(Configuration, "Supervisor", "")) Then Exit Sub End If Dim Dataset Set Dataset = Connector.Services.GetNewItemByUSI("ds_Contact") Dim Sheet As Worksheet Dataset.Open Set Sheet = ActiveSheet Dim MaxRange As Range Set MaxRange = Selection.End(xlDown) For Row = 2 To MaxRange.Row Dataset.Append Dataset.ValAsStr("ID") = Connector.GenGUID Dataset.ValAsStr("Name") = Sheet.Cells(Row, 1) Dataset.ValAsStr("Address") = Sheet.Cells(Row, 2) Dataset.Post Next Row Dataset.Close End Sub Исходная таблица данных в Excel 1 2 3 4 5 6 7 8 9 10 11 A Name Contact1 Contact2 Contact3 Contact4 Contact5 Contact6 Contact7 Contact8 Contact9 Contact10 B Address Address1 Address2 Address3 Address4 Address5 Address6 Address7 Address8 Address9 Address10