При работе с системой «Честный ЗНАК» в части маркировки табачной продукции специалисты часто сталкиваются с ситуацией, когда визуально одинаковые или похожие коды маркировки воспринимаются системой как разные или, наоборот, не находятся в базе данных. Проанализируем техническую природу кодов DataMatrix для табака, разберем причины возникновения проблем в среде 1С и предложим методики их решения.
Рассмотрим структуру кода маркировки. Коды DataMatrix, наносимые на табачные пачки, соответствуют международному стандарту GS1. В отличие от привычных линейных штрихкодов (EAN-13), которые состоят только из цифр, DataMatrix использует расширенный набор символов ASCII. В табачной отрасли серийный номер пачки состоит из 7 символов, которые могут включать в себя:
Важно понимать: согласно стандарту, символы m и M являются абсолютно разными значениями. Таким образом, коды 0465011872039800003mY и 0465011872039800003my принадлежат разным единицам продукции. Это нормальное поведение системы маркировки, которое накладывает определенные требования на программное обеспечение и оборудование.
Выясним причину, по которой 1С иногда «не видит» разницы между кодами. Большинство инсталляций 1С на платформе MS SQL Server используют параметр Collation (сопоставление), установленный как Cyrillic_General_CI_AS. Аббревиатура CI означает Case Insensitive, то есть нечувствительность к регистру.
Когда мы выполняем запрос к базе данных, SQL Server считает строки «ABC» и «abc» идентичными. Это приводит к тому, что при поиске конкретной марки в справочнике система может выдать первый попавшийся дубль, игнорируя регистр, либо вообще выдать ошибку при попытке записи «дублирующего» (с точки зрения SQL) штрихкода.
Проанализируем решение, которое применяют разработчики типовых конфигураций 1С (Библиотека интеграции с ИС МП). Чтобы обойти ограничение SQL Server по регистрозависимости, используется преобразование строки кода маркировки в формат Base64. Рассмотрим пример логики преобразования:
// Пример получения уникального идентификатора строки с учетом регистра
ДвоичныеДанныеМари = ПолучитьДвоичныеДанныеИзСтроки(СтрокаКодаМаркировки, КодировкаТекста.UTF8);
СтрокаBase64 = Base64Строка(ДвоичныеДанныеМари);
// Теперь СтрокаBase64 можно использовать для поиска в базе данных
Использование Base64 позволяет превратить регистрозависимую латиницу в уникальный набор символов, который база данных сможет индексировать и сравнивать корректно, даже если само поле в SQL нечувствительно к регистру. В современных версиях «1С:Розница» или «1С:УНФ» поиск марок часто идет именно по хешированным или преобразованным значениям.
Посмотрим на проблему со стороны торгового оборудования. Огромное количество ошибок «Марка не найдена» связано не с кодом в базе, а с тем, как сканер передает данные в компьютер. Разберем два режима работы:
Caps Lock. Если на компьютере включен Caps Lock, строчная буква m превратится в заглавную M, и 1С получит неверный код.Рекомендация: Для работы с табачной продукцией всегда переводите сканеры в режим эмуляции COM-порта. Для моделей типа АТОЛ 2108 или аналогичных это делается путем сканирования специальных служебных кодов из инструкции производителя.
Разберем, как ведет себя встроенный язык 1С при сравнении строк. В отличие от SQL-запросов, операторы сравнения в коде 1С ведут себя иначе в зависимости от контекста. Рассмотрим пример:
Строка1 = "0465011872039800003mY";
Строка2 = "0465011872039800003my";
// Прямое сравнение учитывает регистр
Если Строка1 = Строка2 Тогда
Сообщить("Коды одинаковые");
Иначе
Сообщить("Коды разные"); // Сработает этот вариант
КонецЕсли;
// Использование СтрСравнить для более точного контроля
Результат = СтрСравнить(Строка1, Строка2);
Если Результат <> 0 Тогда
Сообщить("Строки отличаются с учетом регистра");
КонецЕсли;
При написании собственных обработок для поиска марок в массивах или таблицах значений всегда используйте прямое сравнение или функцию СтрСравнить(). Однако помните, что поиск через Запрос к базе данных всё равно останется нечувствительным к регистру, если не использовать дополнительные поля (как упоминалось выше про Base64 или Хеш).
Проанализируем изменения в законодательстве, которые влияют на чтение кода. В сообщениях пользователей часто встречается жалоба, что сканер не считывает «цифры в конце» (идентификатор применения 8005). Важно знать:
8005 (цена) перестал быть обязательным элементом именно в составе DataMatrix на пачке.Поэтому, если ваш сканер выдает строку без префиксов в скобках — это может быть вариантом нормы для новых партий. Главное, чтобы 1С могла идентифицировать GTIN (первые 14 цифр) и серийный номер (следующие 7 символов) с соблюдением их регистра.
Чтобы избежать проблем с регистрозависимыми кодами табака в 1С, рекомендуется придерживаться следующего алгоритма: