Технология создания внешних компонент для "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 – при очищении очереди произошла ошибка
Возможны другие коды возврата, сигнализирующие об ошибке.
Очищает очередь событий, удаляя все присутствующие в очереди события.
Во время работы во внешней компоненте могут срабатывать определенные события, которые не зависят от 1С. Обработка таких событий осуществляется на стороне 1С в предопределенной процедуре формы или модуля приложения. В первом параметре процедуры передается параметр «Источник», он всегда равен: «MediaBuild» и говорит о том, что событие пришло от ВК. Вторым параметром идет тип события «Событие[Число]» (тип Строка обязателен), которые отвечает на вопрос, а что это за событие и от какой камеры оно пришло. И, наконец, третьим параметром идет параметр «Данные» (тип Строка не обязателен). Он хранит данные, которые может передать ВК.
Для того, чтобы можно было принимать события от ВК в открытой форме определите встроенное событие формы ВнешнееСобытие:
Обработчик внешнего события
Описание. Обработчик внешнего события используется для работы с объектами автоматизации, поддерживающими внешние события. Например, это могут быть драйвера каких-либо устройств. Обработчик вызывается внешним приложением.
Программа поддерживает события следующих видов :
В зависимости от вида события, его включение и порядок обработки различается .
События от внешних компонент 1С.
Если это внешняя компонента программы 1С, то для того чтобы внешние событие вызывалось, необходимо просто создать объект (с помощью функции СОЗДАТЬ_ОБЪЕКТ ). Вызов событий прекращается при завершении работы с объектом (с помощью ЗАКРЫТЬ или при завершении работы алгоритма). Чтобы события вызывались всё время работы программы надо использовать глобальные переменные. Например, можно в обработчике при старте программы инициализировать глобальную переменную типа ОБЪЕКТ , представляющую драйвер устройства:
ГЛОБАЛ ПЕРЕМ ОБЪЕКТ : ДрайверККМ
ФУНКЦИЯ ЖУРНАЛ ( накладные_доп ) ЛОГИКА : Стартовать
// Выполняем необходимые действия при старте программы
СТАТУС ( "Загрузка драйвера ККМ. " )
ДрайверККМ = СОЗДАТЬ_ОБЪЕКТ ( "Addin.SharpDriver" , "SharpDrv.dll" )
В этом случае события будут вызываться до окончания работы с программой.
При срабатывании внешнего события вызывается обработчик. В него передаются три параметра источник , событие и данные . Все они инициализируются внешним приложением, поэтому содержание этих параметров надо смотреть в документации к этому приложению или драйверу.
Также в обработчик также передается параметр редактор логического типа. Если он истинен, значит, пользователь редактирует запись этого журнала. В этом случае поля объекта ЖУРНАЛ , для которого вызывается обработчик, будут инициализированы полями редактируемой записи и для обработчика будет действовать логика работы обработчиков в диалоге.
Если параметр редактор = НЕТ , поля объекта инициализированы значениями по умолчанию.
ФУНКЦИЯ ЖУРНАЛ ( накладные_доп ) ВнешнееСобытие ( СТРОКА : источник, событие, данные;
// Обрабатываем внешнее событие от драйвера устройства
ЕСЛИ источник = "ДрайверККМ" ТО
ДрайверККМ. CommandID = данные
КодОшибки = ДрайверККМ. GetCommandParams ()
ЕСЛИ КодОшибки = 0 ТО
// Обработка события, например, добавление новой операции
// в журнал накладные
1) Внешние события срабатывают только в случае, если программа не выполняет какой-либо расчет.
2) Обработчик не срабатывает в случае, если вызвана функция ЗАПРОС_ВНЕШНЕГО_СОБЫТИЯ .
Для запуска COM-событий необходимо создать объект (с помощью функции СОЗДАТЬ_ОБЪЕКТ ) и включить обработку событий методом ВКЛ_СОБЫТИЕ . В остальном COM-события работают так же, как и события от внешних компонент 1С. А именно. Вызов событий прекращается при завершении работы с объектом (с помощью ЗАКРЫТЬ или при завершении работы алгоритма). Чтобы события вызывались всё время работы программы надо использовать глобальные переменные. Также глобальные переменные используются при получении параметров внешних событий. Например, можно в обработчике при старте программы инициализировать глобальную переменную и включить обработку событий :
ГЛОБАЛ ПЕРЕМ ОБЪЕКТ: TAPI
ГЛОБАЛ ПЕРЕМ ЧИСЛО: TAPI_EVENT_TYPE
ГЛОБАЛ ПЕРЕМ ОБЪЕКТ: TAPI_EVENT_PARAM
ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ЛОГИКА : Стартовать
// Выполняем необходимые действия при старте программы
СТАТУС ( "Инициализация TAPI. " )
ПЕРЕМ ОБЪЕКТ: addresses_coll, address
TAPI = СОЗДАТЬ_ОБЪЕКТ ( "TAPI.TAPI.1" )
TAPI.Initialize()
// Включаем события. При срабатывании будут заполнятся переменные TAPI_EVENT_TYPE и TAPI_EVENT_PARAM
TAPI. ВКЛ_СОБЫТИЕ ( "" : ДА : 1: "INT,DISPATCH" , TAPI_EVENT_TYPE, TAPI_EVENT_PARAM)
ЦИКЛ ДЛЯ (i = 2, addresses_coll.Count)
// Будем отслеживать внутренние телефоны 13 и 17
ЕСЛИ address.QueryMediaType(TAPIMEDIATYPE_AUDIO) И address.DialableAddress ИЗ [ "13" , "17" ] ТО
TAPI.RegisterCallNotifications(address, ДА, ДА, $00000008
В этом случае события будут вызываться до окончания работы с программой.
При срабатывании внешнего события вызывается обработчик. В него передается параметр источник . Он содержит ГУИД класса, который при включении события был передан в метод ВКЛ_СОБЫТИЕ. Для доступа к параметрам события используются глобальные переменные, которые были переданы в ВКЛ_СОБЫТИЕ .
ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ВнешнееСобытие ( СТРОКА : источник, событие)
ПЕРЕМ ОБЪЕКТ: call, address
ЕСЛИ call.CallState = CS_INPROGRESS ТО
ОТЛАДКА (address.DialableAddress + ": Сняли трубку" );
ИНАЧЕ_ЕСЛИ call.CallState = CS_CONNECTED ТО
ОТЛАДКА (address.DialableAddress + ": Соединились с " + call.CallInfoString[CIS_CONNECTEDIDNUMBER]);
ИНАЧЕ_ЕСЛИ call.CallState = CS_DISCONNECTED ТО
ОТЛАДКА (address.DialableAddress + ": Положили трубку" );
ИНАЧЕ_ЕСЛИ call.CallState = CS_OFFERING ТО
ОТЛАДКА (address.DialableAddress + ": Вам звонит " + call.CallInfoString[CIS_CALLERIDNUMBER]);
1) Внешние события срабатывают только в случае, если программа не выполняет какой-либо расчет.
2) Обработчик не срабатывает в случае, если вызвана функция ЗАПРОС_ВНЕШНЕГО_СОБЫТИЯ .
События от потокового серверного сокета.
После вызова функции СЕРВЕР_ПОДКЛЮЧИТЬ данные, отправляемые серверным сокетом программа сможет получать с помощью обработчика внешнего события . Вызов событий прекращается после отключения от серверного сокета. Это делается с помощью той же функции СЕРВЕР_ПОДКЛЮЧИТЬ при передаче пустой строки вместо имени сервера.
Подключиться к серверному сокету можно, например, в обработчике при старте программы:
ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ЛОГИКА : Стартовать
// Выполняем необходимые действия при старте программы
При отправке сервером данных вызывается обработчик. В него передается параметр источник равный "TCPClient" . Параметр событие равен адресу сервера, а параметр данные содержит передаваемые данные (для разбивки данных на фрагменты необходимо указывать разделитель, см. описание функции СЕРВЕР_ПОДКЛЮЧИТЬ ).
ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ВнешнееСобытие ( СТРОКА : источник, событие, данные)
ЕСЛИ источник = " TCPClient " ТО
ОТЛАДКА (событие, данные)
События от HID-устройства.
После вызова функции ВКЛ_СОБЫТИЯ_КЛАВИАТУРЫ нажатия на клавиши от заданного HID-устройства перестают приходить в программу и вместо этого начинает срабатывать обработчик внешнего события.
Включить перенаправление можно, например, в обработчике при старте программы:
Примером использования данной функции является работа со сканером, работающим в режиме эмуляции клавиатуры (PS/2). Такой сканер эмулирует нажатия клавиш на клавиатуре, но после вызова функции ВКЛ_СОБЫТИЯ_КЛАВИАТУРЫ вместо нажатий клавиш будет вызываться обработчик внешнего события (более детально см. описание этой функции).
ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ЛОГИКА : Стартовать
// Выполняем необходимые действия при старте программы
Обработчик внешнего события срабатывает не при каждом поступлении сигнала о нажатой клавиши, а только после нажатия на клавишу возврата каретки. Встретив клавишу возврата каретки программа отправляет в обработчик строку из всех нажатых клавиш в параметре данные , источник будет равен "HID", а событие содержит название устройства.
ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ВнешнееСобытие ( СТРОКА : источник, событие, данные)
ЕСЛИ источник = "HID" ТО
ОТЛАДКА (событие, данные)
Отправка событий из программы
С помощью функции ПОСЛАТЬ_СОБЫТИЕ можно инициировать вызов обработчика внешнего события. Возможен отложенный вызов, когда событие срабатывает через определенное время.
С помощью функции УДАЛИТЬ_СОБЫТИЯ можно удалить все ранее посланные события (посланные, но не выполненные).
Сообщения о действиях пользователей в центре уведомлений Windows
С помощью функции ПОСЛАТЬ_УВЕДОМЛЕНИЕ можно создать уведомление в Центре уведомлений Windows (начиная с Windows 10 и в усеченном виде в Windows 8) . Некоторые из этих уведомлений могут содержать элементы управления (кнопки, меню и т.д.). Пользователь, совершая действия, например нажимая кнопку на уведомлении, будет инициировать вызов обработчика внешнего события (если программа в этот момент еще работает). В него передается параметр источник равный "Toast" . Параметр событие равен идентификатору события, а параметр данные содержит передаваемые данные ( они задаются при создании события ).
ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ВнешнееСобытие ( СТРОКА : источник, событие, данные)