В практике автоматизации торгового учета часто возникает ситуация, когда стандартного формата EAN-13 становится недостаточно. При поступлении товаров в транспортных упаковках (коробах) или при работе с серийными номерами мы сталкиваемся со штрихкодами длиной 14, 15, 16 и более символов. Типичная проблема: сканер считывает только первые 13 знаков, либо программа 1С «отказывается» принимать длинный код в поле ввода. Разберем по шагам, как настроить систему для корректной работы с такими кодами.
Прежде чем вносить изменения в код, проанализируем, с какими именно форматами мы имеем дело. В сообщениях форума упоминаются коды длиной 14 символов и более. Рассмотрим основные стандарты, которые могут встретиться:
Если ваша система настроена только на EAN-13, она будет игнорировать или обрезать «лишние» символы. Проанализируем ситуацию: если сканер физически считывает весь код, но в программу попадает только часть, проблема кроется в настройках 1С или драйвера оборудования.
Выясним причину обрезки данных в самой базе. В типовых конфигурациях (особенно старых версий, таких как 7.7 или ранние 8.2) длина поля «Штрихкод» часто ограничена 13 символами. Рассмотрим, как это исправить:
РегистрСведений.Штрихкоды (в 1С 8) или справочник/таблица (в 1С 7.7).Штрихкод.Строка. Если использовать числовой тип, ведущие нули в длинных кодах будут удалены, что сделает штрихкод невалидным.Посмотрим на ситуацию со стороны оборудования. Если сканер старый или настроен неверно, он может эмулировать нажатия клавиш и иметь внутренние ограничения. Проанализируем следующие моменты:
CR — возврат каретки, код 13). Без корректного суффикса 1С не поймет, что чтение кода завершено, и может ожидать продолжения ввода.GS1-128 сканер должен поддерживать этот тип. Большинство современных 2D-сканеров справляются с этим без проблем, но старые линейные модели могут требовать активации конкретных типов ШК через специальные настроечные (управляющие) штрихкоды из инструкции к устройству.Проанализируем алгоритм проверки корректности штрихкода. В сообщении 10 автор упоминает функцию глКонтрольныйСимволEAN. При работе с кодами разной длины (8, 13, 14 знаков) важно понимать, что все они используют алгоритм Modulo 10.
Разберем пример реализации универсального расчета контрольного знака. Вместо жестких условий Если Тип = 13, лучше использовать цикл, который считает сумму справа налево. Посмотрим на пример кода:
Функция глУниверсальныйКонтрольныйСимвол(ШтрКод) Экспорт
Длина = СтрДлина(ШтрКод);
Сумма = 0;
Множитель = 3;
// Идем с конца кода (без учета последнего символа, если мы его проверяем)
Для Индекс = 1 По Длина Цикл
Цифра = Число(Сред(ШтрКод, Длина - Индекс + 1, 1));
Сумма = Сумма + Цифра * Множитель;
// Чередуем множители 3 и 1
Если Множитель = 3 Тогда
Множитель = 1;
Иначе
Множитель = 3;
КонецЕсли;
КонецЦикла;
Остаток = Сумма % 10;
Если Остаток = 0 Тогда
Возврат 0;
Иначе
Возврат (10 - Остаток);
КонецЕсли;
КонецФункции
Важный нюанс: при расчете контрольной цифры для EAN-13 позиции считаются справа налево. Первая позиция (справа) имеет множитель 3, вторая — 1 и так далее. Этот же принцип применим и к ITF-14. Поэтому универсальный цикл — наиболее правильное решение.
Часто проблема кроется не в базе данных, а в процедурах поиска. Рассмотрим типичную ошибку в коде:
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
// ОШИБКА: Жесткая проверка длины
Если СтрДлина(Данные) <> 13 Тогда
Предупреждение("Неверный формат штрихкода!");
Возврат;
КонецЕсли;
// Поиск товара...
КонецПроцедуры
Выясним причину: если в вашей конфигурации прописаны подобные условия, их необходимо расширить или убрать, заменив на более гибкий поиск по всей строке данных, полученных от сканера. Проанализируем все места использования функций поиска (например, НайтиПоШтрихкоду) и убедимся, что передаваемый параметр не обрезается программно.
При внедрении поддержки длинных штрихкодов учитывайте следующее:
Таким образом, решив проблему комплексно — от физических настроек луча сканера до длины реквизитов в 1С и алгоритмов проверки — мы обеспечим стабильную работу склада с любыми типами маркировки.