Как реализовать печать штрихкодов в 1С на обычных формах и исправить ошибку Поле объекта не обнаружено

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

При разработке или доработке самописных конфигураций на платформе 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-объектом. Это накладывает следующие ограничения:

  1. Разрядность клиента: Если пользователь запускает 64-битный тонкий или толстый клиент 1С, компонента 1CBarCode не сможет инициализироваться, так как 64-битный процесс не может загрузить 32-битную DLL/OCX. В этом случае вы всегда будете получать ошибку обращения к объекту.
  2. Регистрация в Windows: Компонента требует регистрации в реестре. Это делается командой regsvr32 "путь_к_файлу\1CBarCode.ocx" от имени администратора. В современных ОС (Windows 10, 11) отсутствие регистрации или блокировка со стороны системы контроля учетных записей (UAC) — частая причина неработоспособности печати.
  3. Система защиты DEP: Иногда операционная система блокирует выполнение кода компоненты из-за настроек DEP (Data Execution Prevention). Это может приводить к аварийному завершению работы 1С при попытке открыть макет.

Использование современных методов через NativeAPI

Выясним, как избежать проблем с установкой внешних компонент на каждое рабочее место. Современный подход, используемый в БСП (Библиотеке стандартных подсистем) и актуальных типовых конфигурациях (УТ 11, ERP, БП 3.0), заключается в использовании компоненты NativeAPI. Она не требует регистрации в реестре и работает как в 32-битных, так и в 64-битных клиентах.

Если в вашей конфигурации есть общий макет КомпонентаПечатиШтрихкодов, мы можем использовать программный интерфейс для генерации картинки штрихкода «на лету». Это избавляет от необходимости размещать ActiveX-объект на макете. Вместо этого на макет помещается обычная Картинка.

Рассмотрим пример кода, который формирует картинку штрихкода без использования ActiveX:


// Подготовка параметров штрихкода
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", 400);
ПараметрыШтрихкода.Вставить("Высота", 200);
ПараметрыШтрихкода.Вставить("Штрихкод", "2000000012345");
ПараметрыШтрихкода.Вставить("ТипКода", 1); // EAN-13
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Истина);
ПараметрыШтрихкода.Вставить("РазмерШрифта", 10);

// Получение картинки через менеджер оборудования (или аналогичный модуль в вашей конфигурации)
// В самописной конфигурации этот код можно заимствовать из УТ 10.3 или БСП
РезультатКартинка = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);

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

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

Альтернативный метод: Использование шрифтов Barcode

Разберем еще один надежный способ для обычных форм — использование специализированных шрифтов (например, EAN13.ttf или IDAutomation). Этот метод не требует программирования графических объектов, но имеет свои нюансы.

Алгоритм действий следующий:

  1. Установите в операционную систему шрифт штрихкода.
  2. В макете 1С выделите ячейку и установите для неё данный шрифт.
  3. Программно вычислите контрольное число и преобразуйте строку цифр в символы согласно спецификации шрифта.

Важный нюанс: Для штрихкода EAN-13 нельзя просто написать "4601234567890" в ячейке со шрифтом. Вам потребуется написать функцию-преобразователь, которая переведет эти цифры в спецсимволы, чтобы сканер смог их распознать. Для простых типов, таких как Code 39, достаточно добавить символы «звездочка» в начале и конце кода: "*12345*".

Заключение и рекомендации

Подводя итог, можно выделить три пути решения задачи:

1. Исправление текущего кода: Замените обращение ТекстКода на Сообщение и убедитесь, что вы работаете в 32-битном клиенте 1С с зарегистрированной компонентой 1CBarCode.ocx.

2. Переход на NativeAPI: Это наиболее стабильный путь. Рекомендуется извлечь общий макет компоненты и модули работы со штрихкодами из типовой конфигурации (например, УТ 10.3 последних релизов) и перенести их в свою базу. Это обеспечит работу на любых версиях Windows и 64-битных клиентах.

3. Использование шрифтов: Подходит для простых задач, где не требуется динамическое изменение типа штрихкода (например, только EAN-13), и есть возможность установить шрифты на все рабочие станции пользователей.

Мы рекомендуем использовать второй вариант (NativeAPI), так как он соответствует современным стандартам разработки 1С и исключает «вылеты» программы, связанные со старыми ActiveX-технологиями.

← На главную