Часто при доработке конфигураций или поддержке старого кода разработчики сталкиваются с ситуацией, когда на сервере 1С не удается подключить компоненту для печати штрихкодов. Проанализируем типичную ситуацию: библиотека 1CBarCod.dll зарегистрирована в системе, но при попытке инициализировать ее через серверный общий модуль возвращается значение Неопределено.
Рассмотрим пример кода, который вызывает проблему:
Попытка
КомпонентШК = Новый COMОбъект("V8.Barcod.1");
Исключение
КомпонентШК = Неопределено;
КонецПопытки;
Если КомпонентШК <> Неопределено Тогда
Попытка
КомпонентШК.ТипКода = 4;
КомпонентШК.Сообщение = "Text string to be encoded";
Исключение
КонецПопытки;
КонецЕсли;
Вместо успешного создания объекта, система попадает в блок исключения. Выясним причину такого поведения и разберем современные способы решения этой задачи в 1С.
Главная причина кроется в архитектуре и разрядности приложений. Рассмотрим подробнее, почему старый подход перестает работать:
1CBarCod.dll является устаревшим 32-битным COM-компонентом. Большинство современных серверов 1С:Предприятие работают в 64-битной архитектуре. Рабочий процесс 64-битного сервера физически не может напрямую загрузить в свою память 32-битную DLL.Новый COMОбъект() приведет к ошибке.regsvr32. Делать это нужно на каждом сервере или компьютере пользователя.Именно поэтому использование COM-объектов для генерации штрихкодов настоятельно рекомендуется отправить "на свалку истории".
Фирма "1С" давно выпустила современную альтернативу — внешнюю компоненту "1С:Печать штрихкодов", разработанную по технологии Native API. Посмотрим на ее главные преимущества:
Разберем по шагам, как внедрить новый подход, если у вас полностью самописная конфигурация без Библиотеки стандартных подсистем (БСП) и Библиотеки подключаемого оборудования (БПО).
1CBarCod. Вместо него добавьте на макет стандартный элемент Рисунок (Картинка) и задайте ему подходящее имя (например, РисунокШтрихкод).Двоичные данные (например, с именем КомпонентаПечатиШтрихкодов).ПодключитьВнешнююКомпоненту. Укажите путь к общему макету.ДвоичныеДанные.Картинка и присвойте его элементу рисунка в табличном документе.Примерная логика вывода в макет выглядит так:
// Получаем картинку из компоненты (условный вызов)
ДвоичныеДанныеШК = СгенерироватьШтрихкодNative(ДанныеШтрихкода);
Если ДвоичныеДанныеШК <> Неопределено Тогда
ОбластьМакета.Рисунки.РисунокШтрихкод.Картинка = Новый Картинка(ДвоичныеДанныеШК);
КонецЕсли;
Проанализируем ситуацию, когда вам нужно формировать только самые простые линейные штрихкоды (например, Code 39 или Interleaved 2 of 5), и вы не хотите использовать внешние компоненты вообще.
В этом случае можно воспользоваться специальными штрихкодовыми шрифтами (например, семейством IDAutomation или EAN-13). Разберем механизм работы:
Важное ограничение: этот метод отлично работает для простых одномерных кодов, но совершенно не подходит для двумерных кодов вроде QR или DataMatrix. Кроме того, шрифты придется устанавливать на все рабочие места пользователей.
Подводя итоги: если ваша конфигурация построена на базе БСП (версии выше 1.6), все необходимые общие модули и макеты для работы с Native API компонентой там уже присутствуют (чаще всего это модуль ГенерацияШтрихкода или аналогичный). Вам остается лишь "дернуть" готовую функцию генерации и вставить полученную картинку в свой макет.