Как настроить позиционирование на номенклатуре при сканировании штрихкода в 1С:Бухгалтерии?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Торговля и дистрибуция
← На главную

При интеграции торгового оборудования с конфигурацией «1С:Бухгалтерия предприятия» (БП 3.0) пользователи часто сталкиваются со следующей проблемой: при сканировании штрихкода в документе (например, в чеке или расходной накладной) товар успешно добавляется в табличную часть, но в самом справочнике «Номенклатура» при «пике» сканером ничего не происходит. Программа не переводит курсор на нужную позицию.

В этой статье мы подробно разберем, почему возникает такое поведение системы, проанализируем особенности работы сканеров штрихкода в различных режимах и рассмотрим готовые варианты решения данной задачи — от штатных возможностей платформы до программной реализации через расширение конфигурации.

Выясняем причину: почему типовая 1С:Бухгалтерия не реагирует на сканер в списке

Давайте разберем внутреннее устройство справочника номенклатуры в БП 3.0. Пользователь ожидает, что при открытии формы списка справочника достаточно «пикнуть» сканером по штрихкоду товара, и программа автоматически выделит строку с этой номенклатурой. Однако в стандартной конфигурации этого не происходит по нескольким техническим причинам:

  1. Отсутствие обработчика внешнего события. В типовой форме списка справочника Справочник.Номенклатура.ФормаСписка разработчиками «1С» не заложен алгоритм обработки внешнего события от торгового оборудования. Система просто «не слушает» сигналы сканера в этой форме.
  2. Особенности хранения штрихкодов. Штрихкод в решениях «1С» практически никогда не является реквизитом самого элемента номенклатуры. Штрихкоды хранятся в подчиненном регистре сведений РегистрСведений.ШтрихкодыНоменклатуры. Динамический список справочника отображает данные таблицы самого справочника, и по умолчанию он никак не связан с регистром штрихкодов для быстрого интерактивного поиска.
  3. Проблема режима эмуляции клавиатуры (USB-HID). Если ваш сканер подключен в режиме клавиатуры, он работает как очень быстрый наборщик текста. При сканировании он просто передает набор цифр туда, где сейчас установлен фокус ввода. Если фокус находится на самой таблице динамического списка, 1С пытается выполнить «быстрый поиск» по тем колонкам, которые отображены на экране (Наименование, Код, Артикул). Поскольку штрихкода в этих колонках нет, поиск завершается неудачей.

Давайте рассмотрим, какими путями можно решить эту задачу, в зависимости от ваших технических возможностей и требований к автоматизации.

Решение 1. Использование штатной функции поиска через клавишу F7

Перед тем как приступать к программированию, рассмотрим заложенный разработчиками «1С» стандартный механизм. Он работает «из коробки» без изменения конфигурации:

  1. Откройте форму списка справочника «Номенклатура».
  2. Нажмите на клавиатуре клавишу F7 (или нажмите на кнопку с пиктограммой штрихкода на панели формы).
  3. На экране появится модальное окно ввода штрихкода.
  4. Считайте штрихкод сканером. Данные автоматически запишутся в поле ввода, окно закроется, а система спозиционирует курсор на найденном товаре.

Этот способ надежен, но требует от пользователя лишнего действия (нажатия клавиши F7 перед каждым сканированием), что существенно замедляет потоковую работу на складе или в торговом зале.

Решение 2. Перевод сканера в режим виртуального COM-порта (Virtual COM)

Для того чтобы система могла обрабатывать сканирование в фоновом режиме (без открытия дополнительных окон поиска и без привязки к активному полю ввода), сканер необходимо перевести из режима клавиатуры в режим эмуляции COM-порта.

Выполним настройку по шагам:

  1. Найдите инструкцию к вашему сканеру штрихкодов. Обычно в ней присутствует раздел с управляющими (настроечными) штрихкодами.
  2. Считайте штрихкод, который переводит устройство в режим USB-COM (Virtual COM Port).
  3. Установите драйвер виртуального COM-порта от производителя вашего сканера (для современных ОС Windows 10/11 это часто происходит автоматически).
  4. Откройте 1С, перейдите в раздел Администрирование — Подключаемое оборудование.
  5. Создайте новое устройство с типом «Сканеры штрихкода», выберите соответствующий драйвер (например, «1С:Сканеры штрихкода (общий)») и в параметрах подключения укажите созданный виртуальный COM-порт.
  6. Выполните тест устройства. При успешном сканировании в окне теста вы должны увидеть считанный штрихкод и суффикс (обычно это CR или LF).

