В современных версиях конфигурации «1С:Управление торговлей 11» (начиная с 11.4 и выше) разработчики компании 1С изменили привычную методологию работы с торговым оборудованием. В отличие от старых версий (например, УТ 10.3), где сканер работал практически в любой открытой форме, в новых редакциях на базе управляемых форм сканирование жестко привязано к табличным частям документов. Подбор товаров теперь позиционируется как инструмент визуального выбора, а не оперативного сканирования.
Однако на практике бизнес-процессы клиентов часто требуют возможности сканирования именно в окне подбора — например, для оперативной проверки остатков на разных складах или уточнения характеристик товара перед добавлением в документ. Часто, когда клиент переходит на УТ 11 с УТ 10.3, он ожидает увидеть привычную логику работы справочников. В этой статье мы подробно разберем, как программно вернуть функционал сканера штрихкодов в форму подбора, используя механизмы Библиотеки подключаемого оборудования (БПО).
Проанализируем ситуацию: почему в форме списка номенклатуры сканер работает, а в форме подбора — нет? Ответ кроется в архитектуре управляемого приложения. Для того чтобы форма начала принимать события от внешнего оборудования (сканера штрихкодов), она должна «подписаться» на эти события через менеджер оборудования. В типовой форме подбора УТ 11 такая подписка отсутствует по умолчанию, так как разработчики предполагают, что пользователь будет сканировать штрихкоды непосредственно в табличную часть документа, хотя многим пользователям была бы полезна привычная иерархия номенклатуры как в УТ 10.3 с возможностью быстрого поиска.
Выясним причину отсутствия реакции: даже если вы добавите в модуль формы процедуру ОбработкаОповещения, платформа не будет передавать в неё данные со сканера, пока менеджер оборудования не зафиксирует, что текущее окно является активным потребителем данных типа «Сканер штрихкода». Для решения этой задачи можно использовать готовое сканирование штрихкодов в форме подбора номенклатуры, которое реализует этот механизм.
Рассмотрим первый и самый важный этап — инициализацию подключения. Нам необходимо программно сообщить системе, что форма подбора готова принимать данные от сканера. Лучше всего это делать через механизм расширений, чтобы не снимать конфигурацию с поддержки. Нам потребуется вмешаться в обработчик события ПриОткрытии на стороне клиента.
Посмотрим на пример кода, который необходимо добавить для регистрации формы в системе БПО:
&НаКлиенте
Процедура ПодключитьСканерПриОткрытии()
// Подключаем обработчик для работы с оборудованием
ПоддерживаемыеТипыОборудования = "СканерШтрихкода";
МенеджерОборудованияКлиент.ПодключитьОборудованиеКоманду(ЭтаФорма, ПоддерживаемыеТипыОборудования);
КонецПроцедуры
Использование метода ПодключитьОборудованиеКоманду из общего модуля МенеджерОборудованияКлиент позволяет форме войти в список активных слушателей. С этого момента платформа начнет перехватывать прерывания от драйвера сканера и направлять их в наше окно.
Теперь разберем, как обработать само событие. Когда луч сканера считывает код, платформа генерирует внешнее событие, которое попадает в процедуру ОбработкаОповещения. Если в форме подбора её нет, её нужно создать. Важно понимать, что в параметрах этой процедуры передается не просто строка со штрихкодом, а структура данных, сформированная драйвером.
Рассмотрим структуру обработки события:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// Проверяем, что событие пришло именно от торгового оборудования
Если Источник = "ПодключаемоеОборудование" Тогда
// В параметре может прийти массив штрихкодов или один штрихкод
ДанныеШтрихкода = Неопределено;
Если ИмяСобытия = "ScanData" Тогда
ДанныеШтрихкода = Параметр;
ИначеЕсли ИмяСобытия = "Штрихкод" Тогда
ДанныеШтрихкода = Параметр;
КонецЕсли;
Если ДанныеШтрихкода <> Неопределено Тогда
// Обрабатываем полученные данные
ОбработатьПолученныйШтрихкод(ДанныеШтрихкода);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Обратите внимание, что в разных версиях БПО имена событий могут отличаться (например, ScanData для новых версий или просто Штрихкод для более старых). Мы рекомендуем проверять оба варианта для универсальности решения.
Проанализируем ситуацию далее: данные получены, но что с ними делать в подборе? Нам нужно найти номенклатуру, соответствующую штрихкоду, и спозиционироваться на ней в динамическом списке. Для удобства работы пользователя часто требуется не только найти товар, но и увидеть остатки и цены в списке номенклатуры как в УТ 10.3, чтобы сразу сориентировать покупателя.
Посмотрим на пример серверной функции поиска:
&НаСервере
Функция НайтиТоварПоШтрихкодуНаСервере(Знач Штрихкод)
// Используем типовой регистр сведений "ШтрихкодыНоменклатуры"
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Номенклатура КАК Ссылка,
| ШтрихкодыНоменклатуры.Характеристика КАК Характеристика
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Штрихкод = &Штрихкод";
Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Новый Структура("Номенклатура, Характеристика", Выборка.Ссылка, Выборка.Характеристика);
КонецЕсли;
Возврат Неопределено;
КонецФункции
После того как сервер вернул нам ссылку на номенклатуру, на клиенте мы должны выполнить позиционирование. Чтобы форма стала еще информативнее, можно внедрить дополнительные колонки в подборах номенклатуры, отображающие сам штрихкод или специфические цены — для этого есть обработка вывода штрихкодов и остатков в форме списка УТ, КА, ERP.
Важный момент, о котором часто забывают разработчики: при закрытии формы подбора необходимо обязательно разорвать связь со сканером. Если этого не сделать, события сканера могут продолжать поступать в «несуществующую» (закрытую) форму, что приведет к ошибкам в сеансе пользователя или некорректной работе сканера в основном документе.
Добавим обработчик закрытия:
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
// Отключаем форму от уведомлений оборудования
МенеджерОборудованияКлиент.ОтключитьОборудованиеКоманду(ЭтаФорма);
КонецПроцедуры
Рассмотрим несколько нюансов, которые помогут сделать решение более стабильным:
&После для процедур ПриОткрытии и ПриЗакрытии. Это сохранит возможность легкого обновления конфигурации. Можно взять за основу готовое расширение для поиска номенклатуры по штрихкоду для УТ 11.5, которое уже включает необходимый функционал.ОбработатьПолученныйШтрихкод готова принять массив структур, а не только одиночную строку.ПоказатьОповещениеПользователя.Таким образом, мы выяснили, что ограничение на использование сканера в подборе — это лишь методологическое решение 1С, которое легко обходится с помощью нескольких строк кода и правильного обращения к функциям Библиотеки подключаемого оборудования. Следуя этим шагам, вы сможете обеспечить клиенту привычный и удобный интерфейс работы с товарами.