В процессе автоматизации рабочих мест кассиров (РМК) в конфигурациях 1С:УНФ или 1С:Розница часто возникает задача реализации функционала отложенных чеков. Однако при стандартной реализации — открытии нового окна с данными чека и закрытии текущего — пользователи сталкиваются с критической проблемой: сканер штрихкодов перестает работать без нажатия клавиши F7 или перезапуска системы. Разберем, почему это происходит и как устранить данную ошибку.
Проблема кроется в специфике работы управляемых форм 1С и механизма захвата событий внешнего оборудования. Когда мы закрываем текущую форму и открываем новую, происходит разрыв контекста обработки событий ВнешнееСобытие.
Внешняя компонента сканера привязывается к активному окну. В момент, когда форма закрывается, процедура обработки событий теряет «адресата». При открытии новой формы фокус ввода может быть передан не на поле, настроенное для перехвата событий сканера, либо компонента просто не успевает инициализироваться в контексте нового окна. Необходимость нажатия F7 — это яркий признак того, что глобальный обработчик событий системы не нашел активную форму, готовую к приему данных от торгового оборудования.
Наиболее профессиональный и правильный подход — отказаться от открытия новых окон. Вместо того чтобы закрывать текущую форму, рассмотрим алгоритм «подмены» данных в уже открытом документе. Это позволит сохранить целостность сессии работы со сканером.
ЧекККМ.Товары.Модифицированность = Истина, чтобы форма «поняла», что данные изменились и потребовала обновления интерфейса.Пример логики обновления данных на сервере:
&НаСервере
Процедура ЗаполнитьЧекИзОтложенного(СсылкаНаОтложенныйЧек)
ОбъектДокумента = СсылкаНаОтложенныйЧек.ПолучитьОбъект();
Объект.Товары.Загрузить(ОбъектДокумента.Товары.Выгрузить());
Объект.Клиент = ОбъектДокумента.Клиент;
// Обновляем прочие реквизиты
Модифицированность = Истина;
КонецПроцедуры
При таком подходе форма остается активной, контекст ВнешнееСобытие не разрывается, и сканер продолжает работать в штатном режиме без вмешательства оператора.
Если архитектурное изменение логики кажется слишком объемным, попробуем принудительно возвращать фокус в поле ввода сканера. Для этого в событии ПриОткрытии новой формы добавим код, который принудительно переводит курсор в поле поиска.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Устанавливаем фокус на поле ввода штрихкода
ЭтаФорма.ТекущийЭлемент = Элементы.ПолеВводаШтрихкода;
КонецПроцедуры
Однако стоит учитывать, что данный метод не всегда решает проблему с самим подключением компоненты, поэтому первый вариант является более предпочтительным.
Так как 1С:УНФ базируется на БСП (Библиотеке стандартных подсистем), необходимо проверить, корректно ли вызывается процедура подключения оборудования при открытии формы. Возможно, при создании нового окна не срабатывает процедура инициализации ПодключитьОборудование.
Убедимся, что в процедуре ПриСозданииНаСервере или ПриОткрытии выполняется проверка на наличие активного сканера, и при необходимости принудительно вызываем метод подключения для обеспечения захвата событий.
Проанализировав ситуацию, можно сделать вывод: закрытие форм — это антипаттерн для РМК при работе с периферийным оборудованием. Чтобы избежать проблем:
ЗначениеРеквизитаОбъекта или прямое получение объекта для быстрой передачи данных между документами.F7 — это лишь костыль, который сигнализирует о потере фокуса, а не о неисправности железа.Применяя данные рекомендации, вы добьетесь стабильной работы кассы и избавите продавцов от необходимости лишних манипуляций при возврате к отложенному чеку.