При разработке легких самописных конфигураций на платформе 1С:Предприятие 8 часто возникает необходимость добавить сканирование штрихкодов — например, для быстрого создания документов, поиска номенклатуры или обращения к внешней базе данных. В типовых конфигурациях за это отвечают Библиотека стандартных подсистем (БСП) и Библиотека подключаемого оборудования (БПО). Однако внедрять эти масштабные библиотеки в небольшую базу не всегда целесообразно.
Разберем, как реализовать перехват событий сканера штрихкодов в полностью самописной конфигурации без внедрения БСП и БПО, а также как корректно передать считанные данные для создания документов и запросов к сторонней СУБД.
Прежде чем приступать к написанию программного кода, выясним принцип взаимодействия сканера с операционной системой и платформой 1С. Сканеры штрихкодов могут функционировать в двух основных режимах:
ОбработкаВнешнегоСобытия, а в обычных формах — предопределенная процедура ВнешнееСобытие.Рассмотрим основной способ работы через генерацию внешних событий. Для этого не требуется переносить всю БПО — достаточно извлечь макет с внешней компонентой (драйвером Native API) из любой типовой конфигурации (например, 1С:Управление торговлей 11 или 1С:Розница) и загрузить его в свою базу.
Разберем по шагам подключение и инициализацию компоненты:
.zip, поддерживающий x86 и x64 архитектуры).ПодключитьВнешнююКомпоненту.Посмотрим на пример программного кода подключения компоненты при открытии формы:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем внешнюю компоненту из общего макета
РезультатПодключения = ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверСканераШтрихкодов", "СканерNative", ТипВнешнейКомпоненты.Native);
Если РезультатПодключения Тогда
Попытка
ОбъектДрайвера = Новый ("AddIn.СканерNative.BarcodeScanner");
// Инициализация параметров устройства (номер порта, скорость и включение)
ОбъектДрайвера.УстановитьПараметр("Port", 3); // Номер COM-порта
ОбъектДрайвера.УстановитьПараметр("Speed", 9600);
ОбъектДрайвера.Включить(Истина);
Исключение
Сообщить("Ошибка инициализации объекта драйвера сканера: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Не удалось подключить внешнюю компоненту сканера.");
КонецЕсли;
КонецПроцедуры
После успешной инициализации при каждом считывании штрихкода на управляемой форме будет срабатывать событие ОбработкаВнешнегоСобытия:
&НаКлиенте
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
Если Событие = "BarCodeValue" Или Событие = "Штрихкод" Тогда
СчитанныйШтрихкод = СокрЛП(Данные);
// Передаем штрихкод на сервер для обработки
ОбработатьШтрихкодНаСервере(СчитанныйШтрихкод);
КонецЕсли;
КонецПроцедуры
Если нет возможности перевести сканер в режим COM-порта или использовать сторонние компоненты, проанализируем альтернативный вариант работы через режим клавиатуры:
ПолеВводаШтрихкода, и установим флаг ОчищатьПриРедактировании.ПриИзменении этого поля перехватываем считанный код и выполняем серверную обработку.
&НаКлиенте
Процедура ПолеВводаШтрихкодаПриИзменении(Элемент)
Если Не ПустаяСтрока(ПолеВводаШтрихкода) Тогда
СчитанныйШтрихкод = СокрЛП(ПолеВводаШтрихкода);
ПолеВводаШтрихкода = ""; // Очищаем поле для следующего сканирования
ОбработатьШтрихкодНаСервере(СчитанныйШтрихкод);
КонецЕсли;
КонецПроцедуры
После того как штрихкод перехвачен на клиенте, дальнейшая бизнес-логика (обращение к сторонней СУБД и запись нового документа в 1С) должна выполняться строго на стороне сервера (&НаСервере или &НаСервереБезКонтекста).
Рассмотрим основные способы связи со сторонней СУБД из платформы 1С:
Запрос.HTTPСоединение и HTTPЗапрос. Это кроссплатформенный подход, не зависящий от операционной системы сервера 1С.Новый COMОбъект("ADODB.Connection") для прямого выполнения SQL-запросов (работает только в среде Windows).Посмотрим на пример серверной процедуры, создающей документ на основании полученного кода:
&НаСервереБезКонтекста
Процедура ОбработатьШтрихкодНаСервере(Знач Штрихкод)
// 1. Получаем данные из сторонней СУБД (например, через внешний источник данных)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаСУБД.НомерЗаказа КАК НомерЗаказа,
| ТаблицаСУБД.Сумма КАК Сумма
|ИЗ
| ВнешнийИсточникДанных.ВнешняяБД.Таблица.Заказы КАК ТаблицаСУБД
|ГДЕ
| ТаблицаСУБД.Штрихкод = &Штрихкод";
Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
// 2. Создаем и заполняем новый документ в 1С
НовыйДокумент = Документы.ПоступлениеТоваров.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДатаСеанса();
НовыйДокумент.Комментарий = "Создан по штрихкоду " + Штрихкод + " (Заказ №" + Строка(Выборка.НомерЗаказа) + ")";
НовыйДокумент.СуммаДокумента = Выборка.Сумма;
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецПроцедуры
Таким образом, для интеграции сканера штрихкодов в самописную конфигурацию нет необходимости полностью внедрять БСП или БПО. Достаточно использовать внешнюю компоненту Native API из типовых конфигураций или настроить перехват ввода суффикса в режиме эмуляции клавиатуры.