Итак, буквально вчера я столкнулся с проблемой, что типовая 1С УТ 10.3 при печати формы с штрихкодом стала выдавать:
Компонента 1С:Печать штрихкодов не установлена на данном компьютере
Код, инициализирующий данную компоненту:
Попытка КомпонентШК = Новый COMОбъект("V8.Barcod.1"); Исключение Сообщить("Компонента 1С:Печать штрихкодов не установлена на данном компьютере!", СтатусСообщения.Важное); Возврат; КонецПопытки;
Как показал дальнейший поиск информации, проблема в том, что клиентское приложение, в котором штрихкоды не хотели печататься - 64-х разрядное (в 32-х разрядных клиентах печаталось всё как надо). Кстати, на сайте 1С тут так же лежит 32-х разрядная компонента, которая никак проблему не решает, а описание того, что делать в случае 64-х разрядных клиентов отсутствует. 
Разумеется, самым очевидным видится решение - просто установить вместо х64 - клиента его 32-х разрядную версию. Но, мне что-то показалось это слишком простым вариантом (хотя и он полностью рабочий).
Следующее, что я решил попробовать это воспользоваться инструкцией по запуску x32 COM-объектов из x64 приложения, но ничего не заработало.
После этого, я решил посмотреть в сторону УТ11 и того как там решена эта проблема(и есть ли она там). Я развернул УТ11(11.4.5.143) и оказалось, что там такой проблемы просто нет.
В УТ11 в общем модуле "МенеджерОборудованияСерверПовтИсп" имеется функция, которая инициализирует соответствующую нативную компоненту, которая лежит в общем макете "КомпонентаПечатиШтрихкодов". Причем там лежит сразу несколько компонент - и под х32, и под х64 и под линукс (см. один из рисунков. Их все можно получить выгрузив данные из макета в каталог на диске).
Поскольку я не особенно хотел что-то кодировать, то я в свою конфигурацию просто скопировал общий макет "КомпонентаПечатиШтрихкодов", а так же несколько вспомогательных функций (я здесь приведу их полный текст, а то ведь вдруг у кого нет под рукой УТ11):
// Функция выполняет подключение внешней компоненты и ее первоначальную настройку.
// Возвращаемое значение: НЕОПРЕДЕЛЕНО - компоненту не удалось загрузить.
Функция ПодключитьВнешнююКомпонентуПечатиШтрихкода() Экспорт
	
	ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
	
	// Создадим объект внешней компоненты.
	Если ПодключениеВыполнено Тогда
		ВнешняяКомпонента = Новый("AddIn.КартинкаШтрихкода.Barcode");
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
	// Если нет возможности рисовать.
	Если НЕ ВнешняяКомпонента.ГрафикаУстановлена Тогда
		// То картинку сформировать не сможем.
		Возврат Неопределено;
	Иначе
		// Установим основные параметры компоненты.
		// Если в системе установлен шрифт Tahoma.
		Если ВнешняяКомпонента.НайтиШрифт("Tahoma") Тогда
			// Выбираем его как шрифт для формирования картинки.
			ВнешняяКомпонента.Шрифт = "Tahoma";
		Иначе
			// Шрифт Tahoma в системе отсутствует.
			// Обойдем все доступные компоненте шрифты.
			Для Сч = 0 По ВнешняяКомпонента.КоличествоШрифтов -1 Цикл
				// Получим очередной шрифт, доступный компоненте.
				ТекущийШрифт = ВнешняяКомпонента.ШрифтПоИндексу(Сч);
				// Если шрифт доступен
				Если ТекущийШрифт <> Неопределено Тогда
					// Они и будет шрифтом для формирования штрихкода.
					ВнешняяКомпонента.Шрифт = ТекущийШрифт;
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		// Установим размер шрифта
		ВнешняяКомпонента.РазмерШрифта = 12;
		
		Возврат ВнешняяКомпонента;
	КонецЕсли;
	
