Сканер штрихкода Native API в 1С: события и эмуляция

Дата: 19.09.2026 09:47:59
сканер штрихкода
БПО
внешняя компонента
Native API
ВнешнееСобытие
ОбработкаОповещения
подключаемое оборудование
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Управляемые

Сканер штрихкода Native API в 1С — это сканер, который подключён не как «клавиатура», а через драйвер: внешняя компонента по технологии Native API читает порт и передаёт каждый код в 1С внешним событием. Типовые документы такие события уже принимают, а своя форма или внешняя обработка — нет, пока вы не подключите в ней оборудование и не назначите обработчики. Ниже — подключение драйвера через Библиотеку подключаемого оборудования (БПО), приём скана в своей форме, работа без БПО и эмуляция сканирования без сканера.

Где встречается задача

  • Своя обработка приёмки, отгрузки или инвентаризации. Кладовщик сканирует товар — строка добавляется или растёт количество.
  • Нетиповая форма документа. В типовых документах сканер работает, а в доработанной или новой форме молчит.
  • Маркировка. Коды DataMatrix содержат служебный символ GS, который в режиме эмуляции клавиатуры часто теряется, поэтому сканер переводят в режим COM-порта.
  • Сборка заказов для маркетплейсов. Упаковщик сканирует товар, и 1С сверяет его с заказом (про обмен заказами — в статье об интеграции 1С с Яндекс Маркетом).

Как штрихкод попадает в форму

Сначала определитесь с режимом сканера: от него зависит, нужен ли драйвер.

Режим сканераКак данные попадают в 1СЧто нужно в коде
Эмуляция клавиатуры (USB HID)Символы «печатаются» в поле, где стоит курсорПоле ввода и обработчик окончания ввода; драйвер не нужен
Виртуальный COM-порт (USB-COM)Драйвер Native API читает порт и отправляет внешнее событиеБПО или своя компонента и обработчик события в форме
Классический COM (RS-232)Так же, как у виртуального COMТо же самое

В режиме COM сканер отправляет код и суффикс, обычно CR. Драйвер собирает символы до суффикса и порождает внешнее событие: платформа вызывает ВнешнееСобытие(Источник, Событие, Данные) во всех открытых формах, где этот обработчик назначен, а последним — ОбработкаВнешнегоСобытия в модуле приложения. Дальше всё зависит от версии БПО:

  • Старая схема. Форма сама ловит ВнешнееСобытие и передаёт строки в МенеджерОборудованияКлиент.ПолучитьСобытиеОтУстройства. В ответ приходит разобранное событие: источник "ПодключаемоеОборудование", имя "ScanData" и параметр со штрихкодом.
  • Новая схема (актуальные УТ 11, ERP, КА). Событие разбирает БПО и рассылает формам оповещение ScanData. Форма принимает его в ОбработкаОповещения и методом ЕстьНеобработанноеСобытие() проверяет, что скан ещё не обработала другая форма.

Схему определите по модулю типового документа с подбором по штрихкоду: есть в ветке ScanData вызов ЕстьНеобработанноеСобытие() — схема новая.

Сканер штрихкода Native API: подключение драйвера в БПО

В типовых конфигурациях с БПО (УТ 11, ERP, КА, БП 3.0, УНФ, Розница) драйвер подключают без программирования:

  1. Переведите сканер в режим виртуального COM-порта. Обычно для этого сканируют служебный штрихкод из инструкции производителя; в диспетчере устройств Windows появится новый COM-порт.
  2. Откройте список подключаемого оборудования в разделе администрирования (в УТ и ERP — группа «РМК и оборудование»).
  3. Создайте экземпляр типа «Сканер штрихкода» и выберите драйвер «1С:Сканеры штрихкода (NativeApi)». Если драйвер на компьютере не установлен, установите его из карточки.
  4. Укажите порт, скорость и суффикс, нажмите «Тест устройства» и отсканируйте любой код.

Экземпляр оборудования привязан к рабочему месту. БПО определяет его по идентификатору клиентского приложения, а он свой у каждого пользователя Windows на каждом компьютере (в веб-клиенте — у браузера). На другом компьютере, под другой учётной записью Windows или в другой RDP-сессии сканер придётся подключить заново, даже если пользователь 1С тот же.

