Как в 1С:Управление торговлей 10.3 использовать штрихкоды формата Code39 и других типов, отличных от EAN13?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Приветствуем вас, коллеги! Сегодня мы детально разберем одну из классических архитектурных проблем, с которой часто сталкиваются разработчики и администраторы систем на базе «1С:Управление торговлей 10.3» (УТ 10.3). Речь идет о невозможности «из коробки» использовать и корректно сканировать штрихкоды произвольного формата, отличные от стандартного EAN13 (например, популярные форматы Code39, Code128 или UPC-A).

В типовом решении УТ 10.3 практически все механизмы работы со штрихкодами жестко ориентированы на стандарты EAN13 и EAN8. При попытке отсканировать штрихкод другого формата система выдает ошибку: «Считанный штрихкод не может быть обработан...» или просто не находит товар в базе, хотя вручную код в карточку заносится. Проанализируем ситуацию, выясним причины проблемы и пошагово разберем, как адаптировать систему для работы с Code39.

В чем кроется причина проблемы?

Для того чтобы решить задачу, нам необходимо четко понимать, на каких этапах система блокирует «нестандартные» штрихкоды. Проблема носит комплексный характер и делится на программную часть (логика 1С) и аппаратную (настройки самого сканера).

  1. Жесткая типизация при создании записи: По умолчанию в форме карточки номенклатуры при генерации новой строки в табличной части штрихкодов система принудительно устанавливает тип ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13.
  2. Аппаратные префиксы/суффиксы Code39: Физический штрихкод формата Code39 содержит в себе скрытые символы старта и стопа (обычно это звездочки *). Сканер по умолчанию может считывать их и передавать в 1С вместе с полезными данными, из-за чего строка поиска искажается.
  3. Ограничения на длину поля: Стандартная длина измерения Штрихкод в регистре сведений Штрихкоды может быть ограничена (например, 13 или 20 символами), в то время как полезная длина Code39 или Code128 может достигать 30–40 символов и более.
  4. Разрывы данных при эмуляции клавиатуры: Сканеры штрихкода в режиме «клавиатурного клина» передают длинные строки частями, что приводит к некорректной отработке внешнего события.

Рассмотрим подробнее каждый шаг по устранению этих ограничений.

Шаг 1. Корректировка длины штрихкода в конфигураторе

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

  1. Откроем конфигурацию УТ 10.3 в режиме «Конфигуратор».
  2. Найдем регистр сведений Штрихкоды.
  3. В измерениях регистра найдем поле Штрихкод.
  4. Откроем его свойства и увеличим длину строки до необходимой (рекомендуется установить 100 или даже 150 символов, так как штрихкоды формата Code39 могут быть весьма длинными).

Шаг 2. Доработка логики создания штрихкода в форме номенклатуры

Когда мы начинаем редактировать табличную часть штрихкодов в карточке номенклатуры, система автоматически пытается навязать нам тип EAN13. Найдем форму элемента справочника Номенклатура и перейдем к обработчику события ПриНачалеРедактирования табличной части штрихкодов.

Разберем стандартный код этого обработчика:


Процедура ШтрихкодыПриНачалеРедактирования(Элемент, НоваяСтрока)
    ТекущаяСтрока = Элемент.ТекущиеДанные;
    Если НоваяСтрока Тогда
        ТекущаяСтрока.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
        ТекущаяСтрока.Владелец = Ссылка;
        ТекущаяСтрока.ЕдиницаИзмерения = ЕдиницаХраненияОстатков;
        ТекущаяСтрока.Качество = Справочники.Качество.Новый;
    КонецЕсли;
КонецПроцедуры

Для того чтобы система не навязывала жестко формат EAN13, мы можем предоставить пользователю возможность выбора или программно анализировать длину вводимого кода. Но главное — обеспечить корректный перехват данных от сканера при считывании неизвестного кода. Для этого найдем в модуле формы функцию СШКНеизвестныйКод.

Модернизируем данную функцию так, чтобы при сканировании кодов, отличных по длине от 13 символов (или содержащих не только цифры), система автоматически присваивала тип Code39:


