Разберем задачу по внедрению графического изображения штрихкода в табличный документ печатной формы. В ходе работы мы столкнемся с необходимостью программного формирования картинки, ее привязки к макету и вывода на печать. Рассмотрим два основных подхода: использование шрифтов и использование внешней компоненты для генерации графического представления.
Если ваша задача сводится к выводу простых линейных штрихкодов стандартов EAN8 или EAN13, самым быстрым и производительным способом будет использование специальных шрифтов. Этот метод не требует сложной работы с двоичными данными и «рисунками» макета, что делает его предпочтительным для массовой печати, так как формирование текста происходит значительно быстрее.
Для реализации этого метода нам нужно предварительно закодировать строку штрихкода в специальный вид, понятный шрифту. Посмотрим на пример функции для кодирования EAN13:
&НаСервереБезКонтекста
Функция КодируемШтрихКод(Парам)
Если СтрДлина(Парам) <> 13 Тогда Возврат \"1234567890123\"; КонецЕсли;
ПечШтрих = \"\";
Код = Парам;
Ф = Новый Массив(11);
Ф[1]=\"000000\"; Ф[2]=\"001011\"; Ф[3]=\"001101\"; Ф[4]=\"001110\";
Ф[5]=\"010011\"; Ф[6]=\"011001\"; Ф[7]=\"011100\"; Ф[8]=\"010101\";
Ф[9]=\"010110\"; Ф[10]=\"011010\";
Маска = \"\" + Лев(СокрЛП(Код), 1) + Ф[Число(Лев(СокрЛП(Код), 1)) + 1] + \"222222\";
Дл = СтрДлина(Код);
Для ИИ = 1 По Дл Цикл
Если ИИ = 1 Тогда Стр1 = \"\" + Лев(СокрЛП(Код), 1);
Иначе
СимволМаски = Сред(Маска, ИИ, 1);
Если СимволМаски = \"0\" Тогда Стр1 = Символ(65 + Сред(Код, ИИ, 1));
ИначеЕсли СимволМаски = \"1\" Тогда Стр1 = Символ(75 + Сред(Код, ИИ, 1));
ИначеЕсли СимволМаски = \"2\" Тогда Стр1 = Символ(97 + Сред(Код, ИИ, 1));
КонецЕсли;
КонецЕсли;
ПечШтрих = ПечШтрих + Стр1;
Если ИИ = 7 Тогда ПечШтрих = ПечШтрих + \"*\";
ИначеЕсли ИИ = 13 Тогда ПечШтрих = ПечШтрих + \"+\";
КонецЕсли;
КонецЦикла;
Возврат ПечШтрих;
КонецФункции
После получения строки-кода, мы просто присваиваем ее параметру ячейки области, у которой в макете задан соответствующий шрифт (например, EAN-13).
Если нам требуется формирование полноценных графических штрихкодов или QR-кодов, воспользуемся внешней компонентой 1С:Печать штрихкодов. Этот метод позволяет динамически формировать картинку и вставлять ее в область печатной формы.
Разберем этапы реализации:
ПодключитьВнешнююКомпоненту.ДвоичныеДанные.Картинка и вставка в макет через коллекцию Рисунки.Посмотрим, как выглядит функция получения картинки:
&НаСервере
Функция ПолучитьКартинкуШтрихкода(Штрихкод)
ПодключитьВнешнююКомпоненту(\"ОбщийМакет.КомпонентаПечатиШтрихкодов\", \"КартинкаШтрихкода\", ТипВнешнейКомпоненты.Native);
Компонент = Новый (\"AddIn.КартинкаШтрихкода.Barcode\");
Компонент.ТипКода = 1; // EAN-13
Компонент.ЗначениеКода = Штрихкод;
ДвоичныеДанныеКартинки = Компонент.ПолучитьШтрихкод;
Если НЕ ДвоичныеДанныеКартинки = Неопределено Тогда
Возврат Новый Картинка(ДвоичныеДанныеКартинки);
КонецЕсли;
Возврат Неопределено;
КонецФункции
Для корректной вставки картинки в печатную форму, необходимо выполнить следующие действия в Конфигураторе:
ШтрихкодК. Именно через это имя мы будем обращаться к объекту из кода.В самой процедуре формирования табличного документа мы находим нужную область и заполняем рисунок:
ОбластьЗаголовок = Макет.ПолучитьОбласть(\"Заголовок\");
ШтрихкодК = ПолучитьКартинкуШтрихкода(ДанныеШтрихкода);
Если ШтрихкодК <> Неопределено Тогда
ОбластьЗаголовок.Рисунки.ШтрихкодК.Картинка = ШтрихкодК;
КонецЕсли;
ТаблДок.Вывести(ОбластьЗаголовок);
Хотя реализация в модуле формы часто кажется наиболее простой, с точки зрения архитектуры 1С, рекомендуется выносить логику печати в Модуль менеджера. Это обеспечит возможность вызова печати из любых контекстов (фоновые задания, серверные вызовы, пакетная печать). Также не забывайте использовать методы Библиотеки стандартных подсистем (БСП), если они доступны в вашей конфигурации (подсистема УправлениеПечатью), так как они уже содержат готовые обертки для работы с штрихкодами, что позволяет избежать лишнего написания кода.
Помните: если вы планируете печать на стороне сервера, убедитесь, что внешняя компонента установлена и зарегистрирована на сервере 1С:Предприятия, иначе метод ПодключитьВнешнююКомпоненту вернет ошибку.