1С: Печать штрих кодов
Старый вариант печати штрих-кода в документах
Ранее, на платфотме 8.1 и 8.2 в режиме обычного приложения ("толстого клиента"), штрих код печатался так: качаем и устанавливаем компонент «1С:Печать штрихкодов», можно по ссылке с сайта 1С: https://its.1c.ru/db/files/1CITS/EXE/TradeWare/1C/1CBarCode/1CBarCode.exe. В макет добавляем необходимый ActiveX объект. В момент вывода секции меняем свойство "Объект.Сообщение", подсовываем ему значение штрих-кода, получается примерно так:
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
ОбластьМакета.Рисунки.Штрихкод.Объект.ТипКода = 4;
ОбластьМакета.Рисунки.Штрихкод.Объект.Сообщение = ПолучитьШтрихкодДокумента(Ссылка);
В итоге в документе будет выведен желаемый штрих-код.
Проблема, в режиме управляемого приложения вываливается ошибка:
ОбластьВывода.Рисунки.ШтрихКод.Объект – неопределено
Новый вариант печати штрих-кода через компоненту из макета
Дело в том, что для управляемого приложения внешние компоненты разрабатываются по другой технологии. Пример внешней компоненты для печати штрих-кода для управляемых форм есть в демонстрационной конфигурации "Управляемое приложение" в макетах справочника Товары, либо в конфигурации «1С:Управление торговлей» версии 11, макеты обработки «Печать этикеток и ценников».
Новую компоненту не надо вставлять непосредственно в макет печатаемого документа, надо передать ей строковое значение, в ответ она вернет штрих код в виде "картинки". Саму компоненту лучше загрузить компоненту в общий макет (в виде бинарных данных).
Сначала в макет вставляем обычную картинку:
Для картинки назначаем имя объекта "КартинкаШтрихкода":
Далее надо получить объект внешней компоненты:
Функция ПодключитьВнешнююКомпонентуПечатиШтрихкода() Экспорт
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
// Создадим объект внешней компоненты
Если ПодключениеВыполнено Тогда
ВнешняяКомпонента = Новый("AddIn.КартинкаШтрихкода.Barcode");
Иначе
Возврат Неопределено;
КонецЕсли;
// Если нет возможности рисовать
Если НЕ ВнешняяКомпонента.ГрафикаУстановлена Тогда
// То картинку сформировать не сможем
Возврат Неопределено;
Иначе
// Установим основные параметры компоненты
// Если в системе установлен шрифт Tahoma
Если ВнешняяКомпонента.НайтиШрифт("Tahoma") = Истина Тогда
// Выбираем его как шрифт для формирования картинки
ВнешняяКомпонента.Шрифт = "Tahoma";
Иначе
// Шрифт Tahoma в системе отсутствует
// Обойдем все доступные компоненте шрифты
Для Сч = 0 По ВнешняяКомпонента.КоличествоШрифтов -1 Цикл
// Получим очередной шрифт, доступный компоненте
ТекущийШрифт = ВнешняяКомпонента.ШрифтПоИндексу(Сч);
// Если шрифт доступен
Если ТекущийШрифт <> Неопределено Тогда
// Они и будет шрифтом для формирования штри-кода
ВнешняяКомпонента.Шрифт = ТекущийШрифт;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// Утановим размер шрифта
ВнешняяКомпонента.РазмерШрифта = 12;
Возврат ВнешняяКомпонента;
КонецЕсли;
КонецФункции
В первой строке функции компонента загружается из макета, далее заполняются параметры и возвращается объект компоненты. Затем опишем функцию, которая, получив данные, сформирует нужную нам картинку с штрихкодом:
Функция ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода) Экспорт
ВнешняяКомпонента = ПодключитьВнешнююКомпонентуПечатиШтрихкода();
Если ВнешняяКомпонента = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Ошибка подключения внешней компоненты печати штрихкода!'");
КонецЕсли;
// Зададим размер картинки
ВнешняяКомпонента.Ширина = Окр(ПараметрыШтрихкода.Ширина);
ВнешняяКомпонента.Высота = Окр(ПараметрыШтрихкода.Высота);
ВнешняяКомпонента.АвтоТип = Ложь;
ВнешняяКомпонента.ТипКода = ПараметрыШтрихкода.ТипКода;
ВнешняяКомпонента.ОтображатьТекст = ПараметрыШтрихкода.ОтображатьТекст;
ВнешняяКомпонента.РазмерШрифта = ПараметрыШтрихкода.РазмерШрифта;
// Или установим код EAN-13
// ВнешняяКомпонента.ТипКода = 1;
//
// Тип смотрим в документации на внешнуюю компоненту
// Если код содержит контрольный символ, обязательно указываем
ВнешняяКомпонента.СодержитКС = СтрДлина(ПараметрыШтрихкода.Штрихкод) = 13;
// Если отображать контрольный символ не нужно
// ВнешняяКомпонента.ВидимостьКС = Ложь;
// Формируем картинку штрихкода
ВнешняяКомпонента.ЗначениеКода = ПараметрыШтрихкода.Штрихкод;
// Если установленная нами ширина меньше минимально допустимой для этого штрихкода
Если ВнешняяКомпонента.Ширина < ВнешняяКомпонента.МинимальнаяШиринаКода Тогда
ВнешняяКомпонента.Ширина = ВнешняяКомпонента.МинимальнаяШиринаКода + 10;
КонецЕсли;
// Сформируем картинку
ДвоичныеДанныеКартинки = ВнешняяКомпонента.ПолучитьШтрихкод();
// Если картинка сформировалась
Если ДвоичныеДанныеКартинки <> Неопределено Тогда
// Формируем из двоичных данных
Возврат Новый Картинка(ДвоичныеДанныеКартинки);
КонецЕсли;
Возврат Неопределено;
КонецФункции
ТипКода - число от 0 до 15: 0 - EAN8, 1 - EAN13, 2 - EAN128. Вот полный список типов по порядку:
EAN8, EAN13, EAN128, Code39, Code128, Code16k, PDF417, Standart (Industrial) 2 of 5, Interleaved 2 of 5, Расширение Code39, Code93, ITF14, RSS14, CodaBar, EAN13 AddOn 2, EAN13 AddOn 5.
Кроме типа штрихкода, компонента имеет ряд других свойств, например ВнешняяКомпонента.ОтображатьТекст, ВнешняяКомпонента.РазмерШрифта и прочие, можно посмотреть в свойствах.
Наконец последнее, получаем и выводим штрихкод в картинку:
Эталон = ПолучитьОбщийМакет("Эталон");
КоличествоМиллиметровВПикселе = Эталон.Рисунки.Квадрат100Пикселей.Высота / 100;
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", Окр(ОбластьМакета.Рисунки.КартинкаШтрихкода.Ширина / КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Высота", Окр(ОбластьМакета.Рисунки.КартинкаШтрихкода.Высота / КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Штрихкод", ?(ЗначениеШК="",СокрЛП(ЧисловойКодПоСсылке(Ссылка)), ЗначениеШК));
ПараметрыШтрихкода.Вставить("ТипКода", 4); // Code128
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);
ПараметрыШтрихкода.Вставить("РазмерШрифта", 6);
ОбластьМакета.Рисунки.КартинкаШтрихкода.Картинка = ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
ТабличныйДокумент.Вывести(ОбластьМакета);
Макет "Эталон" необходим для точного расчета размеров картинки. В итоге в области макета появится штрих код, окончательный вид сформированного документа: