При разработке функционала подбора товаров или инвентаризации в 1С часто возникает необходимость запросить у пользователя штрихкод. Многие разработчики по привычке пытаются использовать стандартную функцию платформы ПоказатьВводЗначения. Однако при работе с профессиональным торговым оборудованием этот метод оказывается неэффективным. В этой статье мы подробно разберем, почему стандартные методы не подходят для сканеров, как разработать собственную форму ввода и устранить типичные ошибки, такие как «зацикливание» или повторное открытие окна.
Для начала проанализируем, как работает метод ПоказатьВводЗначения. Данная функция предназначена для создания простого диалогового окна, блокирующего интерфейс, где пользователь может ввести строку, число или дату с клавиатуры. Основная проблема заключается в том, что это системное окно не является полноценной управляемой формой конфигурации. Мы не можем программно дотянуться до его обработчиков событий или внедрить туда логику «Библиотеки подключаемого оборудования» (БПО).
Рассмотрим ситуацию со сканерами штрихкодов. Если сканер настроен в режиме «Эмуляция клавиатуры», он просто «печатает» символы в активное поле ввода. В этом случае ПоказатьВводЗначения может сработать, если в настройках сканера добавлен суффикс Enter. Однако современные стандарты автоматизации в 1С:КА требуют использования режима COM-порта (NativeApi). В этом режиме данные от сканера передаются как внешнее событие драйвера, и окно ввода их просто «не слышит».
Выясним причину, по которой лучшим решением является отказ от ПоказатьВводЗначения в пользу создания собственной управляемой формы или использования штатных форм БПО. Рассмотрим по шагам, как реализовать механизм, который будет корректно принимать данные от сканера в любом режиме.
В конфигурации «1С:Комплексная автоматизация» уже существуют встроенные механизмы. Вместо изобретения велосипеда, мы можем использовать общие модули, такие как ШтрихкодированиеНоменклатурыКлиент. Однако, если нам нужно кастомизировать процесс, разберем процесс создания своей формы ввода.
Разберем алгоритм создания формы, которая будет «слушать» сканер. Нам необходимо выполнить три ключевых действия: подключить оборудование при открытии, отключить его при закрытии и перехватить данные в обработчике.
Шаг 1. Подключение оборудования. В модуле нашей новой формы пропишем инициализацию сканера. Это важно для того, чтобы БПО понимала, какое именно окно сейчас ожидает данные.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем сканер через менеджер оборудования
ПоддерживаемыеТипы = Новый Массив;
ПоддерживаемыеТипы.Добавить("СканерШтрихкода");
ПараметрыПодключения = Новый Структура;
МенеджерОборудованияКлиент.ПодключитьОборудованиеПоТипу(ЭтаФорма,
ПоддерживаемыеТипы,
ПараметрыПодключения);
КонецПроцедуры
Шаг 2. Обработка внешнего события. Когда сканер считывает код, платформа генерирует событие. В управляемых формах за это отвечает процедура ОбработкаОповещения.
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// Проверяем, что событие пришло от торгового оборудования
Если Источник = "ПодключаемоеОборудование" И ИмяСобытия = "ScanData" Тогда
// Извлекаем штрихкод из данных драйвера
Если Параметр[1] = Неопределено Тогда
ДанныеШтрихкода = Параметр[0]; // Штрихкод в чистом виде
Иначе
ДанныеШтрихкода = Параметр[1][0]; // Данные из расширенного протокола
КонецЕсли;
// Закрываем форму и передаем результат в вызывающий модуль
Закрыть(ДанныеШтрихкода);
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию, когда форма закрывается, но тут же открывается снова. Это часто происходит в 1С:КА из-за особенностей логики асинхронных вызовов. Рассмотрим механизм: когда мы вызываем Закрыть(Результат), срабатывает ОповещениеОЗавершении, которое было передано при открытии формы.
Если в процедуре обработки этого оповещения (в вызывающем коде) прописана логика, которая при определенных условиях снова вызывает функцию ПоказатьВводШтрихкода, возникает бесконечный цикл. Например, если сканер после кода посылает символ Enter, система может воспринять это как двойное нажатие кнопки или два последовательных события сканирования.
Чтобы избежать этой проблемы, рекомендуется использовать флаг обработки или проверять состояние системы перед повторным вызовом. Посмотрим на пример безопасного вызова формы:
&НаКлиенте
Процедура НачатьВводШтрихкода()
// Проверяем, не открыта ли уже форма (защита от двойного клика)
Если ЭтаФорма.Свойства[ИмяФлагаОжидания] = Истина Тогда
Возврат;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВводаШтрихкода", ЭтотОбъект);
// Вместо ПоказатьВводЗначения вызываем нашу форму
ОткрытьФорму("ОбщаяФорма.ФормаВводаШтрихкода", , , , , , ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВводаШтрихкода(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат; // Пользователь нажал Отмена
КонецЕсли;
// ВАЖНО: Сначала обрабатываем данные, и только потом
// позволяем системе открывать новые окна, если это необходимо.
ОбработатьПолученныйКод(Результат);
КонецПроцедуры
Для качественной реализации проекта по автоматизации штрихкодирования, придерживайтесь следующих правил:
ОписаниеОповещения). Модальные окна блокируют работу драйверов оборудования.ОтключитьОборудованиеПоТипу в процедуре ПриЗакрытии формы. Если этого не сделать, порт сканера останется занятым, и в следующий раз оборудование может не инициализироваться.Закрыть(ЗначениеПоляВвода).ScanData возвращает массив, где могут содержаться не только штрихкод, но и тип штрихкода (EAN13, Code128 и т.д.). Правильная обработка типа кода повышает надежность системы.Таким образом, мы выяснили, что для полноценной работы со сканером в 1С:Комплексная автоматизация необходимо отойти от упрощенных методов платформы и реализовать интерфейс на базе управляемых форм с подключением через МенеджерОборудованияКлиент. Это обеспечит стабильную работу как в режиме эмуляции клавиатуры, так и при использовании COM-портов, исключит «зависание» интерфейса и позволит гибко обрабатывать ошибки сканирования.