Сканер штрихкода Native API в 1С — это сканер, который подключён не как «клавиатура», а через драйвер: внешняя компонента по технологии Native API читает порт и передаёт каждый код в 1С внешним событием. Типовые документы такие события уже принимают, а своя форма или внешняя обработка — нет, пока вы не подключите в ней оборудование и не назначите обработчики. Ниже — подключение драйвера через Библиотеку подключаемого оборудования (БПО), приём скана в своей форме, работа без БПО и эмуляция сканирования без сканера.
Сначала определитесь с режимом сканера: от него зависит, нужен ли драйвер.
| Режим сканера | Как данные попадают в 1С | Что нужно в коде |
|---|---|---|
| Эмуляция клавиатуры (USB HID) | Символы «печатаются» в поле, где стоит курсор | Поле ввода и обработчик окончания ввода; драйвер не нужен |
| Виртуальный COM-порт (USB-COM) | Драйвер Native API читает порт и отправляет внешнее событие | БПО или своя компонента и обработчик события в форме |
| Классический COM (RS-232) | Так же, как у виртуального COM | То же самое |
В режиме COM сканер отправляет код и суффикс, обычно CR. Драйвер собирает символы до суффикса и порождает внешнее событие: платформа вызывает ВнешнееСобытие(Источник, Событие, Данные) во всех открытых формах, где этот обработчик назначен, а последним — ОбработкаВнешнегоСобытия в модуле приложения. Дальше всё зависит от версии БПО:
ВнешнееСобытие и передаёт строки в МенеджерОборудованияКлиент.ПолучитьСобытиеОтУстройства. В ответ приходит разобранное событие: источник "ПодключаемоеОборудование", имя "ScanData" и параметр со штрихкодом.ScanData. Форма принимает его в ОбработкаОповещения и методом ЕстьНеобработанноеСобытие() проверяет, что скан ещё не обработала другая форма.Схему определите по модулю типового документа с подбором по штрихкоду: есть в ветке ScanData вызов ЕстьНеобработанноеСобытие() — схема новая.
В типовых конфигурациях с БПО (УТ 11, ERP, КА, БП 3.0, УНФ, Розница) драйвер подключают без программирования:
Экземпляр оборудования привязан к рабочему месту. БПО определяет его по идентификатору клиентского приложения, а он свой у каждого пользователя 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-портов (например, утилитой 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С занята предыдущим.
&НаКлиенте.ПриОткрытии или обработчик не назначен в событиях формы: одного совпадения имени процедуры мало.ВнешнееСобытие и ОбработкаОповещения, которая принимает рассылку БПО.Компоненте Native API не нужны регистрация в реестре Windows и права администратора. Она устанавливается из макета конфигурации и работает в 64-разрядном клиенте, если в поставке есть сборка нужной разрядности. COM-компоненты работают только в Windows, и с разрядностью у них часто проблемы.
Сканер в режиме клавиатуры работает везде. Компонентам Native API в веб-клиенте нужны расширение для работы с 1С:Предприятием и установка компоненты в браузер. Поддержка зависит от драйвера и браузера, проверьте свою связку заранее.
Так же, как в форме конфигурации: модули БПО внешней обработке доступны. Если своя компонента лежит в макете обработки, передайте в метод подключения адрес временного хранилища с двоичными данными макета вместо имени общего макета.
Да: приложение на терминале может отправлять штрихкоды в HTTP-сервис 1С. Другие варианты доступа к базе извне — в статье про API 1С.
Если сканер нужно встроить в нестандартный документ или связать с маркировкой, весами и ТСД, а дни на отладку оборудования тратить не хочется, отдайте доработку программисту с опытом БПО. Разместите задачу — оценка бесплатная, ответ в течение рабочего дня. Направления работ — на странице услуг по доработке 1С, в том числе отчёты и обработки.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.