Как решить проблему с печатью штрихкодов под 64-разрядным клиентом 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При переходе на 64-разрядную версию клиента «1С:Предприятия» разработчики и системные администраторы часто сталкиваются с неприятной ошибкой: перестает работать привычная компонента печати штрихкодов. На экране появляется сообщение о том, что компонента не установлена, хотя локально на компьютере или терминальном сервере всё зарегистрировано корректно. Выясним причину этой проблемы и разберем по шагам наиболее эффективные способы ее решения.

Почему возникает конфликт разрядностей?

Прежде всего проанализируем техническую суть проблемы. Устаревшая компонента «1С:Печать штрихкодов» версии 8.0.16.4 (и более ранних версий) построена на базе технологии ActiveX (COM-объект V8.Barcod.1). Это исключительно 32-битная динамическая библиотека (DLL).

В операционных системах Windows архитектура процессов устроена так, что 64-разрядное приложение (в нашем случае — 64-битный клиент 1С) физически не может загрузить в свое адресное пространство 32-разрядную библиотеку. Платформа 1С делает попытку вызвать COM-объект, операционная система блокирует этот вызов, и в результате процесс печати прерывается с ошибкой.

Рассмотрим также вопрос о необходимости установки компоненты на сервере 1С. Нужно ли её туда ставить? Всё зависит от того, где именно формируется печатная форма:

  1. Если формирование табличного документа происходит на стороне клиента, то устанавливать компоненту на сервер не нужно.
  2. Если генерация документа (например, для отправки по почте или сохранения в формате PDF) происходит в фоновом задании на сервере, то серверная часть также обратится к компоненте. Если сервер 1С работает под управлением 64-разрядной службы (что является стандартом для крупных баз), старый ActiveX там работать не будет, даже если его установить.

Для решения этой проблемы мы можем использовать два основных подхода: современный перевод конфигурации на Native API компоненту или быструю установку 32-разрядного клиента 1С. Рассмотрим их подробно.

Решение 1. Переход на современную Native API компоненту (Рекомендуемый способ)

Фирма 1С давно отказалась от поддержки ActiveX-технологий в пользу кроссплатформенной технологии Native API. Современная компонента печати штрихкодов поставляется в составе Библиотеки стандартных подсистем (БСП) или Библиотеки подключаемого оборудования (БПО). Она отлично работает на 32- и 64-битных клиентах, на сервере под Windows и Linux.

Выясним, как уйти от OLE-объекта в макете и переписать код под Native API:

  1. Извлечение компоненты. Если у вас старая конфигурация (например, УТ 10.3 или УПП 1.3), откройте любую современную типовую конфигурацию (например, «Управление торговлей», ред. 11 или демо-базу БСП). Перейдите в общие макеты и найдите макет с именем КомпонентаПечатиШтрихкодов. Сохраните этот макет как двоичные данные (в формате ZIP-архива) на свой диск.
  2. Импорт в вашу конфигурацию. Откройте вашу рабочую базу в конфигураторе, создайте новый общий макет с типом «Двоичные данные», назовите его КомпонентаПечатиШтрихкодов и загрузите туда сохраненный ранее ZIP-архив.
  3. Изменение макета печатной формы. В макете вашей печатной формы удалите старый объект ActiveX (рисунок штрихкода). Вместо него вставьте обычную пустую картинку через меню: «Таблица — Рисунки — Вставить картинку». Задайте этому рисунку понятное имя, например, ИмяРисункаШтрихкода.
  4. Программное формирование изображения. Теперь нам нужно написать код, который подключит Native-компоненту, сгенерирует штрихкод в виде картинки и поместит ее в созданный нами рисунок табличного документа.

Посмотрим на пример программной реализации подключения компоненты и генерации штрихкода:


// Подключаем внешнюю компоненту из общего макета
Если ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "Barcode", ТипВнешнейКомпоненты.Native) Тогда
    
    // Создаем объект компоненты
    ГенераторШтрихкода = Новый("AddIn.Barcode.Barcode");
    
    // Устанавливаем параметры штрихкода
    ГенераторШтрихкода.ТипКода = 1; // 1 — это EAN13, параметры типов смотрите в документации к БСП
    ГенераторШтрихкода.Сообщение = "4601234567890"; // Наш штрихкод
    ГенераторШтрихкода.Ширина = 300;
    ГенераторШтрихкода.Высота = 100;
    
    // Получаем картинку в формате двоичных данных
    КартинкаДвоичныеДанные = ГенераторШтрихкода.ПолучитьШтрихкодУнарный();
    
    Если КартинкаДвоичныеДанные <> Неопределено Тогда
        // Помещаем картинку в рисунок табличного документа
        НоваяКартинка = Новый Картинка(КартинкаДвоичныеДанные);
        ОбластьМакета = Макет.ПолучитьОбласть("Строка");
        ОбластьМакета.Рисунки.ИмяРисункаШтрихкода.Картинка = НоваяКартинка;
    КонецЕсли;
    
Иначе
    ВызватьИсключение "Не удалось подключить компоненту генерации штрихкодов!";
КонецЕсли;

Преимущество этого метода очевидно: вы раз и навсегда избавляетесь от привязки к разрядности платформы, операционной системе и необходимости регистрировать библиотеки в реестре Windows через regsvr32.

Решение 2. Параллельная установка 32-разрядного клиента 1С (Временный обходной путь)

Если конфигурация сильно кастомизирована, находится на поддержке или у вас нет времени прямо сейчас переписывать программный код формирования макетов, можно применить административное решение.

Для этого выполним следующие действия:

  1. Установите на терминальный сервер (или локальный компьютер пользователя) 32-разрядный клиент 1С:Предприятия (тонкий или толстый клиент) той же самой версии платформы, которая запущена на сервере (например, 8.3.14.1694). Наличие x64 сервера 1С этому никак не мешает.
  2. Запустите окно выбора информационных баз 1С (стартер).
  3. Выберите нужную информационную базу, нажмите кнопку «Изменить» и перейдите на последнюю вкладку настроек.
  4. В поле «Разрядность» принудительно укажите значение «32 (x86)» вместо «Выбирать автоматически» или «64 (x64)».

После этого база у данного пользователя будет гарантированно открываться в 32-битном режиме, и старый ActiveX-объект продолжит функционировать без каких-либо доработок конфигурации.

Решение 3. Использование шрифтов штрихкодов (Альтернатива без компонент)

Существует еще один изящный способ вывода одномерных штрихкодов, который вообще не требует использования внешних библиотек (ни ActiveX, ни Native API). Это использование специализированных шрифтов.

Проанализируем этот метод по шагам:

  1. Установите в операционную систему терминала или компьютера пользователя шрифт штрихкода (например, Code39.ttf или EAN13.ttf).
  2. В макете 1С выделите ячейку, где должен выводиться штрихкод, и укажите для нее установленный шрифт.
  3. При заполнении табличного документа передайте в эту ячейку текстовую строку. Для некоторых шрифтов (например, Code 39) значение штрихкода необходимо обрамлять звездочками, например: "*123456*", чтобы сканер мог определить начало и конец кода.

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

Резюме

Для быстрого исправления «здесь и сейчас» используйте принудительный запуск базы через 32-разрядный клиент 1С. В долгосрочной перспективе обязательно запланируйте перевод печатных форм на кроссплатформенную Native API компоненту из состава БСП — это гарантирует стабильную работу вашей системы при любых обновлениях ИТ-инфраструктуры.

← На главную