Почему не отображаются и не печатаются штрихкоды при переходе на 1С 8.3 x64 и как это исправить

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

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

Причина проблемы: несовместимость разрядности процессов и библиотек

В платформе 1С 8.1 и старых типовых конфигурациях вывод штрихкода традиционно реализовывался через OLE/ActiveX-компоненту 1CBarCod.dll («1С:Печать штрихкодов»). Этот элемент управления внедрялся непосредственно в ячейки табличного документа как внутренний объект.

Главная причина неработоспособности заключается в архитектурных ограничениях операционной системы Windows:

  1. Разрядность адресного пространства: 64-битный процесс платформы 1С (конфигуратор 1cv8.exe или клиентское приложение 1cv8c.exe) физически не может загрузить 32-разрядную библиотеку (in-process COM/ActiveX DLL) напрямую в свое адресное пространство.
  2. Ограничение встроенных ActiveX в макетах: старая библиотека 1CBarCod.dll версий 8.0.x–8.1.x выпускалась только в 32-битном исполнении. Даже при успешной регистрации в SysWOW64 64-разрядный конфигуратор не может инициализировать элемент управления, из-за чего штрихкод исчезает из макета.

Вариант 1. Быстрое решение — использование 32-разрядного клиента

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

Разберем ключевые моменты настройки:

  1. Сервер 1С:Предприятия при этом может оставаться полностью 64-разрядным, так как клиент-серверный протокол 1С прозрачно работает между клиентами x86 и сервером x64.
  2. Установим на клиентские компьютеры или терминальный сервер платформу 1С:Предприятие 8.3 разрядности x86 (32-bit).
  3. Зарегистрируем библиотеку 1CBarCod.dll в операционной системе через 32-разрядный командный интерпретатор от имени администратора:

cd %windir%\SysWOW64
regsvr32.exe "C:\Program Files (x86)\1C\1C Barcode printing\8_0_16_4\1CBarCod.dll"

После запуска 32-разрядного клиента 1С макеты и печать штрихкодов через ActiveX продолжат работать в штатном режиме.

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

Для полноценной и стабильной работы в 64-битной среде фирмой «1С» была разработана обновленная компонента генерации штрихкодов по технологии Native API (поставляется в виде ZIP-архива, содержащего сборки под x86 и x64 для Windows и Linux).

Рассмотрим алгоритм перевода печати на Native API:

  1. Изменение макета: удалим из табличного документа устаревший OLE/ActiveX-объект и добавим на его место обычный рисунок табличного документа с типом Картинка (зададим имя, например, РисунокШтрихкод).
  2. Подключение компоненты: загрузим компоненту методами платформы УстановитьВнешнююКомпоненту и ПодключитьВнешнююКомпоненту.
  3. Программная генерация: сгенерируем изображение штрихкода в коде модуля и поместим его в рисунок табличного документа.

Посмотрим на пример программной генерации штрихкода:


// Подключение компоненты Native API из макета конфигурации
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "Barcode", ТипВнешнейКомпоненты.Native);
КомпонентаШтрихкода = Новый("AddIn.Barcode.BarcodeExtension");

// Настройка параметров штрихкода
КомпонентаШтрихкода.АвтоУвеличениеРазмера = Истина;
КомпонентаШтрихкода.ТипКода = 1; // Например, EAN-13 или Code 128
КомпонентаШтрихкода.ЗначениеКода = "2000000000015";
КомпонентаШтрихкода.ОтображатьТекст = Истина;

// Получение двоичных данных картинки штрихкода
ДвоичныеДанныеКартинки = КомпонентаШтрихкода.СформироватьШтрихкод();

// Вывод в рисунок табличного документа
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
Рисунок = ОбластьМакета.Рисунки.РисунокШтрихкод;
Рисунок.Картинка = Новый Картинка(ДвоичныеДанныеКартинки);

ТабличныйДокумент.Вывести(ОбластьМакета);

Преимущество метода: формирование изображения штрихкода может выполняться на стороне 64-битного сервера без необходимости установки дополнительных библиотек в операционную систему каждого пользователя.

Вариант 3. Использование подсистемы генерации штрихкодов из БСП

Если конфигурация использует Библиотеку стандартных подсистем (БСП), ручное управление компонентой не требуется. В БСП встроен модуль ГенерацияШтрихкодаСервер, который самостоятельно определяет разрядность процесса, платформу и корректно формирует изображение штрихкода.

Разберем пример вызова функций БСП:


ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", 40);
ПараметрыШтрихкода.Вставить("Высота", 20);
ПараметрыШтрихкода.Вставить("Штрихкод", "4601234567890");
ПараметрыШтрихкода.Вставить("ТипВходногоКода", 1);
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Истина);

КартинкаШтрихкода = ГенерацияШтрихкодаСервер.СформироватьКартинкуШтрихкода(ПараметрыШтрихкода);
ОбластьМакета.Рисунки.РисунокШтрихкод.Картинка = КартинкаШтрихкода;

Вариант 4. Альтернативные методы без использования внешних библиотек

Если нет возможности подключать внешние DLL, можно воспользоваться альтернативными решениями, полностью независимыми от разрядности платформы:

  1. Специальные шрифты штрихкодов (TrueType): установим в операционной системе шрифт (например, Code 128 или EAN-13). В коде 1С вычисляется контрольный символ, строка преобразуется в последовательность знаков и выводится в обычную ячейку макета с назначенным шрифтом.
  2. Генерация векторного SVG-изображения: средствами встроенного языка 1С рассчитывается толщина линий и пробелов, после чего формируется XML-текст формата SVG. Полученная векторная графика передается в объект Картинка и вставляется в макет. Способ гарантирует высокое качество печати на любых принтерах.
← На главную