Итак, буквально вчера я столкнулся с проблемой, что типовая 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)