Сканер штрих кода в 1С подключают как клавиатуру, которая «печатает» код в поле под курсором, или через драйвер, который сам отдаёт код документу. Ниже — что выбрать, настройка в УТ 11.4, проверка и поломки из практики: потерянный ноль EAN-13, русские буквы, префикс, документ без реакции. В конце — обработка, которая принимает скан и исправляет такие коды.
Сканер — самое простое торговое оборудование в 1С, но способов подключения три. Из коробки USB-сканер обычно эмулирует клавиатуру (HID): «набирает» код и нажимает Enter.
| Вариант | Что настроить | Плюсы | Минусы |
|---|---|---|---|
| Клавиатура без драйвера | Ничего | Работает в любом поле, в веб-клиенте и по RDP | В документах УТ 11.4 перед сканом — F7 «Поиск по штрихкоду»; зависит от раскладки |
| Клавиатура + драйвер «1С:Сканеры штрихкода (NativeApi)», порт «Клавиатура» | Экземпляр в «Подключаемом оборудовании» | Документ принимает скан сам, сканер остаётся в режиме клавиатуры | Настройка и установка компоненты на каждом рабочем месте |
| Виртуальный COM-порт + тот же драйвер | Режим USB-COM в сканере, номер порта в 1С | Раскладка не мешает, разделитель GS кодов маркировки доходит | Сканер больше не печатает в другие программы; в RDP порт нужно пробрасывать |
Клавиатуры хватит для поиска в справочнике, драйвер нужен для потокового сканирования в документах, COM-порт — для маркировки. «COM» в названии старого драйвера «1С:Сканеры штрихкода (COM)» — технология компоненты, а не порт; берите NativeApi.
Настройка торгового оборудования в 1С (пути — по УТ 11.4, в КА 2.5 та же панель):
Начните с Блокнота Windows:
]E0 или другие символы перед кодом — префикс.Сравните длину с цифрами на упаковке; в 1С без драйвера проверьте скан через F7 в документе, а непонятный скан разберите обработкой ниже.
Из практики: товар с EAN-13 на 0 не находился в 1С, хотя код в карточке был, — сканер по умолчанию отдавал 12 цифр. EAN-13 с нулём впереди рисуется теми же штрихами, что UPC-A: первая цифра EAN-13 задаётся чередованием наборов в левой половине, и для нуля оно совпадает с UPC-A. Сканер видит UPC-A и вместо 0012345678905 передаёт 012345678905.
В УТ 11.4 пользователь без права регистрировать штрихкоды получит «Номенклатура со штрихкодом 012345678905 не найдена», с правом — форму «Поиск номенклатуры по штрихкоду». Привязывать там 12-значный код не надо: у товара появится лишний код.
Лечится настроечным штрихкодом из руководства модели:
Сброс сканера к заводским настройкам вернёт пункт в значение по умолчанию. Страховка в 1С — нормализация из листинга ниже: она дописывает ноль к 12 цифрам с верной контрольной цифрой, а поиск пробует оба варианта. Какие товары затронет потеря нуля и нет ли уже 12-значных двойников, покажет запрос для бесплатной консоли запросов — он только читает данные:
// Консоль запросов, УТ 11 / КА 2 / ERP 2. Запрос только читает данные.
// EAN-13 с нулём впереди: без настройки «UPC-A в EAN-13» сканер прочитает их 12 цифрами.
// Двойник12 заполнен, если тот же код уже записан и в 12-значном виде.
ВЫБРАТЬ
Полный.Штрихкод КАК EAN13,
Полный.Номенклатура КАК Номенклатура,
Полный.Характеристика КАК Характеристика,
Короткий.Штрихкод КАК Двойник12,
Короткий.Номенклатура КАК НоменклатураДвойника
ИЗ
РегистрСведений.ШтрихкодыНоменклатуры КАК Полный
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК Короткий
ПО (ПОДСТРОКА(Полный.Штрихкод, 2, 12) = Короткий.Штрихкод)
ГДЕ
Полный.Штрихкод ПОДОБНО "0[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"
УПОРЯДОЧИТЬ ПО
Двойник12 УБЫВ,
EAN13
Двойник того же товара после настройки сканеров удалите вручную в списке его штрихкодов; другой товар в «НоменклатураДвойника» — конфликт кодов, его решают отдельно.
В режиме клавиатуры сканер шлёт нажатия клавиш, а текст из них делает Windows по текущей раскладке. Цифры верхнего ряда в английской и русской раскладках одинаковы, поэтому EAN-13 обычно доходит целым, а коды с латиницей (Code 128, Code 39, маркировка) ломаются: ABC-123 превращается в ФИС-123. Знаки вместо цифр — у сканера выбрана чужая раскладка (во французской цифры набираются с Shift, и в русской раскладке выходит !"№;%:?) или в Windows включена «Русская (машинопись)», где цифры тоже на Shift. Перевёрнутый регистр букв — Caps Lock. Лечение: английская раскладка перед сканированием, драйвер с портом «Клавиатура» (проверьте скан латиницы с флажком «Игнорировать состояние клавиатуры»), COM-порт или функция ИсправитьРаскладку.
На RDS бывает своя причина: при входе Windows берёт раскладку клиента, и если языки на клиенте и сервере не совпали, в сеансе появляется лишняя раскладка вроде «Русский — США» — индикатор показывает одно, печатается другое. Microsoft описывает для этого параметр IgnoreRemoteKeyboardLayout (KB 924852 написана для Windows Server 2003, на 2012 R2 и новее его применяют по практике): сеанс берёт раскладку из профиля пользователя, а не с клиента. Правка действует на всех пользователей сервера, поэтому сначала копия ветки и проверка на одном сервере фермы:
:: Сервер терминалов, командная строка от имени администратора.
:: 1. Копия ветки, чтобы зафиксировать исходное состояние (папка C:\backup должна существовать)
reg export "HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layout" C:\backup\keyboard-layout.reg
:: 2. Сеанс RDP берёт раскладку из профиля пользователя, а не с клиента
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layout" /v IgnoreRemoteKeyboardLayout /t REG_DWORD /d 1 /f
:: 3. Проверка: в ответе должно быть REG_DWORD 0x1
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layout" /v IgnoreRemoteKeyboardLayout
:: Откат - удалить параметр:
:: reg delete "HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layout" /v IgnoreRemoteKeyboardLayout /f
Затем каждый пользователь настраивает раскладки в своём сеансе и выходит из системы; перезагрузка обычно не нужна. Остальное о сервере — в статье 1С на терминальном сервере.
]E0 перед EAN-13 или ]C1 перед GS1-128 — идентификатор символики (AIM ID), другие символы — запрограммированный префикс. Без драйвера они становятся частью кода: отключите их в сканере или отрежьте в коде. Драйверу префикс, наоборот, помогает узнать начало скана — впишите его в параметр «Префикс».
Enter после кода подтверждает окно «Введите штрихкод» после F7 и вызывает ПриИзменении в своём поле. Без суффикса код висит в поле, с суффиксом Tab фокус прыгает на соседнее поле. Нужен CR (Enter), в драйвере — «Суффикс» 13.
Обработка для приёмки без драйвера: кладовщик сканирует в одно поле, строки копятся в таблице, под полем виден разбор скана. Такое сканирование штрих кода в 1С работает в любом клиенте, включая веб и RDP. Поиск — по регистру ШтрихкодыНоменклатуры (УТ 11, КА 2, ERP 2) без характеристик и упаковок: полный поиск — в статье о штрихкодах товаров, приём через события БПО — в статье про Native API.
// Модуль формы внешней обработки «Приёмка сканером»: сканер в режиме клавиатуры, драйвер не нужен.
// Реквизиты обработки: ПолеСкана, ПоследнийСкан (Строка); табличная часть Товары:
// Штрихкод (Строка, 200), Номенклатура (СправочникСсылка.Номенклатура), Количество (Число, 15, 3).
// На форме: поле ПолеСкана (событие ПриИзменении), поле ПоследнийСкан (только просмотр),
// таблица Товары; событие формы ПриОткрытии.
// НормализоватьШтрихкод, ВариантыПоиска и ОписаниеСкана - из листингов ниже, в этом же модуле.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ТекущийЭлемент = Элементы.ПолеСкана;
КонецПроцедуры
&НаКлиенте
Процедура ПолеСканаПриИзменении(Элемент)
// После Enter фокус может уйти на соседний элемент: вернём его, когда платформа закончит
ПодключитьОбработчикОжидания("ВернутьФокусВПолеСкана", 0.1, Истина);
Сырой = Объект.ПолеСкана;
Объект.ПолеСкана = ""; // иначе повторный скан того же кода не вызовет ПриИзменении
Код = НормализоватьШтрихкод(Сырой);
Объект.ПоследнийСкан = ОписаниеСкана(Сырой, Код);
Если Код <> "" Тогда
ДобавитьТовар(Код);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВернутьФокусВПолеСкана()
ТекущийЭлемент = Элементы.ПолеСкана;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьТовар(Код)
Найденные = Объект.Товары.НайтиСтроки(Новый Структура("Штрихкод", Код));
Если Найденные.Количество() > 0 Тогда
СтрокаТовара = Найденные[0];
Иначе
Номенклатура = НоменклатураПоШтрихкоду(ВариантыПоиска(Код));
Если Номенклатура = Неопределено Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = СтрШаблон(НСтр("ru = 'Штрихкод %1 не найден. %2'"), Код, Объект.ПоследнийСкан);
Сообщение.Сообщить();
Возврат; // строку без товара не добавляем
КонецЕсли;
СтрокаТовара = Объект.Товары.Добавить();
СтрокаТовара.Штрихкод = Код;
СтрокаТовара.Номенклатура = Номенклатура;
КонецЕсли;
СтрокаТовара.Количество = СтрокаТовара.Количество + 1;
Элементы.Товары.ТекущаяСтрока = СтрокаТовара.ПолучитьИдентификатор();
КонецПроцедуры
// УТ 11, КА 2, ERP 2: регистр сведений ШтрихкодыНоменклатуры.
// Варианты[0] - код после нормализации, он важнее варианта без ведущего нуля.
&НаСервереБезКонтекста
Функция НоменклатураПоШтрихкоду(Варианты)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Штрихкод КАК Штрихкод,
| Штрихкоды.Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды
|ГДЕ
| Штрихкоды.Штрихкод В (&Варианты)";
Запрос.УстановитьПараметр("Варианты", Варианты);
Найдено = Неопределено;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Штрихкод = Варианты[0] Тогда
Возврат Выборка.Номенклатура;
КонецЕсли;
Найдено = Выборка.Номенклатура;
КонецЦикла;
Возврат Найдено;
КонецФункции
Функции — в том же модуле формы, директива &НаКлиентеНаСервереБезКонтекста. Для нескольких форм перенесите их в общий модуль «Клиент + Сервер» без директив.
// Нормализация кода со сканера в режиме клавиатуры. Функции - в модуле той же формы.
// Для нескольких форм перенесите их в общий модуль с флажками «Клиент» и «Сервер» без директив.
// Приводит то, что «напечатал» сканер, к виду, в котором коды хранятся в базе.
// Префикс - символы, которые сканер дописывает перед кодом (если запрограммированы).
&НаКлиентеНаСервереБезКонтекста
Функция НормализоватьШтрихкод(Знач Текст, Префикс = "")
// 1. Суффикс и мусор по краям: CR, LF, Tab, неразрывный пробел
Текст = СтрЗаменить(Текст, Символы.ВК, "");
Текст = СтрЗаменить(Текст, Символы.ПС, "");
Текст = СтрЗаменить(Текст, Символы.Таб, "");
Текст = СокрЛП(СтрЗаменить(Текст, Символы.НПП, ""));
// 2. Русская раскладка: латиница пришла русскими буквами (раньше префикса: «]E0» приходит как «ъУ0»)
Если ЕстьКириллица(Текст) Тогда
Текст = ИсправитьРаскладку(Текст);
КонецЕсли;
// 3. Префикс сканера и идентификатор символики AIM: «]» и два символа, у EAN-13 - «]E0»
Если Префикс <> "" И СтрНачинаетсяС(Текст, Префикс) Тогда
Текст = Сред(Текст, СтрДлина(Префикс) + 1);
КонецЕсли;
Если СтрНачинаетсяС(Текст, "]") И СтрДлина(Текст) > 3 Тогда
Текст = Сред(Текст, 4);
КонецЕсли;
// 4. EAN-13 с нулём впереди, прочитанный как UPC-A: 12 цифр с верной контрольной цифрой
Если СтрДлина(Текст) = 12 И ЭтоЦифры(Текст) И КонтрольнаяЦифраСходится(Текст) Тогда
Текст = "0" + Текст;
КонецЕсли;
Возврат Текст;
КонецФункции
// Истина, если в строке есть буквы кириллицы (U+0400-U+04FF, включая Ё и ё).
&НаКлиентеНаСервереБезКонтекста
Функция ЕстьКириллица(Текст)
Для Позиция = 1 По СтрДлина(Текст) Цикл
КодЗнака = КодСимвола(Текст, Позиция);
Если КодЗнака >= 1024 И КодЗнака <= 1279 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
// Текст, набранный в русской раскладке -> символы тех же клавиш в английской (US).
// Только для кодов без кириллицы: EAN, UPC, Code 128, Code 39, GS1 DataMatrix.
&НаКлиентеНаСервереБезКонтекста
Функция ИсправитьРаскладку(Текст)
// Строки выровнены по клавишам: N-й знак русской раскладки -> N-й знак US
Русская = "ёйцукенгшщзхъфывапролджэячсмитьбю."
+ "ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,"
+ """№;:?/";
Английская = "`qwertyuiop[]asdfghjkl;'zxcvbnm,./"
+ "~QWERTYUIOP{}ASDFGHJKL:""ZXCVBNM<>?"
+ "@#$^&|";
Результат = "";
Для Позиция = 1 По СтрДлина(Текст) Цикл
Сим = Сред(Текст, Позиция, 1);
Номер = СтрНайти(Русская, Сим);
Результат = Результат + ?(Номер = 0, Сим, Сред(Английская, Номер, 1));
КонецЦикла;
Возврат Результат;
КонецФункции
// Истина, если строка непустая и в ней только цифры.
&НаКлиентеНаСервереБезКонтекста
Функция ЭтоЦифры(Текст)
// СтрРазделить режет по каждому символу разделителя: от одних цифр ничего не остаётся
Возврат Текст <> "" И СтрРазделить(Текст, "0123456789", Ложь).Количество() = 0;
КонецФункции
// Контрольная цифра GS1 для кода без неё: веса 3 и 1, начиная с правой цифры.
&НаКлиентеНаСервереБезКонтекста
Функция КонтрольнаяЦифраGS1(БезКонтрольной)
Сумма = 0;
Вес = 3;
Для Позиция = 0 По СтрДлина(БезКонтрольной) - 1 Цикл
Сумма = Сумма + Вес * Число(Сред(БезКонтрольной, СтрДлина(БезКонтрольной) - Позиция, 1));
Вес = 4 - Вес; // 3, 1, 3, 1...
КонецЦикла;
Возврат Формат((10 - Сумма % 10) % 10, "ЧН=0; ЧГ=0");
КонецФункции
// Сходится ли последняя цифра EAN-8, UPC-A, EAN-13 или GTIN-14 с расчётной.
&НаКлиентеНаСервереБезКонтекста
Функция КонтрольнаяЦифраСходится(Код)
Возврат КонтрольнаяЦифраGS1(Лев(Код, СтрДлина(Код) - 1)) = Прав(Код, 1);
КонецФункции
// Варианты кода для поиска: как есть и без ведущего нуля
// (если в регистр раньше записали 12-значный UPC-A).
&НаКлиентеНаСервереБезКонтекста
Функция ВариантыПоиска(Код)
Варианты = Новый Массив;
Варианты.Добавить(Код);
Если СтрДлина(Код) = 13 И СтрНачинаетсяС(Код, "0") И ЭтоЦифры(Код) Тогда
Варианты.Добавить(Сред(Код, 2));
КонецЕсли;
Возврат Варианты;
КонецФункции
Текст для поля «ПоследнийСкан» и для сообщения о ненайденном коде:
// Разбор скана для поля ПоследнийСкан: что прислал сканер и что пришлось исправить.
// Сырой - текст из поля, Код - результат НормализоватьШтрихкод.
&НаКлиентеНаСервереБезКонтекста
Функция ОписаниеСкана(Сырой, Код)
Коды = Новый Массив;
Для Позиция = 1 По СтрДлина(Сырой) Цикл
Коды.Добавить(Формат(КодСимвола(Сырой, Позиция), "ЧН=0; ЧГ=0"));
КонецЦикла;
Выводы = Новый Массив;
Выводы.Добавить(СтрШаблон(НСтр("ru = 'Получено символов: %1 [%2], ищем: %3'"),
СтрДлина(Сырой), СтрСоединить(Коды, " "), Код));
Если ЕстьКириллица(Сырой) Тогда
Выводы.Добавить(НСтр("ru = 'русские буквы - сканер печатал в русской раскладке'"));
КонецЕсли;
ПервыйСимвол = Лев(СокрЛП(Сырой), 1);
Если ПервыйСимвол = "]" Или ПервыйСимвол = "ъ" Тогда
Выводы.Добавить(НСтр("ru = 'в начале идентификатор символики AIM - отключите его в сканере'"));
КонецЕсли;
Длина = СтрДлина(Код);
Если Не ЭтоЦифры(Код) Тогда
// Code 128, Code 39, код маркировки: контрольную цифру GS1 не проверяем
ИначеЕсли Длина = 13 И СтрНайти(Сырой, Код) = 0 И СтрНайти(Сырой, Сред(Код, 2)) > 0 Тогда
Выводы.Добавить(НСтр("ru = 'пришёл UPC-A из 12 цифр, ноль добавлен - включите в сканере UPC-A в EAN-13'"));
ИначеЕсли Длина = 11 Тогда
Выводы.Добавить(НСтр("ru = '11 цифр - похоже на UPC-A без контрольной цифры, включите её передачу'"));
ИначеЕсли (Длина = 8 Или Длина = 12 Или Длина = 13 Или Длина = 14)
И Не КонтрольнаяЦифраСходится(Код) Тогда
Выводы.Добавить(НСтр("ru = 'контрольная цифра не сходится - код считан с ошибкой или это не EAN/UPC'"));
КонецЕсли;
Возврат СтрСоединить(Выводы, "; ");
КонецФункции
Объект.ПолеСкана = "" — ПриИзменении срабатывает только при изменении значения: без очистки повторный скан того же товара прошёл бы мимо.ПодключитьОбработчикОжидания(..., 0.1, Истина) — возвращает фокус в поле после того, как платформа обработает Enter.НормализоватьШтрихкод: раскладка до префикса, ведь в русской раскладке ]E0 приходит как ъУ0.ИсправитьРаскладку — строки выровнены по клавишам, вызывается только при кириллице в скане. QR-коды с русским текстом через неё не пропускайте.КонтрольнаяЦифраGS1 — веса 3 и 1 от правой цифры, у UPC-A и того же кода с нулём она одинаковая. Внутренний 12-значный код, случайно прошедший проверку, найдёт второй вариант поиска.Варианты[0] — точное совпадение главнее старого 12-значного кода.Настроечным штрихкодом из раздела интерфейсов руководства (USB COM, USB Serial). Если Windows не подхватит порт, поставьте драйвер виртуального COM-порта производителя; номер порта из диспетчера устройств укажите в параметре «Порт».
В режиме клавиатуры — да, нажатия идут как с обычной клавиатуры. Для COM-порта включите проброс портов в RDP-подключении и заведите экземпляр на рабочем месте этого пользователя на сервере.
1С ищет точное совпадение: мешают ведущий ноль, префикс, невидимые символы, или код не заведён у товара. Разбор скана покажет длину и коды символов, а где хранятся штрихкоды — в статье о штрихкодах товаров.
Если сканер нужно встроить в нестандартный документ, связать с маркировкой или ТСД, а на складе зоопарк моделей, настройку и доработку проще отдать программисту. Разместите задачу — оценка бесплатная, ответ в течение рабочего дня. Все направления работ — на странице услуг по доработке 1С.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.