Как предотвратить двойное сканирование штрихкода в разные окна в 1С:Розница?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Торговля и дистрибуция
← На главную

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

Почему сканер штрихкодов срабатывает в нескольких окнах?

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

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

Сканеры в режиме "разрыв клавиатуры" работают иначе (они просто имитируют быстрое нажатие клавиш туда, где стоит курсор), и для них такой проблемы нет. Однако для корректной работы с маркировкой и ЕГАИС строго рекомендуется использовать именно COM-сканеры. Поэтому проанализируем программные способы решения.

Способ 1: Управление подключением сканера по фокусу окна (Рекомендуемый)

Рассмотрим наилучшую практику решения этой задачи. Чтобы сканер работал только в том окне, с которым сейчас взаимодействует пользователь, нам необходимо динамически управлять "захватом" оборудования. Подключим сканер к нашей сторонней обработке только тогда, когда окно активно.

Для этого задействуем стандартные обработчики событий управляемой формы. Посмотрим на пример реализации:


&НаКлиенте
Процедура ПриАктивизации()
    // Перехватываем фокус оборудования на текущее активное окно
    МенеджерОборудованияКлиент.ПодключитьОборудованиеПоФокусу(ЭтаФорма);
КонецПроцедуры

&НаКлиенте
Процедура ПриДеактивизации()
    // Отдаем оборудование, когда пользователь переключается на другое окно (например, обратно в РМК)
    МенеджерОборудованияКлиент.ОтключитьОборудованиеПоФокусу(ЭтаФорма);
КонецПроцедуры

Таким образом, как только пользователь кликнет по вашему окну, оно перехватит события сканера на себя. Как только окно будет свернуто или закрыто — сканер снова станет доступен для РМК.

Способ 2: Использование метода ВводДоступен()

Проанализируем альтернативный подход. У управляемой формы существует встроенный метод ВводДоступен(), который возвращает Истина для окна переднего плана и Ложь для фоновых окон.

Мы можем добавить простую проверку в процедуру обработки внешнего события в нашей форме или форме РМК:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    // Проверяем, активно ли наше окно в данный момент
    Если Не ЭтаФорма.ВводДоступен() Тогда
        Возврат; // Окно перекрыто, игнорируем событие
    КонецЕсли;
    
    // Далее идет логика добавления товара
    // ...
КонецПроцедуры

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

Способ 3: Открытие формы с блокировкой окна владельца

Рассмотрим еще один простой вариант. Если ваша обработка открывается поверх окна РМК (например, по кнопке из интерфейса кассира), вы можете открывать ее в режиме жесткой блокировки окна владельца.

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

Способ 4: Очистка (прерывание) события

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

Для этого в параметрах обработчика события (в зависимости от конкретной версии БПО) необходимо очистить данные события или установить флаг обработки, чтобы нижележащее окно РМК получило пустой сигнал и проигнорировало его.

Подведем итог: Для надежной работы COM-сканеров в 1С:Розница 2.2 и исключения дублирования товаров, мы рекомендуем использовать управление оборудованием по фокусу окна (Способ 1). Это стандартный подход, заложенный разработчиками БПО, который гарантирует стабильную работу торгового оборудования при любом количестве одновременно открытых форм.

← На главную