Важно: перевод сканера в COM-режим — это обязательный шаг для профессиональной автоматизации, однако сам по себе он не заставит форму списка номенклатуры позиционироваться на товаре без программной доработки, так как обработчик оповещения в этой форме все еще отсутствует.

Решение 3. Программная доработка формы списка через расширение конфигурации

Чтобы не снимать типовую конфигурацию «1С:Бухгалтерия предприятия» с поддержки, мы реализуем необходимый функционал с помощью механизма расширений конфигурации. Наша задача — перехватить событие сканирования, найти номенклатуру по считанному штрихкоду в регистре сведений и установить на нее фокус в динамическом списке.

Проанализируем алгоритм работы расширения и напишем код.

Добавьте в новое расширение форму списка справочника Номенклатура и перейдите в модуль этой формы. Нам потребуется подключить оборудование при открытии формы и обработать оповещение от него.

Разберем пример кода для модуля формы списка:


&НаКлиенте
Процедура Расш1_ПриОткрытииПосле(Отказ)
	// Подключаем сканер штрихкодов при открытии формы
	Попытка
		МенеджерОборудованияКлиент.ПодключитьУстройстваПоТипу(Новый УникальныйИдентификатор, "СканерШтрихкода");
	Исключение
		ЗаписьЖурналаРегистрации("ПодключениеСканера", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура Расш1_ПриЗакрытииПосле(ЗавершениеРаботы)
	// Отключаем сканер при закрытии формы, чтобы освободить порт
	Попытка
		МенеджерОборудованияКлиент.ОтключитьУстройстваПоТипу(Новый УникальныйИдентификатор, "СканерШтрихкода");
	Исключение
		ЗаписьЖурналаРегистрации("ОтключениеСканера", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура Расш1_ОбработкаОповещенияПосле(ИмяСобытия, Параметр, Источник)
	
	// Проверяем, что событие пришло от сканера штрихкода
	Если ИмяСобытия = "BarcodeScan" Или ИмяСобытия = "ВнешнееСобытие" Тогда
		
		// Получаем штрихкод из параметров события
		Штрихкод = "";
		Если ТипЗнч(Параметр) = Тип("Массив") И Параметр.Количество() > 0 Тогда
			Штрихкод = СокрЛП(Параметр[0]);
		ИначеЕсли ТипЗнч(Параметр) = Тип("Строка") Тогда
			Штрихкод = СокрЛП(Параметр);
		КонецЕсли;
		
		Если Не ПустаяСтрока(Штрихкод) Тогда
			// Ищем товар по полученному штрихкоду на сервере
			НайденныйТовар = НайтиНоменклатуруПоШтрихкодуНаСервере(Штрихкод);
			
			Если ЗначениеЗаполнено(НайденныйТовар) Тогда
				// Позиционируем динамический список на найденном элементе
				Элементы.Список.ТекущаяСтрока = НайденныйТовар;
			Иначе
				ПоказатьПредупреждение(, "Штрихкод """ + Штрихкод + """ не найден в базе данных.");
			EndIf;
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

Теперь нам необходимо реализовать серверную функцию, которая будет осуществлять поиск ссылки на номенклатуру в регистре сведений ШтрихкодыНоменклатуры. Добавим следующий код:


&НаСервереБезКонтекста
Функция НайтиНоменклатуруПоШтрихкодуНаСервере(Штрихкод)
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
		|	ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура
		|ИЗ
		|	РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
		|ГДЕ
		|	ШтрихкодыНоменклатуры.Штрихкод = &Штрихкод";
		
	Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
	
	РезультатЗапроса = Запрос.Выполнить();
	Если Не РезультатЗапроса.Пустой() Тогда
		Выборка = РезультатЗапроса.Выбрать();
		Выборка.Следующий();
		Возврат Выборка.Номенклатура;
	КонецЕсли;
	
	Возврат Справочники.Номенклатура.ПустаяСсылка();
	
КонецФункции

Анализ работы программного решения

Проанализируем, как работает написанный нами код расширения:

Таким образом, мы решили проблему юзабилити. Теперь при открытом списке номенклатуры кладовщик или менеджер может непрерывно сканировать штрихкоды товаров, а программа будет автоматически перемещать фокус на нужные позиции, позволяя быстро проверять характеристики, цены или остатки товаров в базе данных.

← На главную