Сканер штрихкода в своей форме через БПО

Пример — форма обработки с табличной частью Товары под новую схему. Она подключает сканер при открытии, отключает при закрытии, принимает оповещение ScanData и ищет товар в регистре ШтрихкодыНоменклатуры (УТ 11, ERP, КА; в других конфигурациях сверьте имена в конфигураторе).

// Модуль формы обработки «Сканирование товаров».
// Конфигурация с БПО, где типовые документы принимают скан в ОбработкаОповещения
// с проверкой ЕстьНеобработанноеСобытие (актуальные УТ 11, ERP, КА: сверьте с модулем
// любого документа с подбором по штрихкоду). Платформа 8.3.8 и выше.
// Реквизит Объект.Товары: Штрихкод (Строка), Номенклатура, Характеристика, Упаковка
// (ссылки на справочники конфигурации), КоличествоУпаковок (Число). На форме — таблица Товары.
// ПриОткрытии, ПриЗакрытии и ОбработкаОповещения назначьте в свойствах формы (закладка «События»).

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	Оповещение = Новый ОписаниеОповещения("РаботаСОборудованиемЗавершение", ЭтотОбъект, "подключении");
	МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПоТипу(Оповещение, УникальныйИдентификатор,
		ТипыОборудованияФормы());
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	Если ЗавершениеРаботы Тогда
		Возврат; // сеанс завершается, порт освободится вместе с клиентом
	КонецЕсли;
	Оповещение = Новый ОписаниеОповещения("РаботаСОборудованиемЗавершение", ЭтотОбъект, "отключении");
	МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПоТипу(Оповещение, УникальныйИдентификатор,
		ТипыОборудованияФормы());
КонецПроцедуры

&НаКлиенте
Функция ТипыОборудованияФормы()
	Типы = Новый Массив;
	Типы.Добавить("СканерШтрихкода");
	Возврат Типы;
КонецФункции

&НаКлиенте
Процедура РаботаСОборудованиемЗавершение(РезультатВыполнения, Действие) Экспорт
	Если ТипЗнч(РезультатВыполнения) <> Тип("Структура")
		Или Не РезультатВыполнения.Свойство("Результат")
		Или РезультатВыполнения.Результат Тогда
		Возврат;
	КонецЕсли;
	ТекстОшибки = "";
	Если РезультатВыполнения.Свойство("ОписаниеОшибки") Тогда
		ТекстОшибки = РезультатВыполнения.ОписаниеОшибки;
	КонецЕсли;
	СообщитьОператору(СтрШаблон(НСтр("ru = 'Ошибка при %1 сканера: %2'"), Действие, ТекстОшибки));
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	// Модуль с ЕстьНеобработанноеСобытие зависит от версии конфигурации:
	// скопируйте вызов из модуля типового документа
	Если Источник = "ПодключаемоеОборудование"
		И ИмяСобытия = "ScanData"
		И ВводДоступен()
		И МенеджерОборудованияКлиентПереопределяемый.ЕстьНеобработанноеСобытие() Тогда
		ОбработатьДанныеСканера(Параметр);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьДанныеСканера(Параметр)
	Штрихкод = ШтрихкодИзПараметра(Параметр);
	Если Не ПустаяСтрока(Штрихкод) Тогда
		ОбработатьШтрихкод(Штрихкод);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ШтрихкодИзПараметра(Параметр)
	// [0] — основные данные, [1][1] — штрихкод из дополнительных данных, если они есть
	Значение = Неопределено;
	Если ТипЗнч(Параметр) = Тип("Массив") И Параметр.Количество() > 0 Тогда
		Значение = Параметр[0];
		Если Параметр.Количество() > 1
			И ТипЗнч(Параметр[1]) = Тип("Массив")
			И Параметр[1].Количество() > 1 Тогда
			Значение = Параметр[1][1];
		КонецЕсли;
	ИначеЕсли ТипЗнч(Параметр) = Тип("Строка") Тогда
		Значение = Параметр;
	КонецЕсли;
	Если ТипЗнч(Значение) <> Тип("Строка") Тогда
		Возврат "";
	КонецЕсли;
	Возврат СокрЛП(Значение);
