При разработке печатных форм ценников в системе 1С:Предприятие 7.7 разработчики часто сталкиваются с ограничением стандартного компонента barcode.ocx. Этот объект невозможно повернуть стандартными средствами платформы, а при попытке сильно уменьшить его размер штрихи становятся нечитаемыми для сканера или вовсе исчезают из предварительного просмотра. Рассмотрим, как решить эту задачу профессионально, используя метод шрифтового вывода.
Стандартный элемент управления штрихкодом в 1С 7.7 является объектом ActiveX. У таких объектов в конфигураторе отсутствует вкладка «Положение», где можно было бы задать угол ориентации текста. Кроме того, масштабирование картинки внутри объекта происходит с искажениями. Проанализируем альтернативный путь: использование специализированного шрифта, например, EanGnivc. Поскольку для 1С это будет обычный текст, мы сможем применить к ячейке любые трансформации: поворот, изменение кегля и выравнивание.
Прежде всего, необходимо установить шрифт EanGnivc в операционную систему. Это файл формата .ttf. После установки шрифта перезагрузка 1С обязательна. Теперь в табличном документе (макете) для выбранной ячейки станет доступен этот шрифт. Однако просто вывести цифры штрихкода этим шрифтом нельзя — сканер их не распознает. Штрихкод EAN-13 имеет сложную структуру кодирования (левая и правая части кодируются по-разному), поэтому нам потребуется специальная функция-преобразователь.
Разберем программную логику. Нам нужно превратить обычную строку цифр (например, "4601234567890") в набор специальных символов, которые в шрифте EanGnivc выглядят как соответствующие комбинации полос штрихкода. Рассмотрим готовую функцию для 1С 7.7. Эту функцию рекомендуется разместить в Глобальном модуле с ключевым словом Экспорт, чтобы она была доступна из любой обработки печати ценников.
// Функция для формирования строки символов под шрифт EanGnivc.
// На вход подается строка штрихкода (13 или 8 символов).
Функция СформироватьСтрокуEanGnivc(ШтрихкодСтрокойСимволов) Экспорт
Перем СпособыКодированияЛевойЧасти[10];
СимволыСпособовКодирования = "#$%&'()*+,";
ЛевыйЗащитныйШаблон = "!";
СреднийЗащитныйШаблон = "-";
ПравыйЗащитныйШаблон = "!";
СимволыШрифтаПоТипамКодов = СоздатьОбъект("ТаблицаЗначений");
СимволыШрифтаПоТипамКодов.НоваяКолонка("Ключ");
СимволыШрифтаПоТипамКодов.НоваяКолонка("Значение");
СимволыШрифтаПоТипамКодов.НоваяСтрока();
СимволыШрифтаПоТипамКодов.Ключ = "L";
СимволыШрифтаПоТипамКодов.Значение = "0123456789";
СимволыШрифтаПоТипамКодов.НоваяСтрока();
СимволыШрифтаПоТипамКодов.Ключ = "G";
СимволыШрифтаПоТипамКодов.Значение = "ABCDEFGHIJ";
СимволыШрифтаПоТипамКодов.НоваяСтрока();
СимволыШрифтаПоТипамКодов.Ключ = "R";
СимволыШрифтаПоТипамКодов.Значение = "abcdefghij";
СпособыКодированияЛевойЧасти[1] = "LLLLLL";
СпособыКодированияЛевойЧасти[2] = "LLGLGG";
СпособыКодированияЛевойЧасти[3] = "LLGGLG";
СпособыКодированияЛевойЧасти[4] = "LLGGGL";
СпособыКодированияЛевойЧасти[5] = "LGLLGG";
СпособыКодированияЛевойЧасти[6] = "LGGLLG";
СпособыКодированияЛевойЧасти[7] = "LGGGLL";
СпособыКодированияЛевойЧасти[8] = "LGLGLG";
СпособыКодированияЛевойЧасти[9] = "LGLGGL";
СпособыКодированияЛевойЧасти[10] = "LGGLGL";
СпособКодированияПравойЧасти = "RRRRRR";
Если СтрДлина(ШтрихкодСтрокойСимволов) = 13 Тогда
КоличествоСимволовВГруппе = 6;
ИначеЕсли СтрДлина(ШтрихкодСтрокойСимволов) = 8 Тогда
КоличествоСимволовВГруппе = 4;
СимволыСпособовКодирования = "";
ШтрихкодСтрокойСимволов = "0" + ШтрихкодСтрокойСимволов;
Иначе
Предупреждение("Поддерживаются только штрихкоды длиной 13 и 8 символов");
Возврат "";
КонецЕсли;
ИндексСпособаКодирования = Число(Лев(ШтрихкодСтрокойСимволов,1));
ЛеваяЧастьКода = "";
ПраваяЧастьКода = "";
Для ИндексСимвола = 1 По КоличествоСимволовВГруппе Цикл
// Обработка левой части
СпосКодЛевЧаст = СпособыКодированияЛевойЧасти[ИндексСпособаКодирования + 1];
СимвКодКлюч = Сред(СпосКодЛевЧаст, ИндексСимвола, 1);
Стр = "";
Если СимволыШрифтаПоТипамКодов.НайтиЗначение(СимвКодКлюч, Стр, "Ключ") = 1 Тогда
СимвПоТипу = СимволыШрифтаПоТипамКодов.ПолучитьЗначение(Стр, "Значение");
КонецЕсли;
ЛеваяЧастьКода = ЛеваяЧастьКода + Сред(СимвПоТипу, Число(Сред(ШтрихкодСтрокойСимволов, (ИндексСимвола+1), 1))+1, 1);
// Обработка правой части
Стр = "";
СимвКодПравКлюч = Сред(СпособКодированияПравойЧасти, ИндексСимвола, 1);
Если СимволыШрифтаПоТипамКодов.НайтиЗначение(СимвКодПравКлюч, Стр, "Ключ") = 1 Тогда
СимвПоТипуПрав = СимволыШрифтаПоТипамКодов.ПолучитьЗначение(Стр, "Значение");
КонецЕсли;
ПраваяЧастьКода = ПраваяЧастьКода + Сред(СимвПоТипуПрав, Число(Сред(ШтрихкодСтрокойСимволов, (ИндексСимвола + КоличествоСимволовВГруппе + 1), 1))+1, 1);
КонецЦикла;
Результат = "" + Сред(СимволыСпособовКодирования, ИндексСпособаКодирования + 1, 1)
+ ЛевыйЗащитныйШаблон
+ ЛеваяЧастьКода
+ СреднийЗащитныйШаблон
+ ПраваяЧастьКода
+ ПраваяЧастьКода
+ ПравыйЗащитныйШаблон;
Возврат Результат;
КонецФункции
Выясним причину использования такой сложной логики. Штрихкод EAN-13 разделен на две половины средним защитным шаблоном (разделителем). Каждая цифра в левой половине может кодироваться разными наборами штрихов в зависимости от первой цифры кода. Функция учитывает эти правила и возвращает строку, которую шрифт превратит в валидную картинку.
После того как функция добавлена в конфигурацию, перейдем к редактированию макета ценника. Выполним следующие действия:
СформироватьСтрокуEanGnivc(СокрЛП(ТабТовары.Штрихкод)).EanGnivc. Размер шрифта подберите экспериментально (обычно от 20 до 36 пунктов, в зависимости от желаемого размера).Проанализируем ситуацию, когда сканер перестает читать мелкий штрихкод. Это происходит из-за нарушения так называемых «тихих зон» (Quiet Zones). Штрихкоду обязательно нужно пустое пространство (белое поле) слева и справа. Если вы вплотную прижали штрихкод к рамке ценника, сканер не сможет его распознать.
Рассмотрим рекомендации по улучшению читаемости:
Хотя проблема чаще встречается в версии 7.7, приведем пример кода той же функции для современных версий платформы 8.x (Управляемые и обычные формы), так как логика формирования шрифтовой строки идентична.
Функция СформироватьСтрокуEanGnivc(ШтрихкодСтрокойСимволов) Экспорт
СимволыСпособовКодирования = "#$%&'()*+,";
ЛевыйЗащитныйШаблон = "!";
СреднийЗащитныйШаблон = "-";
ПравыйЗащитныйШаблон = "!";
СимволыШрифтаПоТипамКодов = Новый Соответствие;
СимволыШрифтаПоТипамКодов.Вставить("L", "0123456789");
СимволыШрифтаПоТипамКодов.Вставить("G", "ABCDEFGHIJ");
СимволыШрифтаПоТипамКодов.Вставить("R", "abcdefghij");
СпособыКодированияЛевойЧасти = Новый Массив;
СпособыКодированияЛевойЧасти.Добавить("LLLLLL");
СпособыКодированияЛевойЧасти.Добавить("LLGLGG");
СпособыКодированияЛевойЧасти.Добавить("LLGGLG");
// ... и так далее до 10 элементов
// Логика аналогична 7.7, но с использованием объектов Соответствие и Массив
// Результат выводится в ячейку табличного документа со шрифтом EanGnivc
КонецФункции
Использование шрифтового метода позволяет гибко управлять дизайном ценников, экономя место на бумаге и обеспечивая корректный поворот штрихкода под любым углом, что невозможно при использовании стандартных объектов ActiveX.