КонецФункции
Функция ОпределитьТипШтрихкода(Штрихкод) Экспорт
	
	ТипШтрихкодаЗнач = "";	
	ДлинаШтрихкода = СтрДлина(Штрихкод);
	
	Если ДлинаШтрихкода = 0 Тогда
		Возврат ТипШтрихкодаЗнач;
	КонецЕсли;
	
	Сумма = 0;
	
	Если ДлинаШтрихкода = 14 Тогда // ITF14
		
		Коэффициент = 1; 
		Для Сч = 1 По 13 Цикл
			ВремКодСимвола = КодСимвола(Штрихкод, Сч);
			Если ВремКодСимвола < 48 Или ВремКодСимвола > 57 Тогда
				Прервать;
			КонецЕсли;
			Сумма       = Сумма + Коэффициент * (ВремКодСимвола - 48);
			Коэффициент = 4 - Коэффициент;
		КонецЦикла;
		Сумма = (10 - Сумма % 10) % 10;
		Если КодСимвола(Штрихкод, 14) = Сумма + 48 Тогда
			ТипШтрихкодаЗнач = "ITF14";
 		КонецЕсли;
		
	ИначеЕсли ДлинаШтрихкода = 13 Тогда // EAN13
		
		EAN13 = Истина;
		Коэффициент = 1;
		Для Сч = 1 По 12 Цикл
			ВремКодСимвола = КодСимвола(Штрихкод, Сч);
			Если ВремКодСимвола < 48 Или ВремКодСимвола > 57 Тогда
				EAN13 = Ложь;
				Прервать;
			КонецЕсли;
			Сумма  = Сумма + Коэффициент * (ВремКодСимвола - 48);
			Коэффициент = 4 - Коэффициент;
		КонецЦикла;
		Сумма = (10 - Сумма % 10) % 10;
		ПроверочныйСимвол = Символ(Сумма + 48);
		Если EAN13 И ПроверочныйСимвол = Прав(Штрихкод, 1) Тогда
			ТипШтрихкодаЗнач = "EAN13";
		КонецЕсли;
		
	ИначеЕсли ДлинаШтрихкода = 8 Тогда // EAN8
		
		EAN8 = Истина;
		Коэффициент = 3;
		Для Сч = 1 По 7 Цикл
			ВремКодСимвола = КодСимвола(Штрихкод, Сч);
			Если ВремКодСимвола < 48 Или ВремКодСимвола > 57 Тогда
				EAN8 = Ложь;
				Прервать;
			КонецЕсли;
			Сумма       = Сумма + Коэффициент * (ВремКодСимвола - 48);
			Коэффициент = 4 - Коэффициент;
		КонецЦикла;
		Сумма = (10 - Сумма % 10) % 10;
		Если EAN8 И (КодСимвола(Штрихкод, 8) = Сумма + 48) Тогда
			ТипШтрихкодаЗнач = "EAN8";
		КонецЕсли;
		
	КонецЕсли;
	
	Если ТипШтрихкодаЗнач= "" Тогда // CODE39
		
		CODE39 = Истина;
		Для Сч = 1 По ДлинаШтрихкода Цикл
			ВремКодСимвола = КодСимвола(Штрихкод, Сч);
			Если (ВремКодСимвола <> 32)
				И (ВремКодСимвола < 36 Или ВремКодСимвола > 37)
				И (ВремКодСимвола <> 43)
				И (ВремКодСимвола < 45 Или ВремКодСимвола > 57)
				И (ВремКодСимвола < 65 Или ВремКодСимвола > 90) Тогда
				CODE39 = Ложь;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Если CODE39 Тогда
			ТипШтрихкодаЗнач = "CODE39";
		КонецЕсли                                                     
		
	КонецЕсли;
	
	Если ТипШтрихкодаЗнач= ""  Тогда // CODE128
		// CODE128 символы ASCII от 0 до 127 (цифры от «0» до «9», буквы от «A» до «Z» и от «a» до «z») и специальные символы;
		CODE128 = Истина;
		Для Сч = 1 По ДлинаШтрихкода Цикл
			ВремКодСимвола = КодСимвола(Штрихкод, Сч);
			Если (ВремКодСимвола > 127) Тогда
				CODE128 = Ложь;
			Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Если CODE128 Тогда
			ТипШтрихкодаЗнач = "CODE128";
		КонецЕсли                                                     
		
	КонецЕсли;
	
	Если ТипШтрихкодаЗнач = "CODE128"  Тогда // EAN128
		// В коде EAN128 регламентирован словарь CODE128 но регламентированы группы кодов.
		Если КодСимвола(Штрихкод, 1) = 40 Тогда
			ТипШтрихкодаЗнач = "EAN128";
		КонецЕсли;
	КонецЕсли;
	
	Возврат ТипШтрихкодаЗнач;
	
