Приветствуем вас, коллеги! Сегодня мы детально разберем одну из классических архитектурных проблем, с которой часто сталкиваются разработчики и администраторы систем на базе «1С:Управление торговлей 10.3» (УТ 10.3). Речь идет о невозможности «из коробки» использовать и корректно сканировать штрихкоды произвольного формата, отличные от стандартного EAN13 (например, популярные форматы Code39, Code128 или UPC-A).
В типовом решении УТ 10.3 практически все механизмы работы со штрихкодами жестко ориентированы на стандарты EAN13 и EAN8. При попытке отсканировать штрихкод другого формата система выдает ошибку: «Считанный штрихкод не может быть обработан...» или просто не находит товар в базе, хотя вручную код в карточку заносится. Проанализируем ситуацию, выясним причины проблемы и пошагово разберем, как адаптировать систему для работы с Code39.
Для того чтобы решить задачу, нам необходимо четко понимать, на каких этапах система блокирует «нестандартные» штрихкоды. Проблема носит комплексный характер и делится на программную часть (логика 1С) и аппаратную (настройки самого сканера).
ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13.Code39 содержит в себе скрытые символы старта и стопа (обычно это звездочки *). Сканер по умолчанию может считывать их и передавать в 1С вместе с полезными данными, из-за чего строка поиска искажается.Штрихкод в регистре сведений Штрихкоды может быть ограничена (например, 13 или 20 символами), в то время как полезная длина Code39 или Code128 может достигать 30–40 символов и более.Рассмотрим подробнее каждый шаг по устранению этих ограничений.
Перед тем как начать доработку кода, убедимся, что база данных физически готова принимать длинные штрихкоды. Выполним следующие действия:
Штрихкоды.Штрихкод.Code39 могут быть весьма длинными).Когда мы начинаем редактировать табличную часть штрихкодов в карточке номенклатуры, система автоматически пытается навязать нам тип EAN13. Найдем форму элемента справочника Номенклатура и перейдем к обработчику события ПриНачалеРедактирования табличной части штрихкодов.
Разберем стандартный код этого обработчика:
Процедура ШтрихкодыПриНачалеРедактирования(Элемент, НоваяСтрока)
ТекущаяСтрока = Элемент.ТекущиеДанные;
Если НоваяСтрока Тогда
ТекущаяСтрока.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
ТекущаяСтрока.Владелец = Ссылка;
ТекущаяСтрока.ЕдиницаИзмерения = ЕдиницаХраненияОстатков;
ТекущаяСтрока.Качество = Справочники.Качество.Новый;
КонецЕсли;
КонецПроцедуры
Для того чтобы система не навязывала жестко формат EAN13, мы можем предоставить пользователю возможность выбора или программно анализировать длину вводимого кода. Но главное — обеспечить корректный перехват данных от сканера при считывании неизвестного кода. Для этого найдем в модуле формы функцию СШКНеизвестныйКод.
Модернизируем данную функцию так, чтобы при сканировании кодов, отличных по длине от 13 символов (или содержащих не только цифры), система автоматически присваивала тип Code39:
Функция СШКНеизвестныйКод(Штрихкод, ТипКода, СШК) Экспорт
Если ЭтоНовый И РаботаСДиалогами.ЗаписатьНовыйОбъектВФорме(ЭтаФорма) Тогда
ЭлементыФормы.Штрихкоды.ДобавитьСтроку;
КонецЕсли;
ТекущиеДанные = ЭлементыФормы.Штрихкоды.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Предупреждение("Не выбрана строка таблицы штрихкодов, для которой регистрируется штрихкод.");
Возврат Истина;
КонецЕсли;
// НАЧАЛО ДОРАБОТКИ: автоопределение типа кода
ОчищенныйКод = СокрЛП(Штрихкод);
// Если длина кода не равна 13 или он содержит символы, отличные от цифр
Если СтрДлина(ОчищенныйКод) <> 13 Или Найти(ОчищенныйКод, "-") > 0 Тогда
ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.Code39;
КонецЕсли;
// КОНЕЦ ДОРАБОТКИ
ТекЗапись = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи;
ЗаполнитьЗначенияСвойств(ТекЗапись, ТекущиеДанные);
ТекЗапись.Прочитать;
ТекЗапись.ТипШтрихкода = ?(ЗначениеЗаполнено(ТипКода), ТипКода, ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13);
ТекЗапись.Штрихкод = ОчищенныйКод;
Попытка
ТекЗапись.Записать;
Исключение
Сообщить("Не удалось записать штрихкод: " + ОписаниеОшибки());
КонецПопытки;
Возврат Истина;
КонецФункции
Очень часто разработчики сталкиваются со следующей ситуацией: в базу штрихкод записан руками как 12345678, а при сканировании сканер передает его как *12345678*. Из-за этого встроенный поиск 1С выдает ошибку сопоставления.
Для решения этой проблемы у нас есть два пути:
Code39. Считайте штрихкод с настройкой «Transmit Start/Stop Character — Disable» (Отключить передачу символов старта/стопа). После этого сканер перестанет слать звездочки в систему.
// Очистка штрихкода от символов старта/стопа Code39
Если Лев(ВходящийШтрихкод, 1) = "*" И Прав(ВходящийШтрихкод, 1) = "*" Тогда
ВходящийШтрихкод = Сред(ВходящийШтрихкод, 2, СтрДлина(ВходящийШтрихкод) - 2);
КонецЕсли;
Если вы используете длинные штрихкоды формата Code39, категорически не рекомендуется использовать сканер в режиме «разрыва клавиатуры» (клавиатурный клин, USB-HID без эмуляции). При таком подключении операционная система воспринимает сканер как очень быстро печатающего человека.
Когда строка штрихкода превышает 15–20 символов, буфер клавиатуры или обработчик ожидания в 1С может «разорвать» этот поток данных. Часть штрихкода запишется в текущее активное поле ввода, а остаток вызовет ошибку сканирования торгового оборудования.
Правильное решение: Переведите сканер в режим эмуляции COM-порта (Virtual COM Port). Для этого:
В этом режиме драйвер 1С получает весь штрихкод целиком в виде единого события ВнешнееСобытие, что полностью исключает любые задержки, искажения или усечения информации.
Мы проанализировали ограничения платформы и торгового оборудования. Для того чтобы успешно внедрить поддержку Code39 в старой доброй УТ 10.3, нам потребовалось выполнить четыре простых действия: увеличить длину хранения строки в конфигураторе, скорректировать логику автоматического определения типа кода при сканировании в форме карточки номенклатуры, настроить сканер на игнорирование символов старта/стопа и перевести оборудование в надежный режим COM-эмуляции. Эти шаги гарантируют быструю и безотказную работу вашего склада или торгового зала!