Технология создания внешних компонент для "1С:Предприятие 8. Расширение для карманных компьютеров" позволяет расширить возможности "Расширения для карманных компьютеров" за счет использования внешних программ, реализующих те или иные возможности. Например, таким образом может быть организована работа с различным оборудованием, в частности, со сканерами штрих-кодов. При этом такие программы должны быть реализованы с соблюдением ряда требований, описанных ниже.
Встроенный язык "1С:Предприятие 8. Расширение для карманных компьютеров" включает методы и события для работы со внешними компонентами, описание которых приводится ниже.
Метод глобального контекста. Загружает внешнюю компоненту, создает соответствующие COM-объекты и подключает их к платформе исполнения мобильных приложений.
Тип: строка. Имя файла внешней компоненты. должно иметь вид “Имя.Расширение”. Имя файла может содержать полный путь к нему. Если путь не указан, платформа исполнения мобильный приложений осуществляет поиск компоненты в следующей последовательности: каталог ИБ, каталог исполняемых файлов платформы, каталог ОС.
Код возврата от загрузки компоненты. 0 – означет нормальную загрузку, остальное – системные коды ошибки.
Внешние компоненты загружаются функцией встроенного языка ЗагрузитьВнешнююКомпоненту. Файл внешней компоненты должен быть динамически загружаемой библиотекой (например, DLL или OCX), то есть работать как InProc сервер.
При загрузке внешней компоненты "1С:Предприятие 8. Расширение для карманных компьютеров" вызывает функцию DllRegisterServer, если она экспортирована из внешней компоненты. Это позволяет просто переносить компоненты между компьютерами без дополнительной регистрации их как COM-серверов. О создании COM-объекта внешней компоненты при загрузке — см. Разработка внешней компоненты.
Создает COM-объекты внешней компоненты и подключает их к платформе исполнения мобильных приложений.
ProgID (Programmatic Identifier) объекта внешней компоненты. должно соответствовать информации, находящейся в регистрационной базе данных системы (Registry).
Код возврата от загрузки компоненты. 0 – означет нормальную загрузку, остальное – системные коды ошибки.
Внешние компоненты подключаются функцией встроенного языка ПодключитьВнешнююКомпоненту. Внешняя компонента может быть как динамически загружаемой библиотекой (например, DLL или OCX), так и приложением.
Предопределенная процедура встроенного языка. Вызывается при возникновении сообщения от внешней компоненты.
Тип: строка. Наименование источника сообщения.
Тип: строка. Наименование сообщения.
Тип: строка. Параметры сообщения.
Процедура ОбработкаВнешнегоСобытия — предопределенная процедура обработки сообщений от внешних компонент.
Процедура может быть описана в модуле приложения. При получении сообщения будут вызваны обработчики внешнего события, определенные в модулях всех открытых на этот момент форм, включая цепочку всех открытых модально форм. После этого будет вызвана процедура ОбработкаВнешнегоСобытия, определенная в модуле приложения.
Процедура обработки внешнего события во встроенном языке. Вызывается при возникновении сообщения от внешней компоненты.
Тип: строка. Наименование источника сообщения.
Тип: строка. Наименование сообщения.
Тип: строка. Параметры сообщения.
Процедура может быть описана в модуле любой формы. При получении сообщения от внешней компоненты будет вызвана процедура ВнешнееСобытие, определенная в модулях открытых на этот момент форм. После обработки внешнего события в формах будет вызвана предопределенная процедура ОбработкаВнешнегоСобытия, определенная в модуле приложения. Процедура ОбработкаВнешнегоСобытия в модуле приложения всегда вызывается последней.
При загрузке внешней компоненты функцией ЗагрузитьВнешнююКомпоненту "1С:Предприятие 8. Расширение для карманных компьютеров" определяет ProgID COM—объекта компоненты следующим образом:
- ProgID имеет вид . ;
- в качестве первой части ( ) используется строка “AddIn”;
- в качестве второй части ( ) используется строка с ID 100 из таблицы строк компоненты. Cтрока может иметь вид “Name1|Name2|. |NameN”, и в этом случае будут созданы все объекты с ProgID вида “AddIn.NameX”. Если такая строка отсутствует, то используется имя файла внешней компоненты без расширения.
При использовании функции ПодключитьВнешнююКомпоненту ProgID COM-объекта компоненты передается в качестве параметра функции и также может представляться строкой вида ProgID1| ProgID2|. |ProgIDX.
Инициализация и выгрузка компоненты
Для инициализации и выгрузки компоненты используется интерфейс IInitDone. Этот интерфейс наследован от IUnknown и предназначен для инициализации объекта и завершения работы с объектом.
HRESULT Init(IDispatch *pBackConnection)
Тип: IDispatch. Указатель на интерфейс платформы исполнения мобильных приложений.
E_FAIL — при инициализации произошла ошибка
S_OK — инициализация прошла успешно
При загрузке платформа инициализирует объект компоненты, вызывая метод Init и передавая указатель на IDispatch. Объект может сохранить этот указатель для дальнейшего использования. Все остальные интерфейсы объект может получить, вызвав метод QueryInterface переданного ему интерфейса IDispatch. Объект должен возвратить S_OK, если инициализация прошла успешно, и E_FAIL при возникновении ошибки.
S_OK — объект завершил работу
Платформа исполнения мобильных приложений вызывает этот метод при завершении работы с объектом компоненты. Объект должен возвратить S_OK. Этот метод вызывается независимо от результата инициализации объекта (метод Init).
HRESULT GetInfo(SAFEARRAY **pInfo)
PInfo
Тип: SAFEARRAY**. Двойной указатель на массив структур VARIANT. Память для массива выделяется платформой.
S_OK — информация о компоненте возвращена
Платформа вызывает этот метод для получения информации о компоненте. В текущей версии компонентной технологии в элемент с индексом 0 необходимо записать версию поддерживаемой компонентной технологии в формате V_I4 — целого числа, при этом старший номер версии записывается в тысячные разряды, младший номер версии — в единицы. Например: версия 3.56 — число 3560. В настоящее время все объекты внешних компонент могут поддерживать версию 1.0 (соответствует числу 1000). Память для pInfo выделяется платформой. Метод должен возвращать S_OK.
Объект внешней компоненты обязан реализовать этот интерфейс. При его отсутствии компонента не будет загружена.
Для расширения встроенного языка компонента должна реализовать интерфейс ILanguageExtender. Этот интерфейс унаследован от IUnknown и предназначен для расширения встроенного языка "1С:Предприятие 8. Расширение для карманных компьютеров". Для использования этого расширения необходимо вызвать функцию Новый, передав ей строку вида “AddIn. ”, где возвращается методом этого интерфейса Затем можно использовать созданный объект, вызывая его методы и свойства.
HRESULT RegisterExtensionAs(BSTR *pExtensionName)
Тип: BSTR*. Наименование расширения встроенного языка "1С:Предприятие 8. Расширение для карманных компьютеров".
В переменную pExtensionName помещается наименование расширения (вторая часть имени объекта). Память для строки выделяется объектом компоненты стандартными системными функциями для работы с COM—строками (например, SysAllocString. Платформа освобождает эту память вызовом SysFreeString).
Первое свойство имеет порядковый номер 0.
HRESULT GetNProps(long *plProps)
Тип: long*. Указатель на переменную, содержащую при возврате количество свойств расширения.
Возвращает количество свойств данного расширения, 0 – при отсутствии свойств. Память для переменной plProps выделяется платформой.
HRESULT FindProp(BSTR pszPropName,long*plPropNum)
Тип: BSTR. Наименование свойства.
Тип: long*. Указатель на переменную, содержащую при возврате порядковый номер свойства.
S_OK — операция завершена успешно
S_FALSE — свойство с именем pszPropName в данном расширении отсутствует
Возвращает порядковый номер свойства с именем pszPropName; -1, если свойство не найдено. Память для переменной plPropNum выделяется платформой.
HRESULT GetPropName(long lPropNum,long lAliasNum,BSTR *pPropName)
Тип: long. Порядковый номер свойства.
Тип: long. Язык наименования:
0 — английское наименование;
1 — локальное наименование.
Тип: BSTR*. Указатель на строку, содержащую при возврате наименование свойства.
S_OK — операция завершена успешно
S_FALSE — свойство с номером lPropNum в данном расширении отсутствует
В переменную pPropName помещается имя свойства с порядковым номером lPropNum; если свойство с таким номером отсутствует, в pPropName помещается пустая строка. Память для строки выделяется объектом компоненты стандартными системными функциями для работы с COM—строками (например, SysAllocString. Платформа освобождает эту память вызовом SysFreeString).
HRESULT GetPropVal(long lPropNum,VARIANT *pvPropVal)
Тип: long. Порядковый номер свойства.
Тип: VARIANT*. Указатель на структуру VARIANT, содержащую при возврате значение свойства.
S_OK — операция завершена успешно
S_FALSE — свойство с номером lPropNum в данном расширении отсутствует или недоступно для чтения.
В переменную pvPropVal помещается значение свойства с порядковым номером lPropNum; если свойство с таким номером отсутствует или недоступно для чтения, должен иметь тип VT_EMPTY.
HRESULT SetPropVal(long lPropNum, VARIANT *pvPropVal)
Тип: long. Порядковый номер свойства.
Тип: VARIANT*. Структура VARIANT, содержащая новое значение свойства.
S_OK — операция завершена успешно
S_FALSE — свойство с номером lPropNum в данном расширении отсутствует или недоступно для записи.
Переменная pvPropVal содержит значение свойства с порядковым номером lPropNum; если свойство с таким номером отсутствует, недоступно для чтения или тип переданного pvPropVal не приводится к необходимому, метод должен возвратить S_FALSE.
HRESULT IsPropReadable(long lPropNum, BOOL *pboolPropReadable)
Тип: long. Порядковый номер свойства.
Тип: BOOL*. Указатель на переменную, содержащую при возврате флаг возможности чтения свойства.
S_OK — операция завершена успешно.
S_FALSE — свойство с номером lPropNum в данном расширении отсутствует.
В переменную pboolPropReadable помещается флаг возможности чтения свойства с порядковым номером lPropNum: FALSE(0) — свойство недоступно для чтения, TRUE(1) — свойство допускает чтение. Если свойство с таким номером отсутствует, метод должен возвращать S_FALSE.
HRESULT IsPropWritable(long lPropNum, BOOL *pboolPropWritable)
Тип: long. Порядковый номер свойства.
Тип: BOOL*. Указатель на переменную, содержащую при возврате флаг возможности записи свойства.
S_OK — операция завершена успешно.
S_FALSE — свойство с номером в данном расширении отсутствует.
В переменную pboolPropWritable помещается флаг возможности записи свойства с порядковым номером lPropNum: FALSE(0) — свойство недоступно для записи, TRUE(1) — свойство допускает запись. Если свойство с таким номером отсутствует, метод должен возвращать S_FALSE.
Первый метод имеет порядковый номер 0. Первый параметр метода имеет порядковый номер 0.
HRESULT GetNMethods(long *plMethods)
Тип: long*. Указатель на переменную, содержащую при возврате количество методов расширения языка.
В переменную plMethods помещается количество методов данного расширения, 0 — при отсутствии методов.
HRESULT FindMethod(BSTR bstrMethodName,long *plMethNum)
Тип: BSTR. Имя метода
Тип: long*. Указатель на переменную, содержащую при возврате порядковый номер метода с именем methodName.
В переменную plMethNum помещается порядковый номер метода с именем bstrMethodName; -1 — при отсутствии метода.
HRESULT GetMethodName(long lMethodNum, long lAliasNum, BSTR *pbstrMethName)
Тип: long. Порядковый номер метода.
Тип: long. Язык имени метода:
0 — английское наименование;
1 — локальное наименование.
Тип: BSTR*. Указатель на строку, содержащую при возврате имя метода.
S_OK — операция завершена успешно
S_FALSE — метод с номером в данном расширении отсутствует
В переменную помещается имя свойства с порядковым номером; если свойство с таким номером отсутствует, в помещается пустая строка. Память для строки выделяется объектом компоненты стандартными системными функциями для работы с COM—строками (например, SysAllocString. Платформа освобождает эту память вызовом SysFreeString).
HRESULT GetNParams(long lMethodNum, long *plMethParams)
Тип: long. Порядковый номер метода.
Тип: long*. Указатель на переменную, содержащую при возврате количество параметров метода.
S_OK — операция завершена успешно
S_FALSE — метод с номером в данном расширении отсутствует
В переменную plMethParams помещается количество параметров метода с порядковым номером lMethodNum; если свойство с таким номером отсутствует или не имеет параметров, в помещается 0. Память для переменной выделяется платформой.
HRESULT GetParamDefValue(long lMethodNum, long lParamNum, VARIANT *pvParamDefVal)
Тип: long. Порядковый номер метода.
Тип: long. Порядковый номер параметра.
Тип: VARIANT*. Указатель на структуру VARIANT, содержащую при возврате значение параметра по умолчанию.
S_OK — операция завершена успешно (вне зависимости от наличия у параметра значения по умолчанию)
S_FALSE — метод или параметр метода отсутствует
В переменную pvParamDefVal помещается значение по умолчанию параметра lParamNum метода с порядковым номером lMethodNum. В pvParamDefVal помещается тип VT_EMPTY, если метод с таким номером отсутствует, не имеет параметра с номером или параметр не имеет значения по умолчанию. Память для переменной выделяется платформой.
HRESULT HasRetVal(long lMethodNum,BOOL *pboolHasRetVal)
Тип: long. Порядковый номер метода.
Тип: BOOL*. Указатель на переменную, содержащую при возврате флаг наличия возвращаемого значения.
S_OK — операция завершена успешно
S_FALSE — метод отсутствует
В переменную pboolHasRetVal помещается флаг наличия возвращаемого значения у метода с порядковым номером lMethodNum: TRUE для методов с возвращаемым значением и FALSE в противном случае. Память для переменной выделяется платформой.
HRESULT CallAsProc(long lMethodNum, SAFEARRAY **pVars)
Тип: long. Порядковый номер метода.
Тип: SAFEARRAY**. Двойной указатель на массив структур VARIANT, содержащий значения параметров метода. Если метод не имеет параметров, то содержит NULL.
S_OK — соответствующий метод вызван, ошибок не произошло.
E_FAIL — соответствующий метод вызван, произошла ошибка времени исполнения (runtime error). Исполнение модуля прекращается.
S_FALSE – отсутствует метод, соответствующий переданному lMethodNum.
Выполняется метод с порядковым номером lMethodNum. Если метод возвращает E_FAIL, возникает ошибка времени выполнения и выполнение модуля. Память для массива параметров выделяется платформой.
HRESULT CallAsFunc(long lMethodNum, VARIANT *pRetValue, SAFEARRAY **pVars)
Тип: long. Порядковый номер метода.
Тип: VARIANT*. Указатель на структуру VARIANT, при возврате содержащую возвращаемое значение.
Тип: SAFEARRAY**. Двойной указатель на массив структур VARIANT, содержащий значения параметров метода. Если метод не имеет параметров, то содержит NULL.
S_OK — соответствующий метод вызван, ошибок не произошло.
E_FAIL — соответствующий метод вызван, произошла ошибка времени исполнения (runtime error). Исполнение модуля прекращается.
S_FALSE – отсутствует метод, соответствующий переданному lMethodNum.
Выполняется метод с порядковым номером lMethodNum. Если метод возвращает E_FAIL, возникает ошибка времени выполнения и выполнение модуля прекращается. Память для массива параметров и возвращаемого значения выделяется платформой.
Вызов функции компоненты
Соответствие между типами "1С:Предприятие 8. Расширение для карманных компьютеров" и COM:
- неопределенное значение соответствует VT_EMPTY;
- целочисленное значение соответствует VT_I4 и помещается в lVal;
- дробное значение соответствует VT_R8 и помещается в dblVal;
Следует учесть, что внутреннее представление может иметь точность, превосходящую точность типа double (около 15 цифр после запятой), поэтому при конвертации может происходить потеря точности.
значение даты соответствует VT_DATE и помещается в date;
строковое значение соответствует VT_BSTR и помещается в bstrVal;
Возвращение значений из компоненты
Соответствие между типами "1С:Предприятие 8. Расширение для карманных компьютеров" и COM:
- VT_EMPTY соответствует неопределенному значению. При передаче в качестве параметра метода подставляется значение параметра по умолчанию;
- значения типа VT_I2, VT_I4, VT_BOOL, VT_ERROR, VT_UI1 соответствуют целочисленному значению и находятся в lVal;
- значения типа VT_R4, VT_R8, VT_CY соответствуют дробному значению и находятся в dblVal;
- значение типа VT_DATE соответствует значению даты и находится в date;
- значение типа VT_BSTR соответствует строковому значению и находится в bstrVal;
- значение типа VT_ARRAY соответствует массиву и находится в parray;
- Типы VT_DECIMAL, VT_VARIANT, VT_DISPATCH и VT_UNKNOWN не поддерживаются.
При возникновении асинхронного события (например, считывания штрих-кода) объект может использовать интерфейс IAsyncEvent для создания внешнего события. Интерфейс IAsyncEvent унаследован от IUnknown. Все события помещаются в очередь и обрабатываются по порядку появления. Количество запоминаемых событий ограничено длиной очереди. При инициализации длина очереди устанавливается равной 1 и может быть изменена вызовами GetEventBufferDepth и SetEventBufferDepth. Для каждого объекта внешней компоненты поддерживается своя очередь событий. Обработка внешнего события производится предопределенной процедурой ОбработкаВнешнегоСобытия и обработчиками внешних событий в модулях форм.
HRESULT SetEventBufferDepth(long lDepth)
Тип: long. Длина очереди сообщений.
S_OK — размер очереди установлен успешно
E_FAIL — при установке размера очереди произошла ошибка
Возможны другие коды возврата, сигнализирующие об ошибке.
Устанавливает размер очереди событий для данного объекта. Если текущее количество событий в очереди больше устанавливаемой длины, последние события обрезаются.
HRESULT GetEventBufferDepth(long *plDepth)
Тип: long*. Указатель на переменную, содержащую при возврате длину очереди сообщений.
S_OK — размер очереди возвращен успешно
E_FAIL — при получении размера очереди произошла ошибка
Возможны другие коды возврата, сигнализирующие об ошибке.
В переменную plDepth помещается размер очереди событий для данного объекта.
HRESULT ExternalEvent(BSTR bstrWho, BSTR bstrWhat, BSTR bstrData)
Тип: BSTR. Строка с наименованием источника сообщения.
Тип: BSTR. Строка с наименованием сообщения.
Тип: BSTR. Строка c параметрами сообщения.
S_OK – событие помещено в очередь
E_FAIL – очередь переполнена или неизвестная ошибка
E_OUTOFMEMORY – отсутствие памяти
Возможны другие коды возврата, сигнализирующие об ошибке.
Помещает событие в очередь, записывая источник события, наименование и параметры события. При обработке события эти данные передаются процедуре ОбработкаВнешнегоСобытия . При вызове метода ExternalEvent дальнейшая обработка события происходит следующим образом: событие записывается в очередь событий (если очередь полностью занята, событие теряется), затем при отсутствии системных событий из очереди берется первое событие (если очередь не пуста) и запускается процесс обработки внешних событий. Этот процесс повторяется для всех объектов внешних компонент. Таким образом, обработка внешних событий синхронизируется с обработкой системных событий.
S_OK — очередь успешно очищена
E_FAIL – при очищении очереди произошла ошибка
Возможны другие коды возврата, сигнализирующие об ошибке.
Очищает очередь событий, удаляя все присутствующие в очереди события.
DimanYa
evgenyatam
DimanYa
evgenyatam
например так:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Не ВводДоступен() Тогда
Возврат; // если не в фокусе = игнорируем все
КонецЕсли;
Если Источник<>"Сканер штрихкода" Тогда
Возврат ; // игнорируем
КонецЕсли;
Если Событие <> "ПолученШтрихкод" тогда
Возврат ;
КонецЕсли;
Штрихкод = Данные;
Если Лев(Штрихкод,1)=Символы.ПС Тогда
Штрихкод=Сред(Штрихкод,2);
КонецЕсли;
СерийныйНомер = Штрихкод;
КонецПроцедуры // ВнешнееСобытие()
СерийныйНомер — атрибут формы.
DimanYa
evgenyatam спасибо ещё раз. Всё разобрался, всё работает. В регистр сведений заносится =)
И вот вопросит немного не по теме ТО.
В документе есть табличное поле. Первая колонка — ОТДЕЛ. Выбираем. И в зависимости от того, что выбрали, у нас в колонке ФАМИЛИЯ открывается соответствующая часть справочника сотрудники из уже выбранного нами группы в первой колонке.
Добавлено: Извиняюсь. Уже сам написал =)
Во время работы во внешней компоненте могут срабатывать определенные события, которые не зависят от 1С. Обработка таких событий осуществляется на стороне 1С в предопределенной процедуре формы или модуля приложения. В первом параметре процедуры передается параметр «Источник», он всегда равен: «MediaBuild» и говорит о том, что событие пришло от ВК. Вторым параметром идет тип события «Событие[Число]» (тип Строка обязателен), которые отвечает на вопрос, а что это за событие и от какой камеры оно пришло. И, наконец, третьим параметром идет параметр «Данные» (тип Строка не обязателен). Он хранит данные, которые может передать ВК.
Для того, чтобы можно было принимать события от ВК в открытой форме определите встроенное событие формы ВнешнееСобытие: