При работе с торговым оборудованием в 1С, особенно в таких конфигурациях, как «1С:Розница», «Управление торговлей» или «ERP», часто возникает необходимость вмешаться в процесс обработки считанного штрихкода. Это может понадобиться для добавления проверки товара, изменения логики поиска в базе или реализации специфических алгоритмов подбора. Рассмотрим подробно, как найти «ту самую» точку входа в коде, где программа получает данные от драйвера сканера.
Исторически и технически работа сканера (если он настроен в режиме эмуляции COM-порта или Native HID) завязана на генерации платформенного события. Разберем, как это работает на уровне программного кода формы. В большинстве случаев первичная обработка происходит в процедуре ВнешнееСобытие.
Проанализируем стандартную структуру этой процедуры. Если вы откроете форму списка номенклатуры или форму чека ККМ, вы наверняка найдете там следующий обработчик:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Параметр "Данные" содержит считанный штрихкод
// Параметр "Событие" обычно имеет значение "Barcode" или "Штрихкод"
Если Источник = "BarCodeScaner" Тогда // Условие может зависеть от настроек драйвера
// Здесь начинается логика обработки
ОбработатьШтрихкод(Данные);
КонецЕсли;
КонецПроцедуры
В современных конфигурациях, использующих БПО (Библиотеку подключаемого оборудования), прямой вызов из формы часто заменяется на вызов через общие модули. Рассмотрим процедуру, которую обнаружил автор темы:
ВнешнееСобытиеОборудования(Форма, Источник, Событие, Данные)
Эта функция обычно находится в общем модуле МенеджерОборудованияКлиент. Она является универсальным «диспетчером», который принимает сигнал от любого устройства и перенаправляет его в нужную форму. Если вы хотите перехватить штрихкод глобально для всей системы, начинать поиск стоит именно с этого модуля.
Если вы не хотите просматривать сотни строк кода в поисках нужной процедуры, воспользуйтесь хитростью опытных разработчиков 1С. Этот метод позволяет мгновенно «провалиться» в нужную точку выполнения кода.
Разберем по шагам алгоритм действий:
Важный нюанс: этот метод работает только в том случае, если сканер генерирует внешнее событие. Если сканер работает в режиме «разрыва клавиатуры» (просто печатает цифры), событие не инициируется, и отладка не остановится.
Если метод с паузой не помог или код уходит глубоко в фоновые задания, проанализируем ситуацию с помощью замера производительности. Это позволит увидеть всю цепочку вызовов — от момента получения сигнала драйвером до момента добавления товара в табличную часть.
Рассмотрим порядок работы с замером:
Обычно в топе списка вы увидите вызовы из модулей МенеджерОборудованияКлиент, ПодключаемоеОборудованиеРТКлиент или обработчики внутри самой формы. Это самый надежный способ найти скрытую логику в сложных конфигурациях типа «Розница».
В последних версиях платформы (8.3.15+) и новых редакциях БПО разработчики все чаще отказываются от использования ВнешнееСобытие напрямую в формах в пользу глобальных оповещений. Выясним, как это устроено.
Цепочка выглядит так: драйвер посылает сигнал -> общий модуль БПО его принимает -> модуль рассылает оповещение всем открытым формам командой Оповестить("ScanData", ПараметрыШтрихкода). В этом случае в форме нужно искать не внешнее событие, а процедуру:
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ScanData" Тогда
// Здесь осуществляется перехват данных
// Параметр обычно содержит структуру с кодом и типом штрихкода
КонецЕсли;
КонецПроцедуры
Если вы попробовали все вышеперечисленные методы, но код «не ловится», проверим режим работы самого сканера. Существует два принципиально разных способа подключения:
Совет: Если ваш сканер работает в режиме клавиатуры, перехватить его через ВнешнееСобытие невозможно. В таких случаях программисты 1С используют свойство формы АвтоматическоеСохранениеДанныхВНастройках или специализированные обработчики ожидания, но правильнее будет перенастроить сканер в режим эмуляции COM-порта с помощью специальных сервисных штрихкодов из инструкции к устройству.
Если вы все еще не уверены, где именно происходит обработка, проанализируем конфигурацию через глобальный поиск (Ctrl+Shift+F). Попробуем поискать следующие ключевые слова:
ПодключитьСканерШтрихкода — поможет найти инициализацию устройства.ОбработкаШтрихкода — стандартное имя процедуры во многих типовых решениях.ДрайверСканераШтрихкода — поиск объектов, взаимодействующих с низкоуровневым ПО."ScanData" — поиск строкового идентификатора события в БПО.Таким образом, комбинируя методы живой отладки («Пауза» и «Замер производительности») с анализом кода типовых процедур (ВнешнееСобытие и ОбработкаОповещения), вы сможете точно определить место, где перехватываются данные сканера, и внести необходимые правки в логику работы программы.