КонецФункции

&НаКлиенте
Процедура ОбработатьШтрихкод(Штрихкод)
	Найденные = Объект.Товары.НайтиСтроки(Новый Структура("Штрихкод", Штрихкод));
	Если Найденные.Количество() > 0 Тогда
		СтрокаТоваров = Найденные[0];
	Иначе
		ДанныеШтрихкода = ДанныеПоШтрихкоду(Штрихкод);
		Если ДанныеШтрихкода = Неопределено Тогда
			СообщитьОператору(СтрШаблон(НСтр("ru = 'Штрихкод %1 не найден в базе'"), Штрихкод));
			Возврат; // строку без номенклатуры не создаём
		КонецЕсли;
		СтрокаТоваров = Объект.Товары.Добавить();
		СтрокаТоваров.Штрихкод = Штрихкод;
		ЗаполнитьЗначенияСвойств(СтрокаТоваров, ДанныеШтрихкода);
	КонецЕсли;
	// Считаем упаковки: у штуки и у коробки разные штрихкоды, значит, и разные строки
	СтрокаТоваров.КоличествоУпаковок = СтрокаТоваров.КоличествоУпаковок + 1;
	Элементы.Товары.ТекущаяСтрока = СтрокаТоваров.ПолучитьИдентификатор();
	Модифицированность = Истина;
КонецПроцедуры

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

&НаКлиенте
Процедура СообщитьОператору(Текст)
	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = Текст;
	Сообщение.Сообщить();
КонецПроцедуры

Листинг считает упаковки, а не штуки: в УТ 11, ERP и КА штрихкод может принадлежать коробке и конкретной характеристике. Количество в базовых единицах — КоличествоУпаковок, умноженное на коэффициент упаковки (его реквизиты зависят от версии конфигурации).

Вариант для старой схемы

Если типовые формы сами разбирают ВнешнееСобытие и не вызывают ЕстьНеобработанноеСобытие(), принимайте скан во внешнем событии формы. Разбор штрихкода и поиск товара берутся из первого листинга.

// Вариант для старой схемы: типовые формы сами разбирают ВнешнееСобытие,
// проверки ЕстьНеобработанноеСобытие в них нет.
// Подключение и отключение — теми же методами, что в модуле типового документа.
// В событиях формы назначьте ВнешнееСобытие; ОбработкаОповещения из первого листинга удалите.

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
	// Событие получают все открытые формы, обрабатывает только активная
	Если Не ВводДоступен() Тогда
		Возврат;
	КонецЕсли;
	ОписаниеСобытия = Новый Структура("Источник, Событие, Данные", Источник, Событие, Данные);
	ОписаниеОшибки = "";
	Результат = МенеджерОборудованияКлиент.ПолучитьСобытиеОтУстройства(ОписаниеСобытия, ОписаниеОшибки);
	Если Результат = Неопределено Тогда
		Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
			СообщитьОператору(НСтр("ru = 'Ошибка обработки события устройства: '") + ОписаниеОшибки);
		КонецЕсли;
	ИначеЕсли Результат.Источник = "ПодключаемоеОборудование" И Результат.ИмяСобытия = "ScanData" Тогда
		ОбработатьДанныеСканера(Результат.Параметр);
	КонецЕсли;
КонецПроцедуры

Не совмещайте схемы в одной форме, иначе один скан посчитается дважды.

