Как вывести штрихкод номенклатуры в табличный документ печатной формы в 1С:Управление торговлей 11?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

При разработке внешних печатных форм (ВПФ) или доработке типовых документов в 1С:Управление торговлей 11 часто возникает необходимость вывести штрихкод номенклатуры не в виде текстовой строки цифр, а в виде графического штрихового кода, готового для считывания сканером. Разберем особенности реализации этой задачи на управляемых формах и выясним, как правильно сформировать изображение штрихкода на стороне сервера.

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

Проанализируем распространенные ошибки и ограничения классических способов формирования штрихкодов:

  1. ActiveX-компонента 1CBarCode (Печать штрихкодов): Старая 32-разрядная OLE/ActiveX компонента не может работать на стороне сервера 1С и в тонком клиенте под 64-битными ОС или Linux. Попытка прямого обращения к элементу управления в макете вида Область.Рисунки.Штрихкод.Объект на управляемых формах вызывает синтаксические ошибки и ошибки выполнения.
  2. Специальные шрифты (например, EAN-13 / Code 128 TTF): Простая смена шрифта ячейки на штрихкодовый шрифт не превращает строку цифр в рабочий штрихкод. Для правильного считывания сканером строка должна предварительно проходить специальное алгоритмическое кодирование (расчет контрольного разряда, добавление стартовых и стоповых символов). Кроме того, шрифт должен быть установлен на каждом рабочем месте или сервере печати.

Наиболее надежным и кроссплатформенным решением в управляемом приложении является программная генерация картинки со штрихкодом с последующей передачей объекта Картинка в соответствующую область табличного документа.

Способ 1. Использование встроенных механизмов БПО и БСП (рекомендуемый)

В типовых конфигурациях (таких как 1С:Управление торговлей 11, 1С:Комплексная автоматизация, 1С:ERP) уже реализован общий модуль подсистемы подключаемого оборудования — МенеджерОборудованияВызовСервера. Он предоставляет готовую функцию для генерации изображения штрихкода через серверную Native-компоненту.

Разберем по шагам, как подготовить макет и заполнить его программно:

  1. В макете печатной формы в строке табличной части добавьте объект типа Рисунок (или картинка) и задайте ему понятное имя, например, КартинкаШтрихкода.
  2. Убедитесь, что границы рисунка строго укладываются в границы выводимой строки таблицы (секции), чтобы при выводе нескольких строк рисунки не накладывались друг на друга.
  3. В модуле формирования печатной формы опишите расчет габаритов и получение картинки.

Посмотрим на рабочий пример кода при обходе строк результата запроса:


Пока РезультатЗапроса.Следующий() Цикл
    // Заполняем текстовые параметры строки
    ЗаполнитьЗначенияСвойств(ОбластьТабличнаяЧасть.Параметры, РезультатЗапроса);
    
    // Проверяем наличие штрихкода у позиции
    Если ЗначениеЗаполнено(РезультатЗапроса.ШтрихКод) Тогда
        
        // Получаем эталонный коэффициент перевода миллиметров в пиксели
        Эталон = Обработки.ПечатьЭтикетокИЦенников.ПолучитьМакет("Эталон");    
        КоличествоМиллиметровВПикселе = Эталон.Рисунки.Квадрат100Пикселей.Высота / 100;
        
        // Формируем параметры генерации штрихкода
        ПараметрыШтрихкода = Новый Структура;
        ПараметрыШтрихкода.Вставить("Ширина",          Окр(ОбластьТабличнаяЧасть.Рисунки.КартинкаШтрихкода.Ширина / КоличествоМиллиметровВПикселе));
        ПараметрыШтрихкода.Вставить("Высота",          Окр(ОбластьТабличнаяЧасть.Рисунки.КартинкаШтрихкода.Высота / КоличествоМиллиметровВПикселе));
        ПараметрыШтрихкода.Вставить("Штрихкод",        РезультатЗапроса.ШтрихКод);
        ПараметрыШтрихкода.Вставить("ТипКода",         1); // 1 соответствует формату EAN-13
        ПараметрыШтрихкода.Вставить("ОтображатьТекст", Истина);
        ПараметрыШтрихкода.Вставить("РазмерШрифта",    10);
        
        // Генерируем картинку через серверную функцию БПО
        ОбластьТабличнаяЧасть.Рисунки.КартинкаШтрихкода.Картинка = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
    Иначе
        // Очищаем область рисунка, если у номенклатуры нет штрихкода
        ОбластьТабличнаяЧасть.Рисунки.КартинкаШтрихкода.Картинка = Новый Картинка;
    КонецЕсли;
    
    ТабличныйДокумент.Вывести(ОбластьТабличнаяЧасть);
КонецЦикла;

Способ 2. Автономное подключение Native-компоненты штрихкодирования

Если печатная форма разрабатывается как полностью автономная внешняя обработка, которая не должна зависеть от версий типовых модулей конфигурации, можно использовать прямое подключение Native-компоненты 1С для печати штрихкодов.

Рассмотрим пример программной работы с компонентой:


// Подключаем Native-компоненту из общего макета или макета внешней обработки
РезультатПодключения = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "ВКШтрихкод", ТипПодключенияВнешнейКомпоненты.Изолированно);

Если РезультатПодключения Тогда
    Генератор = Новый("AddIn.ВКШтрихкод.Barcode");
    Генератор.АвтоТип = Ложь;
    Генератор.ТипКода = 1; // 1 — EAN-13
    Генератор.ЗначениеКода = РезультатЗапроса.ШтрихКод;
    Генератор.ОтображатьТекст = Истина;
    Генератор.РазмерШрифта = 10;
    Генератор.Ширина = 200;
    Генератор.Высота = 80;
    
    ДвоичныеДанныеКартинки = Генератор.ПолучитьШтрихкод();
    Если ДвоичныеДанныеКартинки <> Неопределено Тогда
        ОбластьТабличнаяЧасть.Рисунки.КартинкаШтрихкода.Картинка = Новый Картинка(ДвоичныеДанныеКартинки);
    КонецЕсли;
КонецЕсли;

Важные практические нюансы

Проанализируем ключевые моменты, на которые следует обратить внимание при настройке вывода:

  1. Валидация данных: Для генерации кода формата EAN-13 строка штрихкода должна содержать строго 12 цифр (без контрольной суммы) или 13 цифр (с корректно рассчитанной контрольной суммой). Наличие букв, пробелов или неверной длины приведет к тому, что компонента вернет пустое значение.
  2. Пропорции и масштабирование: Чтобы линии штрихкода не размывались и уверенно читались складскими и торговыми сканерами, в свойствах объекта рисунка в макете рекомендуется устанавливать свойство РазмерКартинки в значение АвтоРазмер или РеальныйРазмер.
  3. Очистка рисунка: При последовательном заполнении секций таблицы в цикле обязательно очищайте рисунок с помощью Новый Картинка, если для текущей строки штрихкод в информационной базе не задан. В противном случае в ячейке может остаться изображение от предыдущей обработанной позиции.
← На главную