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);
	
ОбластьМакета.Рисунки.КартинкаШтрихкода.Картинка = ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);	
	
ТабличныйДокумент.Вывести(ОбластьМакета);

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

Добавить комментарий