При переводе рабочих мест с ручного клавиатурного ввода на автоматизированное считывание штрихкодов разработчики часто сталкиваются с привычным интерфейсом пользователей. Если ранее оператор нажимал кнопку в документе, получал окно функции ВвестиСтроку и вручную вбивал символы, возникает закономерное желание оставить этот же диалог, но направить туда считанный штрихкод. Разберем, почему штатная функция платформы накладывает технические ограничения и какими способами можно реализовать требуемое поведение системы.
Выясним причину, почему данные из процедуры ОбработкаВнешнегоСобытия не попадают в открытое окно ввода. Функция ВвестиСтроку вызывает системное модальное диалоговое окно операционной системы Windows, а не форму объекта платформы 1С. В момент отображения этого окна основной программный поток встроенного языка 1С 7.7 блокируется в ожидании возврата значения. Системное окно не имеет контекста встроенного языка, к его элементам управления невозможно обратиться программно, а события от внешних компонент торгового оборудования (работающих по интерфейсу RS-232 или USB VCP) не могут быть переданы в строковое поле ввода открытого модального диалога.
Рассмотрим наиболее гибкий и корректный вариант, полностью сохраняющий привычный интерфейс для оператора. Мы создаем отдельную обработку, форма которой визуально повторяет стандартный запрос ввода строки, но способна перехватывать внешние события от сканера.
Разберем по шагам создание такого механизма:
ВводЗначения).ОбработкаВнешнегоСобытия, которая перехватывает сигнал от драйвера торгового оборудования.Посмотрим на пример кода в модуле формы созданной обработки:
Процедура ПриОткрытии()
// Принимаем начальное значение, переданное в параметре формы
РеквизитВвода = Форма.Параметр;
КонецПроцедуры
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
// Проверяем тип внешнего события от сканера штрихкодов
Если Событие = "BarCodeValue" Тогда
РеквизитВвода = СокрЛП(Данные);
// При необходимости можно сразу закрыть форму с результатом
Форма.Закрыть(РеквизитВвода);
КонецЕсли;
КонецПроцедуры
Процедура ПоКнопкеОК()
Форма.Закрыть(РеквизитВвода);
КонецПроцедуры
Теперь проанализируем, как выглядит вызов данной формы из модуля документа вместо стандартного ВвестиСтроку:
Перем Результат;
Результат = "";
ОткрытьФормуМодально("Обработка.ВводЗначения", Результат);
Если ПустоеЗначение(Результат) = 0 Тогда
// Записываем полученный результат в реквизит документа
РеквизитДокумента = Результат;
КонецЕсли;
Если требуется сохранить именно штатное окно ВвестиСтроку без внесения изменений в конфигурацию и создания новых объектов, можно изменить режим работы самого сканера штрихкодов. Рассмотрим особенности данного метода:
CR или CR+LF).ВвестиСтроку фокус ввода автоматически находится в поле ввода. Пользователь сканирует штрихкод, устройство посылает символы напрямую в активное поле ввода Windows, а суффикс Enter автоматически подтверждает закрытие диалога.Важно: при таком подходе сканер перестает генерировать внешнее событие ОбработкаВнешнегоСобытия и работает исключительно как клавиатурное устройство ввода, что требует обязательного фокуса на нужном элементе интерфейса.
Проанализируем типовую практику автоматизации рабочих мест в 1С 7.7. Чаще всего постоянный вызов диалоговых окон для сканирования является избыточным действием, замедляющим работу оператора. Гораздо эффективнее обрабатывать сканирование напрямую в активной форме документа.
Посмотрим на пример реализации логики непосредственно в форме документа:
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
Перем КодСоСканера, Подтверждение;
Если Событие = "BarCodeValue" Тогда
КодСоСканера = СокрЛП(Данные);
// Если пользователю требуется визуальный контроль,
// можно открыть ВвестиСтроку с уже подставленным считанным кодом:
Подтверждение = КодСоСканера;
Если ВвестиСтроку(Подтверждение, "Проверьте считанный код:", 50) = 1 Тогда
РеквизитДокумента = Подтверждение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Такой подход позволяет оператору не инициировать диалог вручную. Система сама реагирует на считывание, открывает окно с уже заполненным значением для проверки или сразу производит поиск номенклатуры и заполнение табличной части документа без лишних нажатий клавиш.