Разбор ключевых строк

  • НачатьПодключениеОборудованиеПоТипу — асинхронный метод БПО: подключает сканеры текущего рабочего места и связывает их с формой через УникальныйИдентификатор. В других версиях БПО встречаются НачатьПодключениеОборудованиеПриОткрытииФормы, синхронный ПодключитьОборудованиеПриОткрытииФормы и обёртки в МенеджерОборудованияКлиентПереопределяемый. Берите вызов из типового документа.
  • ПриЗакрытии — без отключения порт остаётся за закрытой формой. При ЗавершениеРаботы = Истина ничего не делаем: с версии 8.3.8 в этом режиме нельзя вызывать сервер и открывать окна, а порт освободится вместе с клиентом.
  • ЕстьНеобработанноеСобытие() — проверяет флаг «событие обработано» и сразу его взводит, поэтому один скан достаётся одной форме. Ставьте проверку последней (условие с И вычисляется слева направо до первого Ложь): если метод вызовет неактивная форма, до активной скан не дойдёт.
  • ВводДоступен() — оповещение получают все открытые формы, а обработать скан должно только активное окно.
  • ШтрихкодИзПараметра — штрихкод лежит в Параметр[0], а если драйвер передал дополнительные данные — в Параметр[1][1]. Проверка типов защищает от неожиданного формата.
  • Возврат для неизвестного штрихкода — строку без номенклатуры не создаём. Иначе повторный скан найдёт её по полю Штрихкод, на сервер не пойдёт, и номенклатура не заполнится даже после регистрации кода.
  • &НаСервереБезКонтекста — на сервер уходит только строка штрихкода, без данных формы. При потоковом сканировании это заметно быстрее, чем &НаСервере.

Эмуляция сканера штрихкода для отладки

Без оборудования логику проверяют на трёх уровнях: код своей формы, типовые формы через оповещение и вся цепочка вместе с драйвером.

Кнопка «Эмулировать скан» в своей форме

Команда передаёт введённый штрихкод в тот же обработчик и в том же формате, что сканер, минуя ОбработкаОповещения и ВнешнееСобытие, поэтому работает при любой схеме БПО.

// Дополнение к модулю формы из первого листинга.
// Реквизит формы ТестовыйШтрихкод (Строка), команда ЭмулироватьСкан.

&НаКлиенте
Процедура ЭмулироватьСкан(Команда)
	Оповещение = Новый ОписаниеОповещения("ЭмулироватьСканЗавершение", ЭтотОбъект);
	ПоказатьВводСтроки(Оповещение, ТестовыйШтрихкод, НСтр("ru = 'Штрихкод для эмуляции'"), 200);
КонецПроцедуры

&НаКлиенте
Процедура ЭмулироватьСканЗавершение(ВведенныйШтрихкод, ДополнительныеПараметры) Экспорт
	Если ВведенныйШтрихкод = Неопределено Тогда
		Возврат; // нажали «Отмена»
	КонецЕсли;
	ТестовыйШтрихкод = ВведенныйШтрихкод;
	ОбработатьДанныеСканера(ПараметрСканаДляЭмуляции(ВведенныйШтрихкод));
КонецПроцедуры

&НаКлиенте
Функция ПараметрСканаДляЭмуляции(Штрихкод)
	// Тот же формат, что отдаёт БПО: [0] — штрихкод, [1] — дополнительные данные
	Параметр = Новый Массив;
	Параметр.Добавить(Штрихкод);
	Параметр.Добавить(Неопределено);
	Возврат Параметр;
КонецФункции

Кнопку скройте от кладовщиков: в ПриСозданииНаСервере показывайте её только полноправным пользователям (на БСП — Пользователи.ЭтоПолноправныйПользователь()).

Эмулятор через Оповестить для типовых форм

Внешняя обработка может разослать оповещение ScanData так же, как БПО. Формы старой схемы, где ветка ScanData проверяет лишь источник и ВводДоступен(), примут его сразу. Формы с ЕстьНеобработанноеСобытие() голое оповещение проигнорируют: флаг «событие обработано» уже взведён. В УТ 11 и ERP 2.x флаг хранится в глобальной переменной модуля приложения, и эмулятор сбрасывает его перед рассылкой (имя переменной сверьте с модулем приложения своей версии). Задержка в три секунды — чтобы успеть перейти в документ.

// Форма внешней обработки «Эмулятор сканера».
// Реквизит формы Штрихкод (Строка), команда ОтправитьСкан.

&НаКлиенте
Процедура ОтправитьСкан(Команда)
	Если ПустаяСтрока(Штрихкод) Тогда
		Возврат;
	КонецЕсли;
	ПодключитьОбработчикОжидания("ОтправитьСканОтложенно", 3, Истина);
	ПоказатьОповещениеПользователя(НСтр("ru = 'Эмулятор сканера'"), ,
		НСтр("ru = 'Перейдите в нужную форму: скан уйдёт через 3 секунды'"));
