При работе с торговыми конфигурациями, такими как 1С:Управление торговлей 11, пользователи часто сталкиваются со странным поведением системы при печати ценников и этикеток. Вроде бы используется один и тот же шаблон, штрихкоды состоят из одинакового количества цифр (13 символов), но на печати один штрихкод выглядит компактно и аккуратно, а второй растягивается на всю ширину этикетки, обрезается по краям или вовсе отображается в виде нечитаемой полосы. При попытке жестко задать тип штрихкода как EAN13 вместо Автоопределение система выдает критическую ошибку "Invalid Barcode" или "Invalid checkdigit".
В этой статье мы подробно разберем, почему возникает такое поведение, как работает механизм автоопределения форматов штрихкодирования в платформе «1С:Предприятие 8» и как исправить некорректные штрихкоды в базе данных программно.
---
Для начала проанализируем, как внешняя компонента печати штрихкодов 1С обрабатывает информацию. В современных версиях конфигураций генерация изображений выполняется с помощью кроссплатформенной Native-компоненты печати штрихкодов, входящей в состав БСП (Библиотеки стандартных подсистем) и БПО (Библиотеки подключаемого оборудования).
Когда в макете этикетки для свойства рисунка задан тип Автоопределение, компонента печати последовательно валидирует переданную строку по правилам различных мировых стандартов штрихкодирования:
Автоопределение, компонента не останавливает работу, а пытается закодировать строку в другом поддерживаемом формате, не требующем жесткой структуры контрольных сумм. Чаще всего выбор падает на формат Code 128 (или Code 128C).Результат подмены формата: Штрихкод стандарта Code 128 визуально существенно отличается от EAN-13. Он значительно шире, имеет более плотную структуру штрихов и требует гораздо больше горизонтального пространства на этикетке. В итоге некорректный штрихкод просто не помещается в рамки отведенной под него области макета, растягивается и становится нечитаемым для сканеров.
Если же в шаблоне этикетки принудительно выставить тип штрихкода EAN13, компонента не станет пытаться подобрать другой стандарт и сразу вернет ошибку "Invalid Barcode" (Неверный штрихкод) или "Invalid checkdigit" (Неверный контрольный символ).
---
Контрольная цифра (13-й символ штрихкода) предназначена для защиты от ошибок считывания сканером и ручного ввода. Она рассчитывается на основании первых 12 цифр кода по следующему алгоритму:
---
Рассмотрим, как автоматизировать проверку и расчет контрольного символа средствами встроенного языка 1С. Напишем функцию, которая принимает на вход первые 12 цифр штрихкода и возвращает строковое представление правильной контрольной цифры.
Функция ВычислитьКонтрольныйСимволEAN13(Знач Штрихкод12Знаков) Экспорт
// Проверим, что передана строка нужной длины и состоит только из цифр
Если СтрДлина(СокрЛП(Штрихкод12Знаков)) <> 12 Тогда
ВызватьИсключение "Для расчета контрольного символа EAN-13 строка должна содержать ровно 12 цифр!";
КонецЕсли;
СуммаЧетных = 0;
СуммаНечетных = 0;
// Цикл по всем 12 цифрам
Для Индекс = 1 По 12 Цикл
ТекущаяЦифра = Число(Сред(Штрихкод12Знаков, Индекс, 1));
Если Индекс % 2 = 0 Тогда
// Четная позиция
СуммаЧетных = СуммаЧетных + ТекущаяЦифра;
Иначе
// Нечетная позиция
СуммаНечетных = СуммаНечетных + ТекущаяЦифра;
КонецЕсли;
КонецЦикла;
// Умножаем сумму четных позиций на 3
ИтоговаяСумма = (СуммаЧетных * 3) + СуммаНечетных;
// Находим остаток от деления на 10
ОстатокОтДеления = ИтоговаяСумма % 10;
// Вычисляем контрольное число
Если ОстатокОтДеления = 0 Тогда
КонтрольныйСимвол = 0;
Else
КонтрольныйСимвол = 10 - ОстатокОтДеления;
КонецЕсли;
Возврат Строка(КонтрольныйСимвол);
КонецФункции
Используя эту функцию, мы всегда сможем программно перепроверить любой штрихкод перед записью в базу данных или при формировании макета печати.
---
Пользователи часто импортируют номенклатуру из файлов Excel поставщиков, где штрихкоды могут быть записаны с ошибками, опечатками или содержать лишние пробелы. Чтобы исправить накопленные ошибки в регистре сведений ШтрихкодыНоменклатуры, напишем небольшую сервисную обработку.
Проанализируем алгоритм исправления:
Рассмотрим пример кода такой обработки:
Процедура ИсправитьОшибочныеШтрихкодыНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод,
| ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
| ШтрихкодыНоменклатуры.Характеристика КАК Характеристика,
| ШтрихкодыНоменклатуры.Упаковка КАК Упаковка
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ДЛИНАСТРОКИ(ШтрихкодыНоменклатуры.Штрихкод) = 13";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ИсходныйШК = СокрЛП(ВыборкаДетальныеЗаписи.Штрихкод);
Первые12Цифр = Лев(ИсходныйШК, 12);
Попытка
ПравильныйКонтрольный = ВычислитьКонтрольныйСимволEAN13(Первые12Цифр);
НовыйШК = Первые12Цифр + ПравильныйКонтрольный;
Если ИсходныйШК <> НовыйШК Тогда
// Найдено несовпадение контрольной цифры
// Перезаписываем данные в регистре сведений
МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(МенеджерЗаписи, ВыборкаДетальныеЗаписи);
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
// Удаляем старую запись с неверным ключом
МенеджерЗаписи.Удалить();
// Создаем запись с корректным штрихкодом
НоваяЗапись = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(НоваяЗапись, ВыборкаДетальныеЗаписи);
НоваяЗапись.Штрихкод = НовыйШК;
НоваяЗапись.Записать(Истина);
ЗаписьЖурналаРегистрации("Штрихкоды.Исправление",
УровеньЖурналаРегистрации.Информация,
,
,
"Успешно исправлен некорректный штрихкод " + ИсходныйШК + " на " + НовыйШК);
КонецЕсли;
КонецЕсли;
Исключение
// Обработка строк, которые содержат нецифровые символы
ЗаписьЖурналаРегистрации("Штрихкоды.Ошибка",
УровеньЖурналаРегистрации.Предупреждение,
,
,
"Не удалось обработать штрихкод: " + ИсходныйШК + ". Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
---
Важно отметить, что в типовых конфигурациях 1С (УТ 11.4, КА 2, ERP) разработчикам нет необходимости писать функции расчета контрольной цифры полностью с нуля в каждом модуле. В составе Библиотеки подключаемого оборудования уже присутствуют готовые программные методы.
Например, можно обратиться к общему модулю МенеджерОборудованияКлиентСервер, в котором реализована функция контроля корректности штрихкода. Вызов этого метода позволяет быстро валидировать строку перед записью в базу:
// Пример проверки корректности штрихкода через БПО
ШтрихкодКорректен = МенеджерОборудованияКлиентСервер.ПроверитьШтрихкод(ПроверяемыйШтрихкод, ДанныеПараметровШтрихкода);
Если система возвращает ложь, это явный сигнал о том, что штрихкод поврежден или имеет некорректный формат, и его запись должна быть заблокирована для предотвращения проблем при дальнейшей печати этикеток.
---
Для того чтобы минимизировать ручные ошибки операторов при заведении карточек товаров или импорте прайс-листов, мы рекомендуем внедрить превентивные меры контроля на уровне интерфейса 1С:
ПередЗаписью модуля набора записей регистра сведений ШтрихкодыНоменклатуры. В случае неуспешного прохождения валидации система должна выдать предупреждение и не дать сохранить некорректный код.Соблюдение этих правил и своевременная очистка базы данных от невалидных штрихкодов гарантируют, что все ваши ценники и этикетки всегда будут выходить на печать ровными, аккуратными и будут без проблем считываться любыми сканерами на кассовых узлах и складах.