Почему не отображается штрихкод при печати макета в 1С и как это исправить?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Наверняка многие разработчики 1С сталкивались с ситуацией: при формировании печатной формы этикетки, ценника или расходной накладной вместо красивого штрихкода отображается пустое белое поле. При этом внешняя компонента успешно подключается в системе, отладчик показывает, что штрихкод у номенклатуры заполнен, но функция ПолучитьКартинкуШтрихкода упорно возвращает Неопределено.

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

Анализ исходного кода и сути проблемы

Рассмотрим стандартный программный код, который часто используют для формирования печатных форм со штрихкодом в обычных формах или старых конфигурациях:


Процедура Печать(ТабДок, Ссылка) Экспорт
    ВнешняяКомпонента = РаботаСТорговымОборудованием.ПодключитьВнешнююКомпонентуПечатиШтрихкода;
    Если ВнешняяКомпонента = Неопределено Тогда
        Сообщить("Не удалось получить компоненту штрих код");
        Возврат;
    КонецЕсли;
    
    Макет = Справочники.Номенклатура.ПолучитьМакет("Печать");
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Номенклатура.БарКод КАК БарКод,
        |   Номенклатура.Наименование КАК Наименование
        |ИЗ
        |   Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |   Номенклатура.Ссылка В (&Ссылка)";
    Запрос.Параметры.Вставить("Ссылка", Ссылка);
    Выборка = Запрос.Выполнить.Выбрать;
    
    Шапка = Макет.ПолучитьОбласть("Шапка");
    ТабДок.Очистить;
    ВставлятьРазделительСтраниц = Ложь;
    
    Пока Выборка.Следующий Цикл
        Если ВставлятьРазделительСтраниц Тогда
            ТабДок.ВывестиГоризонтальныйРазделительСтраниц;
        КонецЕсли;
        
        Шапка.Параметры.Заполнить(Выборка);
        
        // Проблемная строка кода:
        Шапка.Рисунки.ШтрихКод.Картинка = РаботаСТорговымОборудованием.ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, Выборка.БарКод, 49, 35);
        
        ТабДок.Вывести(Шапка, Выборка.Уровень);
        ВставлятьРазделительСтраниц = Истина;
    КонецЦикла;
КонецПроцедуры

При выполнении этого кода внешняя компонента успешно инициализируется и принимает значение AddIn.КартинкаШтрихКода.Barcode, однако на выходе мы получаем пустой белый лист, а в отладчике переменная картинки принимает значение Неопределено. Выясним, почему это происходит.

Причина 1. Неправильный порядок и состав параметров функции (тот самый «пустяк»)

Самая распространенная ошибка разработчиков — невнимательное отношение к сигнатуре (описанию) вызываемой функции общего модуля. Посмотрим, как автор передает параметры:

ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, Выборка.БарКод, 49, 35)

В старых типовых конфигурациях (например, «Управление торговлей 10.3» или «Управление производственным предприятием 1.3») функция ПолучитьКартинкуШтрихкода в модуле РаботаСТорговымОборудованием имеет следующую сигнатуру:

ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, Ширина, Высота, Штрихкод, ТипКода = 0)

Что происходит при ошибочном вызове:

Внешняя компонента пытается сгенерировать штрихкод со значением «35», используя строковое представление длинного штрихкода в качестве ширины картинки. Естественно, валидация компоненты завершается ошибкой, и функция возвращает пустое значение Неопределено.

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


// Передаем параметры правильно: Компонента, Ширина, Высота, Штрихкод, ТипКода (0 - автоопределение или EAN13)
Шапка.Рисунки.ШтрихКод.Картинка = РаботаСТорговымОборудованием.ПолучитьКартинкуШтрихкода(
    ВнешняяКомпонента, 
    150, // Ширина в пикселях
    50,  // Высота в пикселях
    Выборка.БарКод, 
    1    // Тип кода (например, 1 для EAN-13)
);

Причина 2. Переход конфигурации на новые версии БПО (структурный формат)

Если вы работаете в современных конфигурациях на управляемых формах (например, «1С:ERP», «Комплексная автоматизация 2», «Управление торговлей 11» или «Розница 3»), механизм взаимодействия с торговым оборудованием претерпел значительные изменения. В современной Библиотеке подключаемого оборудования (БПО) сигнатура вызова функции генерации штрихкода кардинально изменилась.

