1с как вызвать внешнее событие

Обновлено: 07.07.2024

Обработчик внешнего события

Описание. Обработчик внешнего события используется для работы с объектами автоматизации, поддерживающими внешние события. Например, это могут быть драйвера каких-либо устройств. Обработчик вызывается внешним приложением.

Программа поддерживает события следующих видов :

В зависимости от вида события, его включение и порядок обработки различается .

События от внешних компонент 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 , 2);

В этом случае события будут вызываться до окончания работы с программой.

При срабатывании внешнего события вызывается обработчик. В него передается параметр источник . Он содержит ГУИД класса, который при включении события был передан в метод ВКЛ_СОБЫТИЕ. Для доступа к параметрам события используются глобальные переменные, которые были переданы в ВКЛ_СОБЫТИЕ .

ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ВнешнееСобытие ( СТРОКА : источник, событие)

ПЕРЕМ ОБЪЕКТ: 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 10 и в усеченном виде в Windows 8) . Некоторые из этих уведомлений могут содержать элементы управления (кнопки, меню и т.д.). Пользователь, совершая действия, например нажимая кнопку на уведомлении, будет инициировать вызов обработчика внешнего события (если программа в этот момент еще работает). В него передается параметр источник равный "Toast" . Параметр событие равен идентификатору события, а параметр данные содержит передаваемые данные ( они задаются при создании события ).

ФУНКЦИЯ ЖУРНАЛ ( клиенты ) ВнешнееСобытие ( СТРОКА : источник, событие, данные)

В компанию был куплен аппарат CipherLab RS30, ТСД на базе ОС Android 4.4.2 cо встроенным сканером штрихкода. Было решено разработать приложение для работы с этим чудом техники на базе Мобильной Платформы 1С. Для примера была взята конфигурация "Мобильная Касса", в которой была уже реализована работа со штрихсканером, с помощью внешних компонент (Стандартная от 1С, вторая от компании ScanCode).

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

Пришлось декомпилировать платформу, изучить весь внутренний код, но все попытки заканчивались неудачей. И вот настал день, когда надо было окончательно решить, каким способом организовать работу с этим аппаратом, и мы было уже отказались от идеи внешней компоненты и подумывали запустить всю систему через RDP, как, о чудо, после еще одной отчаянной попытки решение было найдено.

А теперь самое главное.

Ограничения: Данный способ подходит только для приложений, собранных с помощью Конфигурации "Сборщик мобильных приложений", также способ подразумевает небольшое вмешательство в исходные файлы мобильной платформы.

Дано:

1. CipherLab RS30

2. SDK для вашего сканера

3. Сборщик мобильных приложений

4. Сама мобильная платформа

5. Android Studio

А теперь начинается магия:

1. Распаковываем файлы платформы

2. Нас интересует Android\prjandroid-arm\bin\permissions.xml этот файл

Этот файл используется при сборке приложений и добавляет в AndroidManifest разрешения, которые указаны в конфигурации.

3. Нас интересует секция <LocalNotification>, которая добавляется, если установлена отметка Локальные Уведомления в требуемых разрешениях мобильного приложения. По умолчанию она выглядит так.

5. Дальше нам нужно добавить фильтр, который будет указывать, какое событие может принять наш receiver, его-то мы и будем передавать из нашей компоненты.

Теперь наша секция должна выглядеть так

6. Теперь запаковываем все обратно, наша мобильная платформа готова.

7. Дальше можно приступать и к разработке в 1С, создаем обработчик локальных уведомлений

Всем большое спасибо за внимание, надеюсь, эта информация будет кому-нибудь полезна.

В результате был написан внешний сервис, работающий в фоновом режиме, который получает штрихкод со сканера и передает его в 1С.

Читайте также: