К статье
Практический материал

Автоматизация · 13 мин

Внешнее событие в 1С: назначение, источники и обработка

Что такое внешнее событие в 1С, как оно поступает от сканеров, ККТ и весов, как обработать его в модуле формы и настроить оборудование без ошибок.

Внешнее событие в 1С — это механизм, через который прикладное решение получает сигналы от внешних по отношению к платформе источников: торгового оборудования (сканеров штрихкодов, фискальных регистраторов, терминалов сбора данных, весов), внешних компонент по технологии COM или Native API, а также программных вызовов через Оповестить(). В отличие от обычных событий формы, которые возникают при действиях пользователя внутри интерфейса, внешнее событие приходит «снаружи» и требует отдельной обработки.

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

Механизм существует как в обычных формах, так и в управляемых. В обычном приложении обработчик внешнего события располагается в модуле формы, в управляемом приложении — в модуле формы на клиенте либо в модуле управляемого приложения. Понимание того, откуда приходит событие и какие данные оно несёт, необходимо для корректной настройки торгового оборудования и диагностики сбоев.

Как устроен механизм внешних событий

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

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

В типовых конфигурациях (Управление торговлей, Розница, ERP) обработка внешних событий уже встроена в подсистему работы с оборудованием: формы подключаются к событиям через специальные процедуры, и разработчику остаётся только переопределить реакцию на конкретные типы данных. В самописных решениях обработчик придётся реализовать самостоятельно.

Источники внешних событий

На практике внешние события приходят из трёх групп источников. Первая группа — торговое оборудование, подключённое через драйверы: сканеры штрихкодов, терминалы сбора данных, электронные весы, фискальные регистраторы, дисплеи покупателя, эквайринговые терминалы. Драйвер устройства регистрируется в системе как COM-объект или внешняя компонента и генерирует события при срабатывании устройства.

Вторая группа — внешние компоненты, разработанные по технологии Native API или как COM-объекты. Они могут генерировать события по любой логике: например, компонента мониторинга файловой системы сигнализирует о появлении нового файла, а компонента интеграции с телефонией — о входящем звонке.

Третья группа — программный вызов Оповестить(ИмяСобытия, Параметр, Источник) внутри самой конфигурации. Формально это не «внешнее» событие по происхождению, но обрабатывается оно похожим образом — через обработчики оповещений и подписки на события форм. Этот способ используют для обмена данными между открытыми формами без жёстких ссылок друг на друга.

Сканер штрихкодовИсточник "BarCodeScanner" или драйвер

Проверьте, установлен ли драйвер и настроен ли суффикс/префикс сканирования

Вызов ОповеститьИсточник задан в коде

Найдите в конфигураторе все вызовы Оповестить с нужным именем события

Внешняя компонентаИмя компоненты из регистрации

Проверьте, загружена ли компонента методом ПодключитьВнешнююКомпоненту

Обработчик ВнешнееСобытие: параметры и пример кода

Обработчик внешнего события объявляется в модуле формы (для управляемых форм — с директивой &НаКлиенте) или в модуле приложения. Сигнатура процедуры фиксированная: три параметра — Источник, Событие, Данные. Платформа сама передаёт в них значения, задача разработчика — разобрать их и выполнить нужные действия.

Типовая структура обработчика выглядит так: сначала проверяется источник и имя события, затем данные преобразуются в нужный тип и передаются в прикладную логику. Ниже пример для формы документа «Чек ККМ», где по событию от сканера добавляется товар.

&НаКлиенте

Процедура ВнешнееСобытие(Источник, Событие, Данные)

Если Источник = "СканерШтрихкода" И Событие = "Штрихкод" Тогда

Штрихкод = СокрЛП(Данные);

ДобавитьТоварПоШтрихкоду(Штрихкод);

КонецЕсли;

КонецПроцедуры

В типовых конфигурациях на базе БСП и БПО (библиотека подключаемого оборудования) обработчик уже реализован: форма подписывается на события через механизмы библиотеки, а прикладному коду достаётся готовая структура с распознанным штрихкодом, весом или номером карты. Переопределять базовый обработчик напрямую в этом случае не нужно — используются предусмотренные точки расширения.