КонецФункции
Функция ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода) Экспорт
	
	//ВнешняяКомпонента = МенеджерОборудованияСерверПовтИсп.ПодключитьВнешнююКомпонентуПечатиШтрихкода();
	ВнешняяКомпонента = ПодключитьВнешнююКомпонентуПечатиШтрихкода();
	
	Если ВнешняяКомпонента = Неопределено Тогда
		ВызватьИсключение НСтр("ru = 'Ошибка подключения внешней компоненты печати штрихкода.'");
	КонецЕсли;
	
	// Зададим размер формируемой картинки.
	ВнешняяКомпонента.Ширина = Окр(ПараметрыШтрихкода.Ширина);
	ВнешняяКомпонента.Высота = Окр(ПараметрыШтрихкода.Высота);
	
	ВнешняяКомпонента.АвтоТип = Ложь;
	
	Если ПараметрыШтрихкода.ТипКода = 99 Тогда
		ТипШтрихкодаВрем = ОпределитьТипШтрихкода(ПараметрыШтрихкода.Штрихкод);
		Если ТипШтрихкодаВрем = "EAN8" Тогда
			ВнешняяКомпонента.ТипКода = 0;
		ИначеЕсли ТипШтрихкодаВрем = "EAN13" Тогда
			ВнешняяКомпонента.ТипКода = 1;
			// Если код содержит контрольный символ, обязательно указываем.
			ВнешняяКомпонента.СодержитКС = СтрДлина(ПараметрыШтрихкода.Штрихкод) = 13;
		ИначеЕсли ТипШтрихкодаВрем = "EAN128" Тогда
			ВнешняяКомпонента.ТипКода = 2;
		ИначеЕсли ТипШтрихкодаВрем = "CODE39" Тогда
			ВнешняяКомпонента.ТипКода = 3;
		ИначеЕсли ТипШтрихкодаВрем = "CODE128" Тогда
			ВнешняяКомпонента.ТипКода = 4;
		ИначеЕсли ТипШтрихкодаВрем = "ITF14" Тогда
			ВнешняяКомпонента.ТипКода = 11;
		ИначеЕсли ТипШтрихкодаВрем = "QR" Тогда
			ВнешняяКомпонента.ТипКода = 16;
		ИначеЕсли ТипШтрихкодаВрем = "EAN13Addon2" Тогда
			ВнешняяКомпонента.ТипКода = 14;
		ИначеЕсли ТипШтрихкодаВрем = "EAN13Addon5" Тогда
			ВнешняяКомпонента.ТипКода = 15;
		Иначе
			ВнешняяКомпонента.АвтоТип = Истина;
		КонецЕсли;
	Иначе
		ВнешняяКомпонента.АвтоТип = Ложь;
		ВнешняяКомпонента.ТипКода = ПараметрыШтрихкода.ТипКода;
	КонецЕсли;
	
	Если ПараметрыШтрихкода.Свойство("ПрозрачныйФон") Тогда
		ВнешняяКомпонента.ПрозрачныйФон = ПараметрыШтрихкода.ПрозрачныйФон;
	КонецЕсли;
	
	ВнешняяКомпонента.ОтображатьТекст = ПараметрыШтрихкода.ОтображатьТекст;
	
	// Формируем картинку штрихкода.
	ВнешняяКомпонента.ЗначениеКода = ПараметрыШтрихкода.Штрихкод;
	// Угол поворота штрихкода.
	ВнешняяКомпонента.УголПоворота = ?(ПараметрыШтрихкода.Свойство("УголПоворота"), ПараметрыШтрихкода.УголПоворота, 0);
	// Уровень коррекции QR кода (L=0, M=1, Q=2, H=3).
	ВнешняяКомпонента.УровеньКоррекцииQR = ?(ПараметрыШтрихкода.Свойство("УровеньКоррекцииQR"), ПараметрыШтрихкода.УровеньКоррекцииQR, 1);
	
	// Если установленная нами ширина меньше минимально допустимой для этого штрихкода.
	Если ВнешняяКомпонента.Ширина < ВнешняяКомпонента.МинимальнаяШиринаКода Тогда
		ВнешняяКомпонента.Ширина = ВнешняяКомпонента.МинимальнаяШиринаКода;
	КонецЕсли;
	
	// Если установленная нами высота меньше минимально допустимой для этого штрихкода.
	Если ВнешняяКомпонента.Высота < ВнешняяКомпонента.МинимальнаяВысотаКода Тогда
		ВнешняяКомпонента.Высота = ВнешняяКомпонента.МинимальнаяВысотаКода;
	КонецЕсли;
	Если ПараметрыШтрихкода.Свойство("РазмерШрифта") И (ПараметрыШтрихкода.РазмерШрифта > 0) 
		И (ПараметрыШтрихкода.ОтображатьТекст) И (ВнешняяКомпонента.РазмерШрифта <> ПараметрыШтрихкода.РазмерШрифта) Тогда
		ВнешняяКомпонента.РазмерШрифта = ПараметрыШтрихкода.РазмерШрифта;
	КонецЕсли;
	
	// Сформируем картинку
	ДвоичныеДанныеКартинки = ВнешняяКомпонента.ПолучитьШтрихкод();
	
	// Если картинка сформировалась.
	Если ДвоичныеДанныеКартинки <> Неопределено Тогда
		// Формируем из двоичных данных.
		Возврат Новый Картинка(ДвоичныеДанныеКартинки);
	КонецЕсли;
	
	Возврат Неопределено;