КонецПроцедуры

&НаКлиенте
Процедура ОтправитьСканОтложенно() Экспорт
	Параметр = Новый Массив;
	Параметр.Добавить(СокрЛП(Штрихкод));
	Параметр.Добавить(Неопределено);
	Если Не СброситьФлагСобытияБПО() Тогда
		ПоказатьОповещениеПользователя(НСтр("ru = 'Эмулятор сканера'"), ,
			НСтр("ru = 'Флаг БПО не найден: формы с ЕстьНеобработанноеСобытие скан не примут'"));
	КонецЕсли;
	Оповестить("ScanData", Параметр, "ПодключаемоеОборудование");
КонецПроцедуры

&НаКлиенте
Функция СброситьФлагСобытияБПО()
	// Глобальная переменная модуля приложения в УТ 11 и ERP 2.x: имя сверьте со своей версией.
	// Обращаемся через Вычислить и Выполнить: прямое присваивание в конфигурации без этой
	// переменной молча создало бы локальную переменную, и сброс ничего бы не делал.
	ИмяФлага = "глПодключаемоеОборудованиеСобытиеОбработано";
	Попытка
		ТекущееЗначение = Вычислить(ИмяФлага); // есть ли такая переменная
	Исключение
		Возврат Ложь; // переменной нет: остаётся виртуальный COM-порт
	КонецПопытки;
	Выполнить(ИмяФлага + " = Ложь");
	Возврат Истина;
КонецФункции

Оповестить рассылает событие всем открытым формам, поэтому на время теста закройте документы, которые менять нельзя.

Вся цепочка без сканера: виртуальные COM-порты

Способ нужен, когда такой переменной в вашей версии нет или проверить надо заодно драйвер и настройки БПО. Создайте пару связанных виртуальных COM-портов (например, утилитой com0com). В карточке сканера укажите один порт пары, а во второй отправьте из терминальной программы строку со штрихкодом и CR в конце. Для драйвера и БПО это не отличается от настоящего сканера.

Эмуляция в типовой форме на БПО

В УТ 11, КА 2, ERP 2, УНФ, Рознице и БП 3.0 форма документа данные сканера сама не разбирает: ВнешнееСобытие передаёт их в МенеджерОборудованияКлиент.ПолучитьСобытиеОтУстройства, а результат уходит в ОбработкаОповещения формы с именем события "ScanData".

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

Чтобы пройти именно ветку ОбработкаОповещения, отправьте форме такое же оповещение, как БПО, из небольшой внешней обработки:

// Форма внешней обработки "Эмулятор сканера" для типовых форм на БПО.
// Реквизит формы: Штрихкод (Строка). Команда: ОтправитьСкан.

&НаКлиенте
Процедура ОтправитьСкан(Команда)

	Если ПустаяСтрока(Штрихкод) Тогда
		Возврат;
	КонецЕсли;

	ПоказатьОповещениеПользователя(НСтр("ru = 'Перейдите в документ: скан через 3 секунды'"));
	ПодключитьОбработчикОжидания("ОтправитьОповещениеСканера", 3, Истина);

КонецПроцедуры

&НаКлиенте
Процедура ОтправитьОповещениеСканера()

	// Формат Параметр возьмите из ОбработкаОповещения своей формы.
	// Здесь вариант "массив: [0] - штрихкод, [1] - Неопределено".
	Параметр = Новый Массив;
	Параметр.Добавить(СокрЛП(Штрихкод));
	Параметр.Добавить(Неопределено);

	// УТ 11, КА 2, ERP 2: форма берёт ScanData, только если
	// МенеджерОборудованияУТКлиент.ЕстьНеобработанноеСобытие() вернёт Истина.
	// Функция смотрит этот флаг модуля управляемого приложения,
	// при настоящем скане его сбрасывает БПО. Имя сверьте со своей редакцией.
	// Где такой переменной нет, присваивание создаст локальную переменную.
	глПодключаемоеОборудованиеСобытиеОбработано = Ложь;

	Оповестить("ScanData", Параметр, "ПодключаемоеОборудование");