bsl
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
    Если Событие = "Штрихкод" Тогда
        ОбработатьШтрихкод(Данные);
    КонецЕсли;
КонецПроцедуры

Настройка сканера штрихкодов как источника событий

Наиболее частая практическая задача — подключить сканер штрихкодов так, чтобы считанные коды приходили в форму как внешние события. Существует два режима работы сканера: эмуляция клавиатуры и работа через драйвер. В режиме эмуляции клавиатуры сканер «печатает» штрихкод как обычный ввод с клавиатуры, и внешнего события не возникает — данные попадают в активное поле ввода. Это просто, но неудобно: фокус должен быть в нужном поле, иначе штрихкод попадёт не туда.

Режим с драйвером предпочтительнее для автоматизированных рабочих мест. Сканер настраивается в конфигурации как подключаемое оборудование (раздел «Подключаемое оборудование» в типовых решениях), драйвер перехватывает данные и генерирует внешнее событие независимо от того, где находится фокус. Форма получает штрихкод в обработчике и сама решает, что с ним делать.

Порядок подключения сканера через драйвер
  1. 1
    Установите драйвер сканера от поставщика оборудования и убедитесь, что устройство определяется системой
  2. 2
    В конфигурации откройте настройку подключаемого оборудования и добавьте новый сканер штрихкодов
  3. 3
    Выберите драйвер, укажите порт или идентификатор устройства, задайте префикс и суффикс при необходимости
  4. 4
    Откройте рабочее место (например, РМК) и отсканируйте тестовый штрихкод
  5. 5
    Проверьте, что товар добавился в документ без установки курсора в поле ввода

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

Отладка: почему событие не приходит

Типичная ситуация: оборудование подключено, но обработчик не срабатывает. Диагностику удобно строить от источника к обработчику. Сначала проверяется, что устройство физически работает и драйвер его видит — для этого у большинства драйверов есть тестовая форма или утилита проверки связи. Если тест драйвера проходит, а события в 1С нет, проблема в подписке на события или в обработчике.

Простой способ убедиться, что событие доходит до формы — временно поставить в начало обработчика вывод сообщения или точку останова и воспроизвести действие (отсканировать штрихкод). Если обработчик вызывается, но данные пустые или искажённые, причина обычно в настройках префиксов и суффиксов либо в несовпадении имени события с тем, что проверяется в коде.

Отдельный класс проблем — работа в терминальном режиме (RDP). Сканер, подключённый к локальному компьютеру, должен быть проброшен в терминальную сессию, а драйвер установлен на сервере. Часто события «теряются» именно потому, что драйвер стоит только на клиенте или проброс портов не настроен.

Контрольные точки

Как проверить цепочку события

Тест устройства в драйвере
Норма

Драйвер видит устройство и получает данные

Тревожный признак

Ошибка связи — проверяйте кабель, порт, установку драйвера

Вызов обработчика ВнешнееСобытие
Норма

Точка останова срабатывает при сканировании

Тревожный признак

Обработчик не вызывается — проверяйте подписку на события и режим сканера

Содержимое параметра Данные
Норма

Строка штрихкода без лишних символов

Тревожный признак

Пусто, обрезано или с мусором — настраивайте префиксы/суффиксы

Типичные ошибки при работе с внешними событиями

Опыт внедрений показывает, что большинство проблем с внешними событиями сводится к нескольким повторяющимся ошибкам. Их знание экономит часы отладки.

Типичные ошибки
01
Использование клавиатурного режима сканера вместо драйвера — штрихкоды попадают не в то поле и теряются при смене фокуса
02
Проверка в коде имени события, которое не совпадает с тем, что реально передаёт драйвер, — обработчик молча пропускает данные
03
Размещение обработчика ВнешнееСобытие на сервере (&НаСервере) — внешние события обрабатываются только на клиенте
04
Отсутствие обработки ситуации, когда штрихкод не найден в базе, — кассир не понимает, что сканирование прошло, но товар не добавлен
05
Изменение драйвера или его настроек без тестирования на копии — рабочее место перестаёт принимать оплату

