Как вывести штрихкод во внешнюю печатную форму в старой конфигурации 1С

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

При работе со старыми конфигурациями 1С, такими как «Бухгалтерия предприятия 2.0» или «Управление торговлей 10.3» на обычных формах, программисты часто сталкиваются с проблемой вывода штрихкода. Стандартные механизмы тех лет опирались на внешнюю компоненту 1CBarCode.exe (ActiveX), которая крайне нестабильно работает на современных 64-битных операционных системах и клиентах 1С. В данной статье мы разберем, как реализовать печать штрихкода, используя современные методы Native API, не снимая конфигурацию с поддержки и используя только возможности внешней печатной формы.

Проблема устаревших компонент

Рассмотрим типичную ситуацию: у нас есть база на обычных формах, установленная на Windows 10/11 x64. Использование старого инсталлятора 1CBarCode.exe требует регистрации библиотеки в реестре, прав администратора и часто приводит к аварийному завершению работы 1С (вылетам) при попытке зайти в свойства рисунка в макете. Кроме того, 32-битный ActiveX-объект просто не отобразится, если пользователь запустит 64-битный клиент 1С.

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

Шаг 1. Получение и подготовка компоненты

Для начала нам понадобится сама библиотека. Как правило, она называется КомпонентаПечатиШтрихкодов. Если у вас есть доступ к любой современной конфигурации (УТ 11, БП 3.0, ERP), найдите в ней общий макет с таким именем. Это архив (двоичные данные), содержащий файлы BarcodeCustom.dll или аналогичные.

Выясним, как внедрить её в нашу внешнюю печатную форму:

  1. Откроем нашу внешнюю печатную форму в конфигураторе.
  2. Создадим новый макет с типом Двоичные данные.
  3. Назовем макет, например, КомпонентаПечатиШтрихкодов.
  4. Загрузим в него файл архива с компонентой, который мы достали из типовой БСП.

Шаг 2. Подготовка макета печатной формы

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

  1. В нужном месте макета (например, в области заголовка или под табличной частью) выберем меню Таблица — Рисунки — Вставить рисунок.
  2. Выберите тип Объект. Однако, учитывая нестабильность ActiveX, лучше вставить обычную Картинку (пустую).
  3. Дайте этому рисунку имя, например, РисунокШтрихкод. Это имя мы будем использовать в коде для программной подмены изображения.
  4. Важно: в свойствах рисунка установите параметр Размер картинки в значение Пропорционально или Реальный размер. Использование значения Растянуть может исказить пропорции полос, из-за чего сканер не сможет считать код.

Шаг 3. Программная генерация штрихкода

Теперь перейдем к самому интересному — написанию кода в модуле внешней обработки. Нам нужно инициализировать компоненту, передать ей параметры штрихкода (значение, тип, размеры) и получить картинку для вывода в макет.

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


Функция ПолучитьКартинкуШтрихкода(ЗначениеШтрихкода, Ширина, Высота)
    
    // Пытаемся подключить компоненту из макета внешней обработки
    ИмяПутиКВК = "ОбщийМакет.КомпонентаПечатиШтрихкодов"; // Если в конфе
    // Или, если компонента внутри самой обработки:
    // ИмяПутиКВК = ЭтотОбъект.ПолучитьМакет("КомпонентаПечатиШтрихкодов");
    
    РезультатПодключения = УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов");
    
    Если Не РезультатПодключения Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    // Создаем объект компоненты
    Попытка
        ОбъектШК = Новый("AddIn.КартинкаШтрихкода.Barcode");
    Исключение
        Сообщить("Не удалось создать объект штрихкода!");
        Возврат Неопределено;
    КонецПопытки;

    // Устанавливаем параметры
    ОбъектШК.ТипКода = 1; // 1 соответствует EAN13
    ОбъектШК.Сообщение = ЗначениеШтрихкода;
    ОбъектШК.ТекстКода = ЗначениеШтрихкода;
    ОбъектШК.ОтображатьТекст = Истина; // Чтобы под штрихкодом были цифры
    
    // Задаем размеры
    ОбъектШК.Ширина = Ширина;
    ОбъектШК.Высота = Высота;
    
    // Получаем картинку
    Возврат ОбъектШК.ПолучитьКартинку();
    
КонецФункции

Шаг 4. Вывод в табличный документ

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


// ... код получения данных из запроса ...
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
ШтрихкодНоменклатуры = "4821506487000"; // Пример из сообщения автора

// Получаем картинку (размеры в пикселях)
КартинкаШК = ПолучитьКартинкуШтрихкода(ШтрихкодНоменклатуры, 300, 150);

Если КартинкаШК <> Неопределено Тогда
    // Обращаемся к рисунку по имени, которое мы дали в макете
    Рисунок = ОбластьМакета.Рисунки.РисунокШтрихкод;
    Рисунок.Картинка = КартинкаШК;
КонецЕсли;

ТабДок.Вывести(ОбластьМакета);

Разбор типичных ошибок и нюансов

Выясним, почему штрихкод может не отображаться или отображаться некорректно:

1. Отсутствие цифр под штрихкодом.
Как заметили участники обсуждения (сообщение №35), за это отвечает параметр ОтображатьТекст. Если вы используете современную компоненту, обязательно установите его в Истина. Также проверьте параметр ТекстКода — именно он содержит строку, которая будет написана внизу. Если область рисунка в макете слишком "прижата" по высоте, компонента может отрисовать только полосы, скрыв текст ради экономии места. Попробуйте немного увеличить высоту рисунка в конфигураторе.

2. Контрольный символ EAN13.
Помните, что формат EAN13 состоит из 12 значащих цифр и 13-й контрольной. Если вы передаете в компоненту 13 цифр, проверьте, правильно ли рассчитана последняя. Если контрольная сумма не совпадает, компонента может выдать пустую картинку. Многие современные компоненты умеют рассчитывать 13-й символ сами, если им передать только 12 цифр.

3. Проблема 64-битных систем.
Если вы все же решили использовать старый 1CBarcode.exe, помните: он работает только в 32-битном процессе. Если ваш сервер 1С или клиент запущен в 64-битном режиме, библиотека не загрузится. Решение одно — переход на Native API (описанный выше метод) или использование специальных шрифтов штрихкода (EAN13.ttf).

4. Работа со свойствами номенклатуры.
Поскольку в старой конфигурации (как у автора вопроса) нет типового регистра сведений со штрихкодами, получение значения через ДополнительныеСвойства — абсолютно верное решение. Главное — убедиться, что в свойстве нет лишних пробелов или невидимых символов, которые могут "сломать" генерацию картинки. Используйте функцию СокрЛП() при получении значения.

Альтернативный метод: Использование шрифтов

Рассмотрим еще один способ, который не требует внешних компонент вообще. Это использование шрифтов типа BarCode EAN13.

  1. Вы устанавливаете шрифт в операционную систему на всех компьютерах, где будет производиться печать.
  2. В макете 1С для ячейки выбираете этот шрифт.
  3. Программно преобразуете строку цифр (например, "482...") в специальную последовательность символов. Дело в том, что шрифт EAN13 не просто заменяет "1" на "полоску", там используется сложный алгоритм смены наборов символов в зависимости от позиции.

Этот метод надежен, так как не зависит от разрядности системы, но требует установки шрифта на каждое рабочее место, что не всегда удобно в крупных сетях.

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

← На главную