КонецФункции
Таким образом, теперь имеется возможность получать картинку штрихкода и вставлять её (как и раньше) прямо в макет. Я делаю это таким образом:
ОбластьШапки.Рисунки.Штрихкод.Картинка = ОбработкаШтрихкодирования.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
Правда перед самим вызовом необходимо задать параметры штрихкода:
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина",                    Окр(РисунокШтрихкода.Ширина / 0.1));
ПараметрыШтрихкода.Вставить("Высота",                    Окр(РисунокШтрихкода.Высота / 0.1));
ПараметрыШтрихкода.Вставить("Штрихкод",                  Штрихкод);  //здесь д.б. наша строка ШК
ПараметрыШтрихкода.Вставить("ТипКода",                   4);
//ПараметрыШтрихкода.Вставить("GS1DatabarКоличествоСтрок", GS1DatabarКоличествоСтрок);
ПараметрыШтрихкода.Вставить("МонохромныйШрифт",          Истина);
//ПараметрыШтрихкода.Вставить("УголПоворота",              УголПоворота);
ПараметрыШтрихкода.Вставить("ОтображатьТекст",           Истина);
ПараметрыШтрихкода.Вставить("РазмерШрифта",              15);
ПараметрыШтрихкода.Вставить("Масштабировать",            Истина);
//ПараметрыШтрихкода.Вставить("СохранятьПропорции",        СохранятьПропорции);
//ПараметрыШтрихкода.Вставить("ВертикальноеВыравнивание",  ВертикальноеВыравнивание);
Подробный перечень параметров и то, как с ними работать, а также их описание можно посмотреть на сайте 1С (в т.ч. и по первой ссылке из статьи - там многие параметры повторяются), ну и в самой УТ11. Для моих же целей оказался вполне пригоден представленный код.
На этом всё, надеюсь статья была вам полезна.
П.С. Использовалась платформа 1С:Предприятие 8.3 (8.3.12.1567), конфигурации "Управление торговлей", редакция 10.3 (10.3.47.3) и "Управление торговлей", редакция 11 (11.4.5.143)
Вступайте в нашу телеграмм-группу Инфостарт
 
                                     
                                     
                                    