Вместо передачи списка разрозненных параметров теперь используется специализированная структура. Попытка вызвать функцию по старой схеме гарантированно вернет Неопределено.

Как исправить: Рассмотрим правильный пример формирования картинки штрихкода для современных конфигураций:


// 1. Инициализируем структуру параметров для генерации
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина",         150);
ПараметрыШтрихкода.Вставить("Высота",         50);
ПараметрыШтрихкода.Вставить("Штрихкод",       Выборка.БарКод);
ПараметрыШтрихкода.Вставить("ТипКода",        1); // Код типа штрихкода (1 - EAN13, 2 - EAN8, 16 - Code128 и т.д.)
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Истина);
ПараметрыШтрихкода.Вставить("РазмерШрифта",   10);

// 2. Получаем картинку через менеджер оборудования
КартинкаШтрихкода = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);

Если КартинкаШтрихкода <> Неопределено Тогда
    Шапка.Рисунки.ШтрихКод.Картинка = КартинкаШтрихкода;
КонецЕсли;

Причина 3. Невалидный формат штрихкода

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

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

  1. EAN-13: Строка должна состоять строго из 12 или 13 цифровых символов. Любые пробелы, буквы или спецсимволы приведут к ошибке генерации. Если передано 12 символов, компонента автоматически рассчитает 13-й контрольный символ. Если длина строки отличается от 12 или 13 — функция вернет Неопределено.
  2. Code128: Поддерживает латинские буквы, цифры и спецсимволы. Однако, если в строке присутствуют символы кириллицы (русские буквы), компонента не сможет составить валидную кодовую таблицу и завершит работу с ошибкой.

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


// Очищаем строку штрихкода от лишних пробелов и символов
ЧистыйШтрихкод = СокрЛП(Выборка.БарКод);
ЧистыйШтрихкод = СтрЗаменить(ЧистыйШтрихкод, Символы.НПП, ""); // Удаление неразрывных пробелов

// Дополнительная проверка для EAN-13
Если ТипКода = 1 И СтрДлина(ЧистыйШтрихкод) <> 12 И СтрДлина(ЧистыйШтрихкод) <> 13 Тогда
    Сообщить("Неверная длина штрихкода для формата EAN-13: " + ЧистыйШтрихкод);
КонецЕсли;

Причина 4. Слишком маленькие физические размеры картинки

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

Для гарантированного вывода рекомендуется использовать ширину не менее 100–150 пикселей, а высоту — не менее 40–50 пикселей. Масштабирование под размер рамки в макете лучше настраивать непосредственно в самом свойстве рисунка табличного документа (свойство "Размер картины" установить в значение "Пропорционально" или "Реальный размер" с достаточными границами).

Причина 5. Попытка генерации штрихкода на стороне сервера 1С

Если код печати выполняется на сервере (например, в модуле менеджера объекта или в фоновом задании), внешняя компонента может работать некорректно. Это связано с тем, что для отрисовки графики компоненте требуется доступ к графической подсистеме операционной системы (GDI+ в Windows). На серверных операционных системах под учетной записью службы 1С доступ к этим функциям может быть заблокирован из-за отсутствия необходимых прав или специфики окружения (свойство компоненты ГрафикаУстановлена возвращает значение Ложь).

Решение: Переносите инициализацию внешней компоненты и вызов функции генерации картинки на сторону клиента (в модуль формы), а на сервер передавайте уже сформированный готовый двоичный макет или готовую картинку.

Резюме

Если при печати макета вы столкнулись с белым полем вместо штрихкода, действуйте по следующему алгоритму:

  1. Проверьте в режиме отладки, возвращает ли функция ПолучитьКартинкуШтрихкода значение Неопределено.
  2. Если возвращает Неопределено, проверьте порядок передаваемых аргументов. Убедитесь, что параметры ширины, высоты и самого штрихкода не перепутаны местами.
  3. Убедитесь, что передаваемый штрихкод очищен от пробелов и соответствует требованиям выбранного стандарта (длина и допустимые символы).
  4. Попробуйте увеличить передаваемые размеры ширины и высоты картинки.
← На главную