При работе со старыми конфигурациями 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С:Библиотеки подключаемого оборудования» (БПО). Она кроссплатформенная, не требует регистрации в реестре и отлично работает во внешних обработках.
Для начала нам понадобится сама библиотека. Как правило, она называется КомпонентаПечатиШтрихкодов. Если у вас есть доступ к любой современной конфигурации (УТ 11, БП 3.0, ERP), найдите в ней общий макет с таким именем. Это архив (двоичные данные), содержащий файлы BarcodeCustom.dll или аналогичные.
Выясним, как внедрить её в нашу внешнюю печатную форму:
КомпонентаПечатиШтрихкодов.В макете, где должна выводиться печатная форма, нам нужно зарезервировать место под штрихкод. Разберем по шагам, как это сделать правильно:
РисунокШтрихкод. Это имя мы будем использовать в коде для программной подмены изображения.Размер картинки в значение Пропорционально или Реальный размер. Использование значения Растянуть может исказить пропорции полос, из-за чего сканер не сможет считать код.Теперь перейдем к самому интересному — написанию кода в модуле внешней обработки. Нам нужно инициализировать компоненту, передать ей параметры штрихкода (значение, тип, размеры) и получить картинку для вывода в макет.
Рассмотрим пример функции, которая подключает компоненту из макета двоичных данных и возвращает объект картинки:
Функция ПолучитьКартинкуШтрихкода(ЗначениеШтрихкода, Ширина, Высота)
// Пытаемся подключить компоненту из макета внешней обработки
ИмяПутиКВК = "ОбщийМакет.КомпонентаПечатиШтрихкодов"; // Если в конфе
// Или, если компонента внутри самой обработки:
// ИмяПутиКВК = ЭтотОбъект.ПолучитьМакет("КомпонентаПечатиШтрихкодов");
РезультатПодключения = УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов");
Если Не РезультатПодключения Тогда
Возврат Неопределено;
КонецЕсли;
// Создаем объект компоненты
Попытка
ОбъектШК = Новый("AddIn.КартинкаШтрихкода.Barcode");
Исключение
Сообщить("Не удалось создать объект штрихкода!");
Возврат Неопределено;
КонецПопытки;
// Устанавливаем параметры
ОбъектШК.ТипКода = 1; // 1 соответствует EAN13
ОбъектШК.Сообщение = ЗначениеШтрихкода;
ОбъектШК.ТекстКода = ЗначениеШтрихкода;
ОбъектШК.ОтображатьТекст = Истина; // Чтобы под штрихкодом были цифры
// Задаем размеры
ОбъектШК.Ширина = Ширина;
ОбъектШК.Высота = Высота;
// Получаем картинку
Возврат ОбъектШК.ПолучитьКартинку();
КонецФункции
Проанализируем процесс сборки печатной формы. В процедуре Печать, там, где вы получаете область макета, нужно найти наш рисунок и присвоить ему сгенерированное изображение.
// ... код получения данных из запроса ...
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
ШтрихкодНоменклатуры = "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.
Этот метод надежен, так как не зависит от разрядности системы, но требует установки шрифта на каждое рабочее место, что не всегда удобно в крупных сетях.
Подводя итог, использование Native API компоненты из БСП, внедренной прямо во внешнюю печатную форму, является наиболее профессиональным и отказоустойчивым решением для старых систем на платформе 1С 8.3.