КонецПроцедуры

Задержка нужна из-за той же проверки ВводДоступен(): пока активна форма эмулятора, документ оповещение проигнорирует. Нажмите кнопку и за три секунды перейдите в документ.

В УТ 11, КА 2 и ERP 2 условие в ОбработкаОповещения строже: форма проверяет ещё МенеджерОборудованияУТКлиент.ЕстьНеобработанноеСобытие(), то есть глобальный флаг глПодключаемоеОборудованиеСобытиеОбработано. При настоящем скане его сбрасывает цепочка от драйвера, а без сброса форма молча проигнорирует эмулятор. Условие и разбор Параметр найдите в модуле формы поиском по "ScanData" и повторите. Если проверка устроена иначе, остаётся ручной ввод.

Полная эмуляция вместе с драйвером

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

Что прогнать перед сдачей доработки

ПроверкаЧто ввестиОжидаемый результат
Известный кодШтрихкод из регистра штрихкодов копии базыДобавлена строка, количество 1
Повторный сканТот же код ещё разКоличество 2, новой строки нет
Неизвестный кодТестовый EAN-13, которого нет в базеПонятное сообщение, форма не падает
Мусор по краямКод с пробелами, вставленный из буфераПробелы обрезаны, код найден
Ведущий нольКод, начинающийся с 0Ноль не потерян
Код маркировкиDataMatrix с меткой <GS> между группами — командой и через полеРазделители восстановлены в обоих случаях, проверка кода проходит
Серия30–50 кодов спискомВремя обработки приемлемое, дублей нет
Реальный сканерСкан при закрытых остальных документахФорма реагирует без чужого подключения
Две открытые формыСкан при открытых двух документахТовар добавлен только в активный

Внешняя компонента сканера без БПО

Если БПО в конфигурации нет или устройство нестандартное, внешнюю компоненту подключают напрямую. Компонента кладётся в общий макет типа «Внешняя компонента», подключается асинхронно и создаётся конструктором Новый("AddIn.Имя.Объект"). Её события приходят в ВнешнееСобытие без разбора: Источник, Событие и Данные — ровно те строки, что передала компонента.

// Форма без БПО: своя компонента Native API лежит в общем макете КомпонентаСканера.
// ScanAddIn — имя, которое мы задаём при подключении, Scanner — объект внутри компоненты.
// ИсточникКомпоненты и Barcode — строки, которые сама компонента передаёт в ExternalEvent:
// возьмите их из её описания, с именем ScanAddIn они совпадать не обязаны.
// Реквизит Товары, ОбработатьШтрихкод, ДанныеПоШтрихкоду и СообщитьОператору — из первого листинга.
// ПриОткрытии, ПриЗакрытии и ВнешнееСобытие назначьте в событиях формы.

