При обновлении конфигураций с устаревших платформ (например, 1С 8.1 или ранних версий 8.2) на современную платформу 1С 8.3 с переходом на 64-разрядный клиент многие разработчики сталкиваются с ситуацией, когда в макетах документов перестают отображаться элементы штрихкода, а при выводе на печать возникает ошибка или пустое поле. Проанализируем, почему возникает данная проблема и какими способами можно восстановить корректную печать штрихкодов.
В платформе 1С 8.1 и старых типовых конфигурациях вывод штрихкода традиционно реализовывался через OLE/ActiveX-компоненту 1CBarCod.dll («1С:Печать штрихкодов»). Этот элемент управления внедрялся непосредственно в ячейки табличного документа как внутренний объект.
Главная причина неработоспособности заключается в архитектурных ограничениях операционной системы Windows:
1cv8.exe или клиентское приложение 1cv8c.exe) физически не может загрузить 32-разрядную библиотеку (in-process COM/ActiveX DLL) напрямую в свое адресное пространство.1CBarCod.dll версий 8.0.x–8.1.x выпускалась только в 32-битном исполнении. Даже при успешной регистрации в SysWOW64 64-разрядный конфигуратор не может инициализировать элемент управления, из-за чего штрихкод исчезает из макета.Если требуется восстановить печать немедленно без изменения программного кода конфигурации и переработки макетов, самым быстрым выходом является использование 32-разрядной версии платформы 1С на рабочих местах пользователей.
Разберем ключевые моменты настройки:
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 продолжат работать в штатном режиме.
Для полноценной и стабильной работы в 64-битной среде фирмой «1С» была разработана обновленная компонента генерации штрихкодов по технологии Native API (поставляется в виде ZIP-архива, содержащего сборки под x86 и x64 для Windows и Linux).
Рассмотрим алгоритм перевода печати на Native API:
Картинка (зададим имя, например, РисунокШтрихкод).УстановитьВнешнююКомпоненту и ПодключитьВнешнююКомпоненту.Посмотрим на пример программной генерации штрихкода:
// Подключение компоненты Native API из макета конфигурации
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "Barcode", ТипВнешнейКомпоненты.Native);
КомпонентаШтрихкода = Новый("AddIn.Barcode.BarcodeExtension");
// Настройка параметров штрихкода
КомпонентаШтрихкода.АвтоУвеличениеРазмера = Истина;
КомпонентаШтрихкода.ТипКода = 1; // Например, EAN-13 или Code 128
КомпонентаШтрихкода.ЗначениеКода = "2000000000015";
КомпонентаШтрихкода.ОтображатьТекст = Истина;
// Получение двоичных данных картинки штрихкода
ДвоичныеДанныеКартинки = КомпонентаШтрихкода.СформироватьШтрихкод();
// Вывод в рисунок табличного документа
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
Рисунок = ОбластьМакета.Рисунки.РисунокШтрихкод;
Рисунок.Картинка = Новый Картинка(ДвоичныеДанныеКартинки);
ТабличныйДокумент.Вывести(ОбластьМакета);
Преимущество метода: формирование изображения штрихкода может выполняться на стороне 64-битного сервера без необходимости установки дополнительных библиотек в операционную систему каждого пользователя.
Если конфигурация использует Библиотеку стандартных подсистем (БСП), ручное управление компонентой не требуется. В БСП встроен модуль ГенерацияШтрихкодаСервер, который самостоятельно определяет разрядность процесса, платформу и корректно формирует изображение штрихкода.
Разберем пример вызова функций БСП:
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", 40);
ПараметрыШтрихкода.Вставить("Высота", 20);
ПараметрыШтрихкода.Вставить("Штрихкод", "4601234567890");
ПараметрыШтрихкода.Вставить("ТипВходногоКода", 1);
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Истина);
КартинкаШтрихкода = ГенерацияШтрихкодаСервер.СформироватьКартинкуШтрихкода(ПараметрыШтрихкода);
ОбластьМакета.Рисунки.РисунокШтрихкод.Картинка = КартинкаШтрихкода;
Если нет возможности подключать внешние DLL, можно воспользоваться альтернативными решениями, полностью независимыми от разрядности платформы:
Code 128 или EAN-13). В коде 1С вычисляется контрольный символ, строка преобразуется в последовательность знаков и выводится в обычную ячейку макета с назначенным шрифтом.Картинка и вставляется в макет. Способ гарантирует высокое качество печати на любых принтерах.