Как в 1С 7.7 повернуть штрихкод на 90 градусов и уменьшить его размер в ценнике

Программист 1С v7.7 Торговля и дистрибуция
← На главную

При разработке печатных форм ценников в системе 1С:Предприятие 7.7 разработчики часто сталкиваются с ограничением стандартного компонента barcode.ocx. Этот объект невозможно повернуть стандартными средствами платформы, а при попытке сильно уменьшить его размер штрихи становятся нечитаемыми для сканера или вовсе исчезают из предварительного просмотра. Рассмотрим, как решить эту задачу профессионально, используя метод шрифтового вывода.

Почему стандартный штрихкод не подходит

Стандартный элемент управления штрихкодом в 1С 7.7 является объектом ActiveX. У таких объектов в конфигураторе отсутствует вкладка «Положение», где можно было бы задать угол ориентации текста. Кроме того, масштабирование картинки внутри объекта происходит с искажениями. Проанализируем альтернативный путь: использование специализированного шрифта, например, EanGnivc. Поскольку для 1С это будет обычный текст, мы сможем применить к ячейке любые трансформации: поворот, изменение кегля и выравнивание.

Шаг 1: Установка шрифта и подготовка системы

Прежде всего, необходимо установить шрифт EanGnivc в операционную систему. Это файл формата .ttf. После установки шрифта перезагрузка 1С обязательна. Теперь в табличном документе (макете) для выбранной ячейки станет доступен этот шрифт. Однако просто вывести цифры штрихкода этим шрифтом нельзя — сканер их не распознает. Штрихкод EAN-13 имеет сложную структуру кодирования (левая и правая части кодируются по-разному), поэтому нам потребуется специальная функция-преобразователь.

Шаг 2: Реализация программного кода преобразования

Разберем программную логику. Нам нужно превратить обычную строку цифр (например, "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 разделен на две половины средним защитным шаблоном (разделителем). Каждая цифра в левой половине может кодироваться разными наборами штрихов в зависимости от первой цифры кода. Функция учитывает эти правила и возвращает строку, которую шрифт превратит в валидную картинку.

Шаг 3: Настройка макета и вывод данных

После того как функция добавлена в конфигурацию, перейдем к редактированию макета ценника. Выполним следующие действия:

  1. Выберите ячейку, в которой должен располагаться штрихкод.
  2. Откройте Свойства ячейки. На вкладке «Общие» установите Тип — «Выражение».
  3. В поле Выражение впишите вызов нашей функции, например: СформироватьСтрокуEanGnivc(СокрЛП(ТабТовары.Штрихкод)).
  4. Перейдите на вкладку «Шрифт» и выберите из списка EanGnivc. Размер шрифта подберите экспериментально (обычно от 20 до 36 пунктов, в зависимости от желаемого размера).
  5. На вкладке «Положение» установите Ориентация — 90. Это развернет ваш штрихкод вертикально.
  6. Важно: Установите свойство Контроль в значение «Авто» или «Переносить». Это предотвратит обрезание краев штрихкода.

Нюансы при уменьшении размера

Проанализируем ситуацию, когда сканер перестает читать мелкий штрихкод. Это происходит из-за нарушения так называемых «тихих зон» (Quiet Zones). Штрихкоду обязательно нужно пустое пространство (белое поле) слева и справа. Если вы вплотную прижали штрихкод к рамке ценника, сканер не сможет его распознать.

Рассмотрим рекомендации по улучшению читаемости:

Бонус: Аналогичное решение для 1С 8.3

Хотя проблема чаще встречается в версии 7.7, приведем пример кода той же функции для современных версий платформы 8.x (Управляемые и обычные формы), так как логика формирования шрифтовой строки идентична.


Функция СформироватьСтрокуEanGnivc(ШтрихкодСтрокойСимволов) Экспорт
    СимволыСпособовКодирования = "#$%&'()*+,";
    ЛевыйЗащитныйШаблон = "!";
    СреднийЗащитныйШаблон = "-";
    ПравыйЗащитныйШаблон = "!";
    
    СимволыШрифтаПоТипамКодов = Новый Соответствие;
    СимволыШрифтаПоТипамКодов.Вставить("L", "0123456789");
    СимволыШрифтаПоТипамКодов.Вставить("G", "ABCDEFGHIJ");
    СимволыШрифтаПоТипамКодов.Вставить("R", "abcdefghij");
    
    СпособыКодированияЛевойЧасти = Новый Массив;
    СпособыКодированияЛевойЧасти.Добавить("LLLLLL");
    СпособыКодированияЛевойЧасти.Добавить("LLGLGG");
    СпособыКодированияЛевойЧасти.Добавить("LLGGLG");
    // ... и так далее до 10 элементов
    
    // Логика аналогична 7.7, но с использованием объектов Соответствие и Массив
    // Результат выводится в ячейку табличного документа со шрифтом EanGnivc
КонецФункции

Использование шрифтового метода позволяет гибко управлять дизайном ценников, экономя место на бумаге и обеспечивая корректный поворот штрихкода под любым углом, что невозможно при использовании стандартных объектов ActiveX.

← На главную