Функция СШКНеизвестныйКод(Штрихкод, ТипКода, СШК) Экспорт
    Если ЭтоНовый И РаботаСДиалогами.ЗаписатьНовыйОбъектВФорме(ЭтаФорма) Тогда
        ЭлементыФормы.Штрихкоды.ДобавитьСтроку;
    КонецЕсли;
    
    ТекущиеДанные = ЭлементыФормы.Штрихкоды.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Предупреждение("Не выбрана строка таблицы штрихкодов, для которой регистрируется штрихкод.");
        Возврат Истина;
    КонецЕсли;
    
    // НАЧАЛО ДОРАБОТКИ: автоопределение типа кода
    ОчищенныйКод = СокрЛП(Штрихкод);
    
    // Если длина кода не равна 13 или он содержит символы, отличные от цифр
    Если СтрДлина(ОчищенныйКод) <> 13 Или Найти(ОчищенныйКод, "-") > 0 Тогда
        ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.Code39;
    КонецЕсли;
    // КОНЕЦ ДОРАБОТКИ
    
    ТекЗапись = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи;
    ЗаполнитьЗначенияСвойств(ТекЗапись, ТекущиеДанные);
    ТекЗапись.Прочитать;
    
    ТекЗапись.ТипШтрихкода = ?(ЗначениеЗаполнено(ТипКода), ТипКода, ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13);
    ТекЗапись.Штрихкод = ОчищенныйКод;
    
    Попытка
        ТекЗапись.Записать;
    Исключение
        Сообщить("Не удалось записать штрихкод: " + ОписаниеОшибки());
    КонецПопытки;
    
    Возврат Истина;
КонецФункции

Шаг 3. Борьба с символами старта/стопа «*» в Code39

Очень часто разработчики сталкиваются со следующей ситуацией: в базу штрихкод записан руками как 12345678, а при сканировании сканер передает его как *12345678*. Из-за этого встроенный поиск 1С выдает ошибку сопоставления.

Для решения этой проблемы у нас есть два пути:

  1. Аппаратный метод (рекомендуемый): Возьмите руководство пользователя вашего сканера (обычно это брошюра со специальными настроечными штрихкодами) и найдите раздел, посвященный настройке Code39. Считайте штрихкод с настройкой «Transmit Start/Stop Character — Disable» (Отключить передачу символов старта/стопа). После этого сканер перестанет слать звездочки в систему.
  2. Программный метод: Очищать символы непосредственно при обработке внешнего события в 1С. В общем модуле, где происходит первичный прием данных от сканера (например, в функциях работы с торговым оборудованием), добавьте очистку строки:

// Очистка штрихкода от символов старта/стопа Code39
Если Лев(ВходящийШтрихкод, 1) = "*" И Прав(ВходящийШтрихкод, 1) = "*" Тогда
    ВходящийШтрихкод = Сред(ВходящийШтрихкод, 2, СтрДлина(ВходящийШтрихкод) - 2);
КонецЕсли;

Шаг 4. Настройка режима подключения сканера

Если вы используете длинные штрихкоды формата Code39, категорически не рекомендуется использовать сканер в режиме «разрыва клавиатуры» (клавиатурный клин, USB-HID без эмуляции). При таком подключении операционная система воспринимает сканер как очень быстро печатающего человека.

Когда строка штрихкода превышает 15–20 символов, буфер клавиатуры или обработчик ожидания в 1С может «разорвать» этот поток данных. Часть штрихкода запишется в текущее активное поле ввода, а остаток вызовет ошибку сканирования торгового оборудования.

Правильное решение: Переведите сканер в режим эмуляции COM-порта (Virtual COM Port). Для этого:

  1. Отсканируйте управляющий штрихкод из инструкции сканера для перевода в режим USB CDC (Virtual COM).
  2. Установите драйвер виртуального COM-порта от производителя вашего сканера.
  3. В «1С:Предприятие» в меню «Сервис» — «Торговое оборудование» настройте подключение сканера через соответствующий COM-порт.

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

Резюме

Мы проанализировали ограничения платформы и торгового оборудования. Для того чтобы успешно внедрить поддержку Code39 в старой доброй УТ 10.3, нам потребовалось выполнить четыре простых действия: увеличить длину хранения строки в конфигураторе, скорректировать логику автоматического определения типа кода при сканировании в форме карточки номенклатуры, настроить сканер на игнорирование символов старта/стопа и перевести оборудование в надежный режим COM-эмуляции. Эти шаги гарантируют быструю и безотказную работу вашего склада или торгового зала!

← На главную