Автоматизация · 13 мин
Внешнее событие в 1С: назначение, источники и обработка
Что такое внешнее событие в 1С, как оно поступает от сканеров, ККТ и весов, как обработать его в модуле формы и настроить оборудование без ошибок.
Внешнее событие в 1С — это механизм, через который прикладное решение получает сигналы от внешних по отношению к платформе источников: торгового оборудования (сканеров штрихкодов, фискальных регистраторов, терминалов сбора данных, весов), внешних компонент по технологии COM или Native API, а также программных вызовов через Оповестить(). В отличие от обычных событий формы, которые возникают при действиях пользователя внутри интерфейса, внешнее событие приходит «снаружи» и требует отдельной обработки.
Классический пример — работа кассира в розничной точке. Сканер считывает штрихкод товара, драйвер оборудования формирует событие, а 1С через обработчик ВнешнееСобытие получает данные (сам штрихкод, тип источника) и автоматически добавляет товар в чек. Без этого механизма каждую операцию пришлось бы вводить вручную, что резко снизило бы скорость работы и увеличило количество ошибок.
Механизм существует как в обычных формах, так и в управляемых. В обычном приложении обработчик внешнего события располагается в модуле формы, в управляемом приложении — в модуле формы на клиенте либо в модуле управляемого приложения. Понимание того, откуда приходит событие и какие данные оно несёт, необходимо для корректной настройки торгового оборудования и диагностики сбоев.
Как устроен механизм внешних событий
Платформа 1С:Предприятие работает по событийной модели: код выполняется в ответ на события. Большинство событий генерируется самой платформой — открытие формы, запись документа, нажатие кнопки. Внешние события выделяются тем, что их инициатор находится за пределами прикладного кода: это драйвер оборудования, внешняя компонента или явный программный вызов.
Когда источник формирует событие, платформа ищет подписанный обработчик ВнешнееСобытие(Источник, Событие, Данные). Все три параметра — строковые: источник идентифицирует устройство или компоненту, событие уточняет тип произошедшего, данные содержат полезную нагрузку (например, строку штрихкода). Дальше логика обработки полностью определяется разработчиком конфигурации.
В типовых конфигурациях (Управление торговлей, Розница, ERP) обработка внешних событий уже встроена в подсистему работы с оборудованием: формы подключаются к событиям через специальные процедуры, и разработчику остаётся только переопределить реакцию на конкретные типы данных. В самописных решениях обработчик придётся реализовать самостоятельно.
Источники внешних событий
На практике внешние события приходят из трёх групп источников. Первая группа — торговое оборудование, подключённое через драйверы: сканеры штрихкодов, терминалы сбора данных, электронные весы, фискальные регистраторы, дисплеи покупателя, эквайринговые терминалы. Драйвер устройства регистрируется в системе как COM-объект или внешняя компонента и генерирует события при срабатывании устройства.
Вторая группа — внешние компоненты, разработанные по технологии Native API или как COM-объекты. Они могут генерировать события по любой логике: например, компонента мониторинга файловой системы сигнализирует о появлении нового файла, а компонента интеграции с телефонией — о входящем звонке.
Третья группа — программный вызов Оповестить(ИмяСобытия, Параметр, Источник) внутри самой конфигурации. Формально это не «внешнее» событие по происхождению, но обрабатывается оно похожим образом — через обработчики оповещений и подписки на события форм. Этот способ используют для обмена данными между открытыми формами без жёстких ссылок друг на друга.
Проверьте, установлен ли драйвер и настроен ли суффикс/префикс сканирования
Найдите в конфигураторе все вызовы Оповестить с нужным именем события
Проверьте, загружена ли компонента методом ПодключитьВнешнююКомпоненту
Обработчик ВнешнееСобытие: параметры и пример кода
Обработчик внешнего события объявляется в модуле формы (для управляемых форм — с директивой &НаКлиенте) или в модуле приложения. Сигнатура процедуры фиксированная: три параметра — Источник, Событие, Данные. Платформа сама передаёт в них значения, задача разработчика — разобрать их и выполнить нужные действия.
Типовая структура обработчика выглядит так: сначала проверяется источник и имя события, затем данные преобразуются в нужный тип и передаются в прикладную логику. Ниже пример для формы документа «Чек ККМ», где по событию от сканера добавляется товар.
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Источник = "СканерШтрихкода" И Событие = "Штрихкод" Тогда
Штрихкод = СокрЛП(Данные);
ДобавитьТоварПоШтрихкоду(Штрихкод);
КонецЕсли;
КонецПроцедуры
В типовых конфигурациях на базе БСП и БПО (библиотека подключаемого оборудования) обработчик уже реализован: форма подписывается на события через механизмы библиотеки, а прикладному коду достаётся готовая структура с распознанным штрихкодом, весом или номером карты. Переопределять базовый обработчик напрямую в этом случае не нужно — используются предусмотренные точки расширения.
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Событие = "Штрихкод" Тогда
ОбработатьШтрихкод(Данные);
КонецЕсли;
КонецПроцедурыНастройка сканера штрихкодов как источника событий
Наиболее частая практическая задача — подключить сканер штрихкодов так, чтобы считанные коды приходили в форму как внешние события. Существует два режима работы сканера: эмуляция клавиатуры и работа через драйвер. В режиме эмуляции клавиатуры сканер «печатает» штрихкод как обычный ввод с клавиатуры, и внешнего события не возникает — данные попадают в активное поле ввода. Это просто, но неудобно: фокус должен быть в нужном поле, иначе штрихкод попадёт не туда.
Режим с драйвером предпочтительнее для автоматизированных рабочих мест. Сканер настраивается в конфигурации как подключаемое оборудование (раздел «Подключаемое оборудование» в типовых решениях), драйвер перехватывает данные и генерирует внешнее событие независимо от того, где находится фокус. Форма получает штрихкод в обработчике и сама решает, что с ним делать.
- 1Установите драйвер сканера от поставщика оборудования и убедитесь, что устройство определяется системой
- 2В конфигурации откройте настройку подключаемого оборудования и добавьте новый сканер штрихкодов
- 3Выберите драйвер, укажите порт или идентификатор устройства, задайте префикс и суффикс при необходимости
- 4Откройте рабочее место (например, РМК) и отсканируйте тестовый штрихкод
- 5Проверьте, что товар добавился в документ без установки курсора в поле ввода
Если сканер работает в клавиатурном режиме, а нужен режим событий, устройство обычно переводится в нужный режим сканированием служебных штрихкодов из инструкции производителя либо настройкой в утилите драйвера. Конкретная последовательность зависит от модели сканера.
Отладка: почему событие не приходит
Типичная ситуация: оборудование подключено, но обработчик не срабатывает. Диагностику удобно строить от источника к обработчику. Сначала проверяется, что устройство физически работает и драйвер его видит — для этого у большинства драйверов есть тестовая форма или утилита проверки связи. Если тест драйвера проходит, а события в 1С нет, проблема в подписке на события или в обработчике.
Простой способ убедиться, что событие доходит до формы — временно поставить в начало обработчика вывод сообщения или точку останова и воспроизвести действие (отсканировать штрихкод). Если обработчик вызывается, но данные пустые или искажённые, причина обычно в настройках префиксов и суффиксов либо в несовпадении имени события с тем, что проверяется в коде.
Отдельный класс проблем — работа в терминальном режиме (RDP). Сканер, подключённый к локальному компьютеру, должен быть проброшен в терминальную сессию, а драйвер установлен на сервере. Часто события «теряются» именно потому, что драйвер стоит только на клиенте или проброс портов не настроен.
Как проверить цепочку события
Драйвер видит устройство и получает данные
Ошибка связи — проверяйте кабель, порт, установку драйвера
Точка останова срабатывает при сканировании
Обработчик не вызывается — проверяйте подписку на события и режим сканера
Строка штрихкода без лишних символов
Пусто, обрезано или с мусором — настраивайте префиксы/суффиксы
Типичные ошибки при работе с внешними событиями
Опыт внедрений показывает, что большинство проблем с внешними событиями сводится к нескольким повторяющимся ошибкам. Их знание экономит часы отладки.
Ещё одна распространённая ситуация — конфликт нескольких источников событий. Если к одному рабочему месту подключены сканер и терминал сбора данных, оба могут генерировать события с одинаковым именем. В обработчике нужно различать их по параметру Источник, иначе данные будут обрабатываться дважды или не по тем правилам.
Внешнее событие и Оповестить: в чём разница
Разработчики часто смешивают два механизма. Внешнее событие через обработчик ВнешнееСобытие предназначено прежде всего для сигналов от оборудования и компонент. Метод Оповестить — это шина сообщений между формами и кодом конфигурации: одна форма вызывает Оповестить("ЗакрытиеДокумента", Параметры), а другие формы, подписавшиеся через ОповещениеОЗакрытии или обработку оповещения, реагируют на это сообщение.
Выбирая механизм, исходите из источника: если сигнал инициирует устройство или внешняя компонента — это внешнее событие; если сигнал инициирует прикладной код для связи между формами — используйте Оповестить. Смешивать их без необходимости не стоит: это усложняет отладку и сопровождение.
Как выбрать механизм
Ограничения механизма
Внешние события обрабатываются только на клиенте: серверный код напрямую их получить не может. Если результат события нужно сохранить или обработать на сервере, клиентский обработчик вызывает серверную процедуру уже после получения данных. Это важно учитывать при проектировании: нельзя построить логику, где сервер сам «слушает» сканер.
Второе ограничение — зависимость от драйверов. Качество и стабильность драйвера оборудования напрямую определяет надёжность событий: «падающий» драйвер роняет и обработку событий. Поэтому при выборе оборудования стоит проверять наличие сертифицированного драйвера под используемую версию платформы и конфигурации.
Наконец, в веб-клиенте возможности работы с оборудованием ограничены: прямой доступ к COM-портам и локальным устройствам из браузера невозможен без специальных расширений и компонент. Для рабочих мест с активным использованием оборудования обычно применяют тонкий или толстый клиент.
Что важно запомнить
Внешнее событие в 1С — канал доставки сигналов от оборудования, внешних компонент и программных оповещений в обработчик ВнешнееСобытие с параметрами Источник, Событие, Данные. Обработка выполняется только на клиенте, стабильность зависит от драйвера, а для связи между формами вместо внешних событий используется Оповестить.
Частые вопросы
Чем внешнее событие отличается от обычного события формы?
Обычные события формы (ПриОткрытии, ПриЗаписи и т.п.) генерирует сама платформа в ответ на действия пользователя и системные процессы. Внешнее событие инициируется источником вне платформы — драйвером оборудования или компонентой — и попадает в отдельный обработчик ВнешнееСобытие с параметрами Источник, Событие и Данные.
Почему обработчик ВнешнееСобытие не срабатывает, хотя сканер работает?
Чаще всего сканер работает в режиме эмуляции клавиатуры: данные просто вводятся в активное поле, и события не возникает. Переведите сканер в режим работы через драйвер и настройте его в подключаемом оборудовании. Также проверьте, что обработчик расположен на клиенте и имя события в коде совпадает с тем, что передаёт драйвер.
Можно ли обработать внешнее событие на сервере?
Напрямую — нет, внешние события принимает только клиент. Схема такая: клиентский обработчик получает событие, извлекает данные и вызывает серверную процедуру для записи в базу или сложной обработки.
Как передать данные из одной формы в другую без внешнего события?
Используйте метод Оповестить с именем события и параметрами, а в целевой форме — обработку оповещения. Это штатный механизм обмена сообщениями между формами, и он не требует ни оборудования, ни внешних компонент.
Работают ли внешние события в веб-клиенте?
Возможности ограничены: браузер не имеет прямого доступа к COM-портам и локальным устройствам. Для работы с оборудованием в веб-клиенте применяются специальные расширения и компоненты, но для кассовых мест и складов со сканерами надёжнее тонкий или толстый клиент.
Что делать, если событие приходит дважды при одном сканировании?
Проверьте, не подключено ли устройство дважды (например, и как клавиатурный сканер, и через драйвер), а также нет ли двух источников с одинаковым именем события. В обработчике различайте источники по параметру Источник и при необходимости добавьте защиту от повторной обработки одинаковых данных подряд.