Является ли код маркировки табака регистрозависимым и как обеспечить его корректное считывание в 1С?

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

При работе с системой «Честный ЗНАК» в части маркировки табачной продукции специалисты часто сталкиваются с ситуацией, когда визуально одинаковые или похожие коды маркировки воспринимаются системой как разные или, наоборот, не находятся в базе данных. Проанализируем техническую природу кодов DataMatrix для табака, разберем причины возникновения проблем в среде 1С и предложим методики их решения.

Природа регистрозависимости кодов маркировки

Рассмотрим структуру кода маркировки. Коды DataMatrix, наносимые на табачные пачки, соответствуют международному стандарту GS1. В отличие от привычных линейных штрихкодов (EAN-13), которые состоят только из цифр, DataMatrix использует расширенный набор символов ASCII. В табачной отрасли серийный номер пачки состоит из 7 символов, которые могут включать в себя:

  1. Цифры от 0 до 9.
  2. Строчные буквы латинского алфавита (a-z).
  3. Прописные (заглавные) буквы латинского алфавита (A-Z).
  4. Специальные символы.

Важно понимать: согласно стандарту, символы m и M являются абсолютно разными значениями. Таким образом, коды 0465011872039800003mY и 0465011872039800003my принадлежат разным единицам продукции. Это нормальное поведение системы маркировки, которое накладывает определенные требования на программное обеспечение и оборудование.

Проблема на уровне базы данных (SQL Server)

Выясним причину, по которой 1С иногда «не видит» разницы между кодами. Большинство инсталляций 1С на платформе MS SQL Server используют параметр Collation (сопоставление), установленный как Cyrillic_General_CI_AS. Аббревиатура CI означает Case Insensitive, то есть нечувствительность к регистру.

Когда мы выполняем запрос к базе данных, SQL Server считает строки «ABC» и «abc» идентичными. Это приводит к тому, что при поиске конкретной марки в справочнике система может выдать первый попавшийся дубль, игнорируя регистр, либо вообще выдать ошибку при попытке записи «дублирующего» (с точки зрения SQL) штрихкода.

Методика хранения марок в Base64

Проанализируем решение, которое применяют разработчики типовых конфигураций 1С (Библиотека интеграции с ИС МП). Чтобы обойти ограничение SQL Server по регистрозависимости, используется преобразование строки кода маркировки в формат Base64. Рассмотрим пример логики преобразования:


// Пример получения уникального идентификатора строки с учетом регистра
ДвоичныеДанныеМари = ПолучитьДвоичныеДанныеИзСтроки(СтрокаКодаМаркировки, КодировкаТекста.UTF8);
СтрокаBase64 = Base64Строка(ДвоичныеДанныеМари);
// Теперь СтрокаBase64 можно использовать для поиска в базе данных

Использование Base64 позволяет превратить регистрозависимую латиницу в уникальный набор символов, который база данных сможет индексировать и сравнивать корректно, даже если само поле в SQL нечувствительно к регистру. В современных версиях «1С:Розница» или «1С:УНФ» поиск марок часто идет именно по хешированным или преобразованным значениям.

Настройка сканера штрихкодов: COM-порт vs Эмуляция клавиатуры

Посмотрим на проблему со стороны торгового оборудования. Огромное количество ошибок «Марка не найдена» связано не с кодом в базе, а с тем, как сканер передает данные в компьютер. Разберем два режима работы:

  1. Режим эмуляции клавиатуры (HID): Сканер имитирует нажатие клавиш. В этом режиме на передачу данных влияет текущая раскладка клавиатуры (русская/английская) и состояние клавиши Caps Lock. Если на компьютере включен Caps Lock, строчная буква m превратится в заглавную M, и 1С получит неверный код.
  2. Режим эмуляции COM-порта (Native): Это наиболее правильный способ подключения. Данные передаются напрямую в драйвер 1С как поток байтов. В этом случае регистр символов сохраняется в исходном виде, независимо от настроек Windows.

Рекомендация: Для работы с табачной продукцией всегда переводите сканеры в режим эмуляции COM-порта. Для моделей типа АТОЛ 2108 или аналогичных это делается путем сканирования специальных служебных кодов из инструкции производителя.

Программное сравнение строк в языке 1С

Разберем, как ведет себя встроенный язык 1С при сравнении строк. В отличие от SQL-запросов, операторы сравнения в коде 1С ведут себя иначе в зависимости от контекста. Рассмотрим пример:


Строка1 = "0465011872039800003mY";
Строка2 = "0465011872039800003my";

// Прямое сравнение учитывает регистр
Если Строка1 = Строка2 Тогда
    Сообщить("Коды одинаковые");
Иначе
    Сообщить("Коды разные"); // Сработает этот вариант
КонецЕсли;

// Использование СтрСравнить для более точного контроля
Результат = СтрСравнить(Строка1, Строка2);
Если Результат <> 0 Тогда
    Сообщить("Строки отличаются с учетом регистра");
КонецЕсли;

При написании собственных обработок для поиска марок в массивах или таблицах значений всегда используйте прямое сравнение или функцию СтрСравнить(). Однако помните, что поиск через Запрос к базе данных всё равно останется нечувствительным к регистру, если не использовать дополнительные поля (как упоминалось выше про Base64 или Хеш).

Особенности структуры табачного кода (криптохвост)

Проанализируем изменения в законодательстве, которые влияют на чтение кода. В сообщениях пользователей часто встречается жалоба, что сканер не считывает «цифры в конце» (идентификатор применения 8005). Важно знать:

  1. С 2020 года формат табачного кода был упрощен.
  2. Криптохвост (код проверки) стал короче (4 символа).
  3. Идентификатор применения 8005 (цена) перестал быть обязательным элементом именно в составе DataMatrix на пачке.

Поэтому, если ваш сканер выдает строку без префиксов в скобках — это может быть вариантом нормы для новых партий. Главное, чтобы 1С могла идентифицировать GTIN (первые 14 цифр) и серийный номер (следующие 7 символов) с соблюдением их регистра.

Итоги и план действий

Чтобы избежать проблем с регистрозависимыми кодами табака в 1С, рекомендуется придерживаться следующего алгоритма:

← На главную