При разработке или доработке самописных конфигураций на платформе 1С:Предприятие 8, особенно на обычных формах, программисты часто сталкиваются с необходимостью вывода штрихкодов (EAN-13, Code 128, QR-код и другие) в печатные формы. Традиционно для этого использовалась внешняя компонента 1CBarCode. Однако при её внедрении возникают специфические ошибки, связанные как с программным кодом, так и с особенностями работы операционных систем и разрядности платформы.
В данной статье мы подробно разберем, как правильно передать данные в компонент печати штрихкода, почему возникают ошибки доступа к свойствам объекта и какие современные альтернативы существуют, чтобы избежать проблем с регистрацией ActiveX-компонент.
Рассмотрим типичную ситуацию: вы установили компоненту 1CBarCode, добавили на макет рисунок типа «Объект» и выбрали «1С:Печать штрихкодов». При попытке программно обратиться к объекту через Макет.Рисунки.ИмяРисунка.Объект.ТекстКода система выдает ошибку. Проанализируем причину.
Основная проблема заключается в том, что у компоненты 1CBarCode (файл 1CBarCode.ocx) отсутствует свойство с именем ТекстКода. Для передачи данных, которые должны быть зашифрованы в штрихкод, используются другие предопределенные свойства. В зависимости от версии компоненты, вам необходимо использовать свойство Сообщение.
Посмотрим на пример правильного заполнения штрихкода в коде 1С:
// Получаем область макета, где расположен рисунок штрихкода
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
РисунокШтрихкод = ОбластьМакета.Рисунки.D1; // Где D1 - имя рисунка на макете
// Устанавливаем тип штрихкода (например, 1 для EAN-13)
РисунокШтрихкод.Объект.ТипКода = 1;
// Передаем само значение штрихкода в свойство Сообщение
РисунокШтрихкод.Объект.Сообщение = "4601234567890";
// Опционально: управляем видимостью текста под штрихкодом
РисунокШтрихкод.Объект.ОтображатьТекст = Истина;
Важно: Если свойство Объект всё равно недоступно или вызывает ошибку, убедитесь, что в макете вставлен именно элемент управления ActiveX, а не просто картинка. Также проверьте, что обращение идет к области макета, которая уже получена методом ПолучитьОбласть, а не к самому исходному макету.
Проанализируем технические ограничения компоненты 1CBarCode. Этот программный продукт является 32-разрядным ActiveX-объектом. Это накладывает следующие ограничения:
1CBarCode не сможет инициализироваться, так как 64-битный процесс не может загрузить 32-битную DLL/OCX. В этом случае вы всегда будете получать ошибку обращения к объекту.regsvr32 "путь_к_файлу\1CBarCode.ocx" от имени администратора. В современных ОС (Windows 10, 11) отсутствие регистрации или блокировка со стороны системы контроля учетных записей (UAC) — частая причина неработоспособности печати.Выясним, как избежать проблем с установкой внешних компонент на каждое рабочее место. Современный подход, используемый в БСП (Библиотеке стандартных подсистем) и актуальных типовых конфигурациях (УТ 11, ERP, БП 3.0), заключается в использовании компоненты NativeAPI. Она не требует регистрации в реестре и работает как в 32-битных, так и в 64-битных клиентах.
Если в вашей конфигурации есть общий макет КомпонентаПечатиШтрихкодов, мы можем использовать программный интерфейс для генерации картинки штрихкода «на лету». Это избавляет от необходимости размещать ActiveX-объект на макете. Вместо этого на макет помещается обычная Картинка.
Рассмотрим пример кода, который формирует картинку штрихкода без использования ActiveX:
// Подготовка параметров штрихкода
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", 400);
ПараметрыШтрихкода.Вставить("Высота", 200);
ПараметрыШтрихкода.Вставить("Штрихкод", "2000000012345");
ПараметрыШтрихкода.Вставить("ТипКода", 1); // EAN-13
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Истина);
ПараметрыШтрихкода.Вставить("РазмерШрифта", 10);
// Получение картинки через менеджер оборудования (или аналогичный модуль в вашей конфигурации)
// В самописной конфигурации этот код можно заимствовать из УТ 10.3 или БСП
РезультатКартинка = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
// Вывод в макет
Область = Макет.ПолучитьОбласть("Строка");
Область.Рисунки.QRкод.Картинка = РезультатКартинка;
ТабДок.Вывести(Область);
Преимущество этого метода в том, что картинка генерируется программно на сервере или клиенте и вставляется в макет как статический объект. Это гарантирует одинаковое отображение штрихкода на всех компьютерах независимо от установленного ПО.
Разберем еще один надежный способ для обычных форм — использование специализированных шрифтов (например, EAN13.ttf или IDAutomation). Этот метод не требует программирования графических объектов, но имеет свои нюансы.
Алгоритм действий следующий:
Важный нюанс: Для штрихкода EAN-13 нельзя просто написать "4601234567890" в ячейке со шрифтом. Вам потребуется написать функцию-преобразователь, которая переведет эти цифры в спецсимволы, чтобы сканер смог их распознать. Для простых типов, таких как Code 39, достаточно добавить символы «звездочка» в начале и конце кода: "*12345*".
Подводя итог, можно выделить три пути решения задачи:
1. Исправление текущего кода: Замените обращение ТекстКода на Сообщение и убедитесь, что вы работаете в 32-битном клиенте 1С с зарегистрированной компонентой 1CBarCode.ocx.
2. Переход на NativeAPI: Это наиболее стабильный путь. Рекомендуется извлечь общий макет компоненты и модули работы со штрихкодами из типовой конфигурации (например, УТ 10.3 последних релизов) и перенести их в свою базу. Это обеспечит работу на любых версиях Windows и 64-битных клиентах.
3. Использование шрифтов: Подходит для простых задач, где не требуется динамическое изменение типа штрихкода (например, только EAN-13), и есть возможность установить шрифты на все рабочие станции пользователей.
Мы рекомендуем использовать второй вариант (NativeAPI), так как он соответствует современным стандартам разработки 1С и исключает «вылеты» программы, связанные со старыми ActiveX-технологиями.