При интеграции торгового оборудования с конфигурацией «1С:Бухгалтерия предприятия» (БП 3.0) пользователи часто сталкиваются со следующей проблемой: при сканировании штрихкода в документе (например, в чеке или расходной накладной) товар успешно добавляется в табличную часть, но в самом справочнике «Номенклатура» при «пике» сканером ничего не происходит. Программа не переводит курсор на нужную позицию.
В этой статье мы подробно разберем, почему возникает такое поведение системы, проанализируем особенности работы сканеров штрихкода в различных режимах и рассмотрим готовые варианты решения данной задачи — от штатных возможностей платформы до программной реализации через расширение конфигурации.
Давайте разберем внутреннее устройство справочника номенклатуры в БП 3.0. Пользователь ожидает, что при открытии формы списка справочника достаточно «пикнуть» сканером по штрихкоду товара, и программа автоматически выделит строку с этой номенклатурой. Однако в стандартной конфигурации этого не происходит по нескольким техническим причинам:
Справочник.Номенклатура.ФормаСписка разработчиками «1С» не заложен алгоритм обработки внешнего события от торгового оборудования. Система просто «не слушает» сигналы сканера в этой форме.РегистрСведений.ШтрихкодыНоменклатуры. Динамический список справочника отображает данные таблицы самого справочника, и по умолчанию он никак не связан с регистром штрихкодов для быстрого интерактивного поиска.Давайте рассмотрим, какими путями можно решить эту задачу, в зависимости от ваших технических возможностей и требований к автоматизации.
Перед тем как приступать к программированию, рассмотрим заложенный разработчиками «1С» стандартный механизм. Он работает «из коробки» без изменения конфигурации:
Этот способ надежен, но требует от пользователя лишнего действия (нажатия клавиши F7 перед каждым сканированием), что существенно замедляет потоковую работу на складе или в торговом зале.
Для того чтобы система могла обрабатывать сканирование в фоновом режиме (без открытия дополнительных окон поиска и без привязки к активному полю ввода), сканер необходимо перевести из режима клавиатуры в режим эмуляции COM-порта.
Выполним настройку по шагам:
CR или LF).Важно: перевод сканера в COM-режим — это обязательный шаг для профессиональной автоматизации, однако сам по себе он не заставит форму списка номенклатуры позиционироваться на товаре без программной доработки, так как обработчик оповещения в этой форме все еще отсутствует.
Чтобы не снимать типовую конфигурацию «1С:Бухгалтерия предприятия» с поддержки, мы реализуем необходимый функционал с помощью механизма расширений конфигурации. Наша задача — перехватить событие сканирования, найти номенклатуру по считанному штрихкоду в регистре сведений и установить на нее фокус в динамическом списке.
Проанализируем алгоритм работы расширения и напишем код.
Добавьте в новое расширение форму списка справочника Номенклатура и перейдите в модуль этой формы. Нам потребуется подключить оборудование при открытии формы и обработать оповещение от него.
Разберем пример кода для модуля формы списка:
&НаКлиенте
Процедура Расш1_ПриОткрытииПосле(Отказ)
// Подключаем сканер штрихкодов при открытии формы
Попытка
МенеджерОборудованияКлиент.ПодключитьУстройстваПоТипу(Новый УникальныйИдентификатор, "СканерШтрихкода");
Исключение
ЗаписьЖурналаРегистрации("ПодключениеСканера", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура Расш1_ПриЗакрытииПосле(ЗавершениеРаботы)
// Отключаем сканер при закрытии формы, чтобы освободить порт
Попытка
МенеджерОборудованияКлиент.ОтключитьУстройстваПоТипу(Новый УникальныйИдентификатор, "СканерШтрихкода");
Исключение
ЗаписьЖурналаРегистрации("ОтключениеСканера", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура Расш1_ОбработкаОповещенияПосле(ИмяСобытия, Параметр, Источник)
// Проверяем, что событие пришло от сканера штрихкода
Если ИмяСобытия = "BarcodeScan" Или ИмяСобытия = "ВнешнееСобытие" Тогда
// Получаем штрихкод из параметров события
Штрихкод = "";
Если ТипЗнч(Параметр) = Тип("Массив") И Параметр.Количество() > 0 Тогда
Штрихкод = СокрЛП(Параметр[0]);
ИначеЕсли ТипЗнч(Параметр) = Тип("Строка") Тогда
Штрихкод = СокрЛП(Параметр);
КонецЕсли;
Если Не ПустаяСтрока(Штрихкод) Тогда
// Ищем товар по полученному штрихкоду на сервере
НайденныйТовар = НайтиНоменклатуруПоШтрихкодуНаСервере(Штрихкод);
Если ЗначениеЗаполнено(НайденныйТовар) Тогда
// Позиционируем динамический список на найденном элементе
Элементы.Список.ТекущаяСтрока = НайденныйТовар;
Иначе
ПоказатьПредупреждение(, "Штрихкод """ + Штрихкод + """ не найден в базе данных.");
EndIf;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Теперь нам необходимо реализовать серверную функцию, которая будет осуществлять поиск ссылки на номенклатуру в регистре сведений ШтрихкодыНоменклатуры. Добавим следующий код:
&НаСервереБезКонтекста
Функция НайтиНоменклатуруПоШтрихкодуНаСервере(Штрихкод)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Штрихкод = &Штрихкод";
Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Выборка.Номенклатура;
КонецЕсли;
Возврат Справочники.Номенклатура.ПустаяСсылка();
КонецФункции
Проанализируем, как работает написанный нами код расширения:
Расш1_ПриОткрытииПосле мы используем стандартные методы Библиотеки подключаемого оборудования (БПО). Метод МенеджерОборудованияКлиент.ПодключитьУстройстваПоТипу инициализирует работу всех подключенных к системе сканеров штрихкода именно для этой конкретной формы.Расш1_ОбработкаОповещенияПосле система перехватывает событие сканирования (имя события обычно передается как BarcodeScan). Это избавляет пользователя от необходимости держать фокус ввода в определенном поле или нажимать дополнительные кнопки. Сигнал обрабатывается «в фоне».ШтрихкодыНоменклатуры и возвращает ссылку на элемент справочника Номенклатура.Элементы.Список.ТекущаяСтрока = НайденныйТовар;. Динамический список формы принимает ссылку на найденный объект и мгновенно переводит курсор на нужную позицию, выделяя строку цветом.Таким образом, мы решили проблему юзабилити. Теперь при открытом списке номенклатуры кладовщик или менеджер может непрерывно сканировать штрихкоды товаров, а программа будет автоматически перемещать фокус на нужные позиции, позволяя быстро проверять характеристики, цены или остатки товаров в базе данных.