Ещё одна распространённая ситуация — конфликт нескольких источников событий. Если к одному рабочему месту подключены сканер и терминал сбора данных, оба могут генерировать события с одинаковым именем. В обработчике нужно различать их по параметру Источник, иначе данные будут обрабатываться дважды или не по тем правилам.

Внешнее событие и Оповестить: в чём разница

Разработчики часто смешивают два механизма. Внешнее событие через обработчик ВнешнееСобытие предназначено прежде всего для сигналов от оборудования и компонент. Метод Оповестить — это шина сообщений между формами и кодом конфигурации: одна форма вызывает Оповестить("ЗакрытиеДокумента", Параметры), а другие формы, подписавшиеся через ОповещениеОЗакрытии или обработку оповещения, реагируют на это сообщение.

Выбирая механизм, исходите из источника: если сигнал инициирует устройство или внешняя компонента — это внешнее событие; если сигнал инициирует прикладной код для связи между формами — используйте Оповестить. Смешивать их без необходимости не стоит: это усложняет отладку и сопровождение.

Маршрут решения

Как выбрать механизм

Сигнал приходит от сканера, весов, ККТ или другого оборудованияИспользуйте внешнее событие и обработчик ВнешнееСобытие на клиенте
Нужно передать данные между открытыми формами конфигурацииИспользуйте Оповестить и обработку оповещения в целевой форме
Событие генерирует внешняя компонента Native API или COMПодключите компоненту и обрабатывайте её события как внешние
Нужна реакция на системные события платформы (запись, открытие)Используйте стандартные события формы и объекта, а не внешние

Ограничения механизма

Внешние события обрабатываются только на клиенте: серверный код напрямую их получить не может. Если результат события нужно сохранить или обработать на сервере, клиентский обработчик вызывает серверную процедуру уже после получения данных. Это важно учитывать при проектировании: нельзя построить логику, где сервер сам «слушает» сканер.

Второе ограничение — зависимость от драйверов. Качество и стабильность драйвера оборудования напрямую определяет надёжность событий: «падающий» драйвер роняет и обработку событий. Поэтому при выборе оборудования стоит проверять наличие сертифицированного драйвера под используемую версию платформы и конфигурации.

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

Итог

Что важно запомнить

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

Частые вопросы

Чем внешнее событие отличается от обычного события формы?

Обычные события формы (ПриОткрытии, ПриЗаписи и т.п.) генерирует сама платформа в ответ на действия пользователя и системные процессы. Внешнее событие инициируется источником вне платформы — драйвером оборудования или компонентой — и попадает в отдельный обработчик ВнешнееСобытие с параметрами Источник, Событие и Данные.

Почему обработчик ВнешнееСобытие не срабатывает, хотя сканер работает?

Чаще всего сканер работает в режиме эмуляции клавиатуры: данные просто вводятся в активное поле, и события не возникает. Переведите сканер в режим работы через драйвер и настройте его в подключаемом оборудовании. Также проверьте, что обработчик расположен на клиенте и имя события в коде совпадает с тем, что передаёт драйвер.

Можно ли обработать внешнее событие на сервере?

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

Как передать данные из одной формы в другую без внешнего события?

Используйте метод Оповестить с именем события и параметрами, а в целевой форме — обработку оповещения. Это штатный механизм обмена сообщениями между формами, и он не требует ни оборудования, ни внешних компонент.

Работают ли внешние события в веб-клиенте?

Возможности ограничены: браузер не имеет прямого доступа к COM-портам и локальным устройствам. Для работы с оборудованием в веб-клиенте применяются специальные расширения и компоненты, но для кассовых мест и складов со сканерами надёжнее тонкий или толстый клиент.

Что делать, если событие приходит дважды при одном сканировании?

Проверьте, не подключено ли устройство дважды (например, и как клавиатурный сканер, и через драйвер), а также нет ли двух источников с одинаковым именем события. В обработчике различайте источники по параметру Источник и при необходимости добавьте защиту от повторной обработки одинаковых данных подряд.