Ожидайте..

 
 
Новости
Документы
Прочее
Авторизоваться
 

COM написанный на DelphiXE2 для 1С 8.2

Как создать COM объект для использования в 1С.

Пошаговая инструкция-пример как это делается в Embarcadero Delphi XE2.

Какая именно версия вам нужна для создания я не могу сказать, т.к. нет возможности протестировать на разных версиях. Но если в вашей версии не хватает каких либо компонент, то присылайте свои комментарии и дополнения по почте.

 

Итак. Все гениальное просто, а в современном мире все еще проще. 1С предлагает примеры для разработки COM объекта. Их можно найти например на ИТС диске в каталоге :\1CIts\EXE\VNCOMP82\. Но для нас проблемой является, то примеры приведены для С++ и иже с ними. Этот текст я отчасти делаю потому, что мне хочется переделать эти примеры для любимых Delphi. При этом хочется, чтобы компонента была 100% совместима. Но для начала я опишу самый простой и быстрый способ сделать «нечто» что будет работать в 1С не хуже чем пример от разработчиков.

 

Начнем.

Создаем новый компонент. FileNewOther...

И выбираем в ветке Delphi Projects – AxtiveX элемент ActiveX Library. Жмем ОК.

Появляется новый проект, после создания которого я предлагаю вам сразу задать имя библиотеки. Например SimpleCOM1C. Жмём Save all, что бы сохранить проект и нам предлагается ввести имя Project1.ridl для сохранения RIDL файла (описание интерфейса COM объекта). Назовем его к примеру SimpleCOM1CProjectRIDL.

Далее предлагается сохранить TLB файл (библиотека типов объекта) оставим такое, как предлагается SimpleCOM1C_TLB.pas.

Далее предлагается ввести имя всего проекта Project1.dproj. Это имя будет использоваться для создания имени компилированного файла COM объекта – dll, поэтому я предлагаю ввести его так как оно будет поставляться пользователю, например, SimpleCOM1C.

 

Теперь создаем сам объект. File – New – Other

В той же ветки ActiveX выбираем Automation Object и нажимаем OK.

Появляется мастер создания объекта куда нужно вписать имя кокласса. Впишем, к примеру, BaseTests. Это имя потом будет использоваться при создании объекта в 1С как:

Компонента = Новый COMОбъект("SimpleCOM1C.BaseTests");

 

Одновременно подставляется имя для интерфейса IBaseTests. Нажимаем ОК.

Создается интерфейс и кокласс в редакторе интерфейсов. Нажмем Save all для сохранения модуля в котором будем писать исполняемый код и назовем его SimpleCOM1CUnit.

На этой стадии объект уже можно подключать в 1С. BaseTests на вкладке Implements содержится список интерфейсов включенных в состав этого объекта. Поэтому при добавлении интерфейса не забудьте его добавить в этот вписок.

Нам нужно что-то выполнить, чтобы понять, что все, что мы делаем, работает правильно. Давайте создадим пару методов для теста.

Выделите интерфейс IBaseTests , нажмите правой клавишей и добавьте Property, т.к. система сразу предложит ввести название, то введите, к примеру, «ВыдаватьИнформацию». Сразу на вкладке Attributes и задим другой тип VARIANT_BOOL. Этот параметр мы будем выставлять истина для отображения сообщения из COM объекта.

Delphi создаст для нас два объекта Property один используется для записи (параметр Invoke kind = propety put), а другой для чтения (property get) значений в этот параметр. Для нас он будет булевый.

Нажмем Refresh implementation для обновления кода и добавим такой код:

type

  TBaseTests = class(TAutoObject, IBaseTests)

    FExtendInfo: Boolean;

  protected

    function Get_ВыдаватьИнформацию: WordBool; safecall;

    procedure Set_ВыдаватьИнформацию(Value: WordBool); safecall;

  end;

implementation

uses ComServ;

function TBaseTests.Get_ВыдаватьИнформацию: WordBool;

begin

  Result := FExtendInfo;

end;

procedure TBaseTests.Set_ВыдаватьИнформацию(Value: WordBool);

begin

  FExtendInfo := Value;

end;

 

Перейдем обратно на редактор интерфейсов и добавим метод «Сумма». Для подсчета нам нужны параметры, поэтому перейдем на вкладку Parametres и добавим необходимые строки таким образом:

В ходящие параметры A и B имеют тип float, а возвращаемый параметр имеет указатель на тип float модификатор у которого говорит что это выходной параметр (out), возвращаемый как результат функции (retval). Обновим интерфейс и перейдем к коду. Впишем код функции:

function TBaseTests.Сумма(A, B: Single): Single;

begin

  Result := A + B;

  if FExtendInfo then

    ShowMessage('Пытаемся высчитать выражение '+FloatToStr(A)+' + '+FloatToStr(B)+' = '+FloatToStr(Result));

end;

 

Для работы функций ShowMessage и FloatToStr нужно подключить модули Vcl.Dialogs и StrUtils соответственно в директиве uses.

Последний шаг который необходимо сделать, это зарегистрировать нашу компоненту в системе. Для этого в Delphi есть команда меню RunActiveX Server Register. У пользователя это может делаться с использоваением regsvr32.

Все. Теперь в 1С добавим такой код:

Попытка

                Компонента = Новый COMОбъект("SimpleCOM1C.BaseTests");

                Сообщить("Компонента создана");

Исключение

                Сообщить("Ошибка при создании объекта"+Символы.ПС+ОписаниеОшибки());

КонецПопытки;

 

Попытка

                Сообщить("До установки "+Компонента.ВыдаватьИнформацию);

                Компонента.ВыдаватьИнформацию = Истина;

                Сообщить("После установки "+Компонента.ВыдаватьИнформацию);

Исключение

                Сообщить("Ошибка при работе с объектом "+Символы.ПС+ОписаниеОшибки());

КонецПопытки;

 

Попытка

                а = 1000;

                б = 1346.12354;

                с = Компонента.Сумма(а, б);

                Сообщить("Суммирование объектом "+а+" + "+б+" = "+с);

Исключение

                Сообщить("Ошибка при вызове метода "+Символы.ПС+ОписаниеОшибки());

КонецПопытки;

 

В результате выполнения выдается сообщение из COM объекта и в 1С

Ну а вот почему какие-то погрешности? Незнаю, думаю кто-то из нас напортачил с типами.