Введение
Что это такое:
- Это компонент для DELPHI (любой версии), позволяющий значительно упростить создание внешних компонент 1С (технология COM)
- Это генератор проекта внешней компоненты, позволяющий получить готовый проект за несколько секунд. Остается только добавлять свойства и методы своей компоненты с помощью визуального редактора. Все идентификаторы, имена, интерфейсы уже прописаны генератором проекта.
Почему до сих пор создавать по технологии COM
- Эта технология дает возможность написания универсальной компоненты, которая будет работать для всех версий 1С:Предприятия под windows 7.7/8.0/8.1/8.2/8.3
- Многие старые компоненты написаны по этой технологии. Для создания их современной замены без изменения конфигурации 1С необходимо использовать именно эту технологию.
- Например, для подключения новых видов торгового оборудования к типовым программам, лишенным теперь внешних обработок обслуживания оборудования.
- Технология хорошо документирована и проверена временем.
Почему DELPHI
- Относительно невысокая стоимость самой среды разработки.
- Обилие в сети бесплатных или дешевых компонент для работы с чем угодно.
- Наименьшее время разработки.
- Многие программисты 1С перешли с паскаля и им достаточно просто освоить DELPHI.
Почему мой проект, ведь полно в сети различных проектов на эту тему в том числе, бесплатных
- Включены все исходные коды.
- Готовый проект внешней компоненты 1С можно получить за несколько секунд, не разбираясь в том, как там что устроено.
- Экспортируются и используются все документированные 1С интерфейсы.
- Свойства и методы внешней компоненты можно добавлять визуально, как объекты обычной коллекции.
- Подробная документация
Начало работы
Содержимое архива
- 1C_ADDIN_HELPER. Компонент для DELPHI. Его надо установить. Инструкция ниже.
- 1C_ADDIN_ProjectCreator. Генератор проекта внешней компоненты. Инструкция ниже.
- 1C_ADDIN_DEMO. Демо-проект внешней компоненты, сделанный по данной технологии. Также включены обработки 1С 7.7 и 1С 8.2 для проверки работы компоненты. Инструкция ниже.
ШАГ 1. Установка компонента DELPHI
- Запускаем DELPHI
- Открываем Addin1cHelp.dpk из папки 1C_ADDIN_HELPER
DELPHI 6 |
DELPHI XE3 |
Жмем Install
|
Жмем Install
|
Получаем сообщение, что все спешно
|
Получаем сообщение, что все спешно
|
Добавляем путь к папке1C_ADDIN_HELPER в библиотеку DELPHI. Меню: Tools – Environment options - Library path
ADD-OK-OK |
Добавляем путь к папке1C_ADDIN_HELPER в библиотеку DELPHI. Меню: Tools – options - Library –library path
ADD-OK-OK |
Компонент появляется в палитре DELPHI
|
Компонент появляется в палитре DELPHI
|
Данный шаг необходимо выполнить один раз.
ШАГ 2. Генерация проекта внешней компоненты.
- Запускаем PrCreator.exe из папки 1C_ADDIN_ProjectCreator
-
- Указываем:
-
- Путь к папке, в которой будет создан проект внешней компоненты
- Имя библиотеки внешней компоненты (имя dll-ки)
- Имя объекта внешней компоненты. Т.е имя, под которым ее объект можно будет создавать в 1С с помощью функций Новый() или СоздатьОбъект().
- Если у компоненты должна быть страница свойств, ставим галочку «Нужна страница свойств».
- Нажимаем большую кнопку «Создать». В указанной папке появляется DELPHI-проект внешней компоненты 1С с указанными параметрами.
- Его можно открывать в DELPHI.
ШАГ 3. Как добавлять функционал внешней компоненты.
- Весь функционал компоненты реализуется в модуле Un_DM_List.pas, основной объект которого унаследован от TDataModule. Это дает возможность простого использования компонентов из палитры компонент DELPHI.
- Добавление свойств и методов внешней компоненты осуществляется через коллекции (T1CMethCollection) и (T1CPropCollection) объекта AddinFPList уже добавленного в проект генератором проектов.
- Чтобы добавить свойство внешней компоненты 1С, щелкаем по (T1CPropCollection)
Добавляем элемент в коллекцию и прописываем его свойства:
-
- Английское название
- Русское название
- Признак «IsReadOnly» запрещает 1С записывать в это свойство что либо.
Описываем события у нашего свойства:
-
- OnGet
procedure TDM_List.AddinFPListProps0Get(var OldValue: OleVariant); begin
end; |
Это событие возникает, когда 1С пытается прочитать что либо из данного свойства. Прочитает она ровно то, что мы передадим в параметр OldValue. Тип OleVariant позволяет передавать строки, числа, даты, а также более сложные структуры, поддерживаемые 1С.
-
- OnSet
procedure TDM_List.AddinFPListProps0Set(var NewValue: OleVariant); begin
end; |
Это событие возникает, когда 1С пытается записать что либо в данное свойство. Значение, которое 1С хочет записать, содержится в переменной NewValue. Мы можем обработать его, как хотим. Например, сохранить в одном из свойств нашего объекта. Тип OleVariant может быть преобразован в строку, число, или дату явным присваиванием. Компилятор DELPHI в этом случае берет работу по преобразованию типов на себя.
- Чтобы добавить метод внешней компоненты 1С, щелкаем по (T1CMethCollection)
Добавляем элемент в коллекцию и прописываем его свойства:
-
- Английское название
- Русское название
- Количество параметров
- Признак «IsFunction» сообщит 1С, что этот метод может возвращать значения.
Описываем событие у нашего метода:
-
- OnExecute
procedure TDM_List.AddinFPListMethods0Execute(var Params: PSafeArray; var : OleVariant); begin
end; |
В переменную Params 1C передает параметры метода. Получить их можно, используя функцию GetNParam , добавленную в проект генератором. Эта функция имеет два параметра. В первый передается массив Params, во второй – номер параметра, который мы хотим получить. Нумерация параметров с нуля!
Var Param1:String; ………………. Param1:=GetNParam(Params,0); //Получаем первый параметр из массива |
Можно также записать в Params значение некоторого параметра. Тогда 1С получит это значение после вызова метода (параметры передаются по ссылке). Для этого можно использовать функцию PutNParam, также имеющуюся в проекте. Онаимеет три параметра. В первый передается массив Params, во второй – номер устанавливаемого параметра, в третий – значение, которое мы хотим передать. Нумерация параметров с нуля!
Var Param1:String; ………………. PutNParam(Params,0,Param1); //Установим значение первого параметра для 1С |
Ну и в случае, если наш метод может возвращать значения, можно передать возвращаемое значение в переменную Ret. Тип OleVariant позволяет передавать строки, числа, даты, а также более сложные структуры, поддерживаемые 1С.
Ret:='Тест'; //Передаем строковое значение в качестве результата работы метода |
Дополнительные возможности
- Объект DM_List экспортрует стандартные интерфейсы 1С:
- _pEvent : IAsyncEvent;{Генерация внешних событий в 1С }
- _pErrorLog : IErrorLog;{Запись в окно сообщений 1С}
- _pProfile : IPropertyProfile;{Хранение параметров компоненты}
- _pStatusLine : IStatusLine;{Запись в строку состояния 1С}
Ими можно пользоваться в соответствии с их стандартным 1С-ким описанием. В поставляемом демо-проекте есть пример их использования.
-
- ВАЖНО: 1С-8 не реализует возможности интерфейса ExtWndSupport. Поэтому генератор проекта не добавляет экспорт этого интерфейса в проект. Вы можете сделать это самостоятельно в методе Init, описанном в AddInObj.pas.
- Опционально генератор проекта может добавить в проект страницу свойств компоненты.
Обмен данными между объектом компоненты и страницей свойств осуществляется через унаследованный интерфейс IPropertyLink. В модуле страницы свойств описаны два метода:
-
- UpdatePropertyPage. Запрашивает свойства из объекта и отображает их на форме страницы свойств.
- Вызывается метод get_Config объекта DM_List, описанный в модуле Un_DM_List.pas
- Передается структура TConfig, описанная в проекте в модуле AddInLib.pas . По сути это запись (RECORD).
- Что нужно сделать для того, чтобы добавить какой-либо параметр для передачи из компоненты в страницу свойств:
- Добавить элемент в структуру TRecord
- В методе get_Config объекта DM_List прописать его заполнение.
- В методе UpdatePropertyPage страницы свойств прописать его отображение на форме.
- UpdateObject. Передает свойства со страницы свойств в объект компоненты.
- Вызывается метод put_Config объекта DM_List, описанный в модуле Un_DM_List.pas
- Передается та же структура TConfig.
- Что нужно сделать для того, чтобы добавить какой-либо параметр для передачи со страницы свойств в компоненту:
- В методе UpdateObject страницы свойств прописать заполнение элемента структуры CFG по данным формы.
- В методе put_Config объекта DM_List прописать реакцию на изменение настройки со стороны страницы свойств.
- UpdatePropertyPage. Запрашивает свойства из объекта и отображает их на форме страницы свойств.
- В проекте реализована работа с профилем настроек внешних компонент 1С (pProfile).
- Методы LoadProps() и SaveProps() объекта DM_List.
- Данные методы вызываются автоматически при создании и уничтожении объекта, соответственно
- Описано сохранение/восстановление значения _enabled (компонента включена).
- Вы можете расширять количество сохраняемых значений.
- Методы LoadProps() и SaveProps() объекта DM_List.
Полезные знания
- Для того, чтобы в 1С-8 компоненту можно было подключать по имени объекта, т.е писать ПодключитьВнешнююКомпоненту(«Addin.MyObj»), файл внешней компоненты надо зарегистрировать в реестре с помощью команды regsvr32. В проекте, создаваемом генератором, добавлен командный файл Register.cmd, выполняющий это действие.
- Сложности могут возникнуть с передачей типа БУЛЕВО между 1С и внешней компонентой. 1С 7.7 такого типа вообще не знает. 1С-8 передает его в COM-компоненты в странном виде.
Описание демо-проекта, включенного в поставку
- Демо-проект создан генератором проектов.
- После этого в него добавлены следующие свойства и методы:
- Метод «ПриветМир»
- Имеет два параметра. Первый читает, второй возвращает.
- Демонстрирует работу со строкой состояния в 1С (pStatusLine).
- Демонстрирует работу с окном сообщений в 1С (pErrorLog)
- Метод «ВернутьТест»
- Параметров не имеет
- Возвращает значение «Тест»
- Метод «Внешнее событие»
- Не имеет параметров и ничего не возвращает.
- Запускает таймер, по которому через 1 секунду в 1С вызывается внешнее событие. Демонстрирует работу pEvent.
- Почему по таймеру: 1С 7.7 не получит внешнее событие, если в ней в этот момент выполняется код. Поэтому, если отправить внешнее событие из метода внешней компоненты, 1С его не получит, т.к. в этот момент она исполняет метод внешней компоненты. 1С-8 лишена этого недостаткаJ.
- Свойство «МоеСвойство»
- Демонстрирует установку из 1С свойства объекта и считывание его обратно.
- Метод «ПриветМир»
- В папке демо-проекта находятся также внешние обработки для 1С 7.7 и 8.2, демонстрирующие работу демо-компоненты.