&НаКлиенте
Перем Сканер; // объект компоненты живёт, пока открыта форма

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ПодключитьКомпонентуСканера(Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	// Здесь вызовите метод компоненты, который закрывает порт (см. её описание),
	// затем освободите объект
	Сканер = Неопределено;
КонецПроцедуры

&НаКлиенте
Процедура ПодключитьКомпонентуСканера(ПослеУстановки)
	Оповещение = Новый ОписаниеОповещения("ПодключитьКомпонентуСканераЗавершение", ЭтотОбъект, ПослеУстановки);
	НачатьПодключениеВнешнейКомпоненты(Оповещение, "ОбщийМакет.КомпонентаСканера", "ScanAddIn",
		ТипВнешнейКомпоненты.Native);
КонецПроцедуры

&НаКлиенте
Процедура ПодключитьКомпонентуСканераЗавершение(Подключено, ПослеУстановки) Экспорт
	Если Подключено Тогда
		Сканер = Новый("AddIn.ScanAddIn.Scanner");
		// Дальше — методы самой компоненты: указать порт, открыть устройство и т. д.
	ИначеЕсли Не ПослеУстановки Тогда
		Оповещение = Новый ОписаниеОповещения("УстановитьКомпонентуСканераЗавершение", ЭтотОбъект);
		НачатьУстановкуВнешнейКомпоненты(Оповещение, "ОбщийМакет.КомпонентаСканера");
	Иначе
		СообщитьОператору(НСтр("ru = 'Не удалось подключить внешнюю компоненту сканера'"));
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьКомпонентуСканераЗавершение(ДополнительныеПараметры) Экспорт
	ПодключитьКомпонентуСканера(Истина);
КонецПроцедуры

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
	Если Источник = "ИсточникКомпоненты" И Событие = "Barcode" И ВводДоступен() Тогда
		ОбработатьШтрихкод(СокрЛП(Данные));
	КонецЕсли;
КонецПроцедуры

С версии 8.3.18 то же самое короче пишется через Асинх-процедуру и Ждать ПодключитьВнешнююКомпонентуАсинх(...). Если компоненту пишете сами, учтите очередь внешних событий: её длину задаёт компонента методом SetEventBufferDepth. При короткой очереди быстрые сканы подряд теряются, пока 1С занята предыдущим.

Типичные ошибки

  • «Переменная не определена (МенеджерОборудованияКлиент)». Код попал в серверную процедуру или в конфигурации нет БПО. Работа с оборудованием — только в &НаКлиенте.
  • «Метод объекта не обнаружен (ЕстьНеобработанноеСобытие)». Код скопирован из другой конфигурации или версии, а у вас метод лежит в другом общем модуле. Найдите вызов поиском по конфигурации.
  • «Тип не определен (AddIn.ScanAddIn.Scanner)». Объект компоненты создаётся до завершения подключения или имена не совпадают. Среднее слово — имя, указанное при подключении, последнее — имя объекта внутри компоненты.
  • Штрихкод печатается в поле, а событие не приходит. Сканер в режиме клавиатуры. Отсканируйте код в «Блокноте»: если текст появился, драйвер его не увидит, нужен режим COM.
  • В типовых документах сканер работает, в своей форме — нет. Нет подключения в ПриОткрытии или обработчик не назначен в событиях формы: одного совпадения имени процедуры мало.
  • Один скан добавляет две штуки. В форме смешаны схемы: прямая обработка в ВнешнееСобытие и ОбработкаОповещения, которая принимает рассылку БПО.
  • Порт занят. Порт держит другая программа (утилита производителя, второй сеанс 1С) или форма, не отключившая оборудование при закрытии.
  • Терминальный сервер. Драйвер работает там, где запущен клиент 1С, то есть на сервере терминалов. COM-порт локального компьютера нужно пробросить в RDP-сессию, а сканер настроить на рабочем месте каждой сессии.

Частые вопросы

Чем драйвер Native API лучше старого COM-драйвера сканера?

Компоненте Native API не нужны регистрация в реестре Windows и права администратора. Она устанавливается из макета конфигурации и работает в 64-разрядном клиенте, если в поставке есть сборка нужной разрядности. COM-компоненты работают только в Windows, и с разрядностью у них часто проблемы.

Работает ли сканер в веб-клиенте?

Сканер в режиме клавиатуры работает везде. Компонентам Native API в веб-клиенте нужны расширение для работы с 1С:Предприятием и установка компоненты в браузер. Поддержка зависит от драйвера и браузера, проверьте свою связку заранее.

Как подключить сканер во внешней обработке?

Так же, как в форме конфигурации: модули БПО внешней обработке доступны. Если своя компонента лежит в макете обработки, передайте в метод подключения адрес временного хранилища с двоичными данными макета вместо имени общего макета.

Можно ли принимать штрихкоды с Android-терминала без драйвера?

Да: приложение на терминале может отправлять штрихкоды в HTTP-сервис 1С. Другие варианты доступа к базе извне — в статье про API 1С.

Когда проще заказать

Если сканер нужно встроить в нестандартный документ или связать с маркировкой, весами и ТСД, а дни на отладку оборудования тратить не хочется, отдайте доработку программисту с опытом БПО. Разместите задачу — оценка бесплатная, ответ в течение рабочего дня. Направления работ — на странице услуг по доработке 1С, в том числе отчёты и обработки.

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.