Как исправить ошибку «Поле объекта недоступно для чтения (Картинка)» при выводе штрихкода в 1С

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

При разработке печатных форм в «1С:Предприятие 8.3» программисты часто сталкиваются с задачей вывода штрихкодов. В процессе реализации этой задачи может возникнуть крайне неприятная ошибка: «Поле объекта недоступно для чтения/записи (Картинка)». Обычно она появляется в строке кода, где сгенерированное изображение штрихкода пытается присвоиться рисунку в табличном документе.

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

Выясняем причину ошибки

Для начала проанализируем ситуацию, в которой возникает ошибка. Как правило, разработчик пытается выполнить следующий код:


ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", Окр(Макет.Рисунки.D1.Ширина * 5));
ПараметрыШтрихкода.Вставить("Высота", Окр(Макет.Рисунки.D1.Высота * 5));
ПараметрыШтрихкода.Вставить("Штрихкод", "1234567891234");
ПараметрыШтрихкода.Вставить("ТипКода", 1);
Макет.Рисунки.D1.Картинка = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);

При выполнении этого кода система выбрасывает исключение. Здесь кроются сразу две принципиальные архитектурные ошибки, которые мы сейчас подробно разберем.

Ошибка №1: Обращение напрямую к макету, а не к области

Обратите внимание на конструкцию Макет.Рисунки.D1.Картинка. При формировании печатной формы сам исходный Макет выступает в роли неизменяемого шаблона (только для чтения). Платформа блокирует прямую запись в его структуру, чтобы избежать случайного изменения исходного шаблона во время сеанса печати.

Для вывода данных мы должны работать исключительно с копией этого шаблона — областью, полученной из макета. Правильный путь обращения выглядит так: сначала мы получаем область через метод ПолучитьОбласть(), затем производим манипуляции с рисунками внутри этой области и только потом выводим ее в результирующий табличный документ.

Ошибка №2: Неверный тип объекта в макете (ActiveX вместо Картинки)

Эта проблема уходит корнями в историю развития платформы «1С:Предприятие». Раньше для вывода штрихкодов использовалась внешняя компонента 1CBarCode.dll, которая добавлялась на макет как элемент управления ActiveX (через меню Таблица — Рисунки — Вставить объект — Элемент управления).

У объекта типа ActiveX (элемента управления) свойство Картинка либо вообще отсутствует в объектной модели платформы, либо закрыто для прямой записи. Попытка присвоить ему объект типа Картинка напрямую всегда будет приводить к ошибке.

В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) и БПО (Библиотеки подключаемого оборудования) генерация штрихкода происходит на сервере. Компонента генерирует полноценное бинарное изображение в формате PNG. Чтобы вставить такое изображение в макет, сам рисунок на макете должен иметь тип Рисунок (Картинка), а не элемент управления ActiveX.

Современные стандарты: Native API против ActiveX

Рассмотрим подробнее, почему стоит полностью отказаться от использования старой компоненты 1C Barcode (ActiveX):

  1. Ограничения архитектуры: ActiveX-компонента жестко привязана к операционной системе Windows и имеет 32-разрядную архитектуру. Она не сможет инициализироваться на 64-разрядном сервере 1С или на клиентах под управлением Linux и macOS.
  2. Сложность администрирования: Старый элемент требует обязательной регистрации в реестре операционной системы с помощью утилиты regsvr32, что часто вызывает проблемы из-за ограничений прав пользователей.
  3. Преимущества Native API: Современная компонента из состава БПО поставляется в виде двоичных данных непосредственно внутри конфигурации. Она является кроссплатформенной (работает под Windows, Linux, macOS) и загружается платформой динамически в оперативную память без какой-либо регистрации в операционной системе. На выходе она отдает стандартный объект 1С Картинка.

Пошаговый алгоритм вывода штрихкода

Решим задачу правильно и разберем по шагам весь процесс настройки макета и написания кода.

Шаг 1. Настройка макета табличного документа

Откроем макет нашей печатной формы в конфигураторе и выполним следующие действия:

  1. Удалим старый элемент управления ActiveX (если он был добавлен ранее).
  2. В меню конфигуратора выберем пункт Таблица — Рисунки — Картинка.
  3. В появившемся окне выбора картинки ничего не выбираем (нажимаем «Очистить» или «Отмена»), чтобы создать пустую рамку рисунка.
  4. Разместим созданную рамку в нужной области макета и настроим ее размеры.
  5. Откроем свойства этого рисунка (нажав F4) и зададим ему понятное имя в поле Имя, например, КартинкаШтрихкода.

Шаг 2. Написание программного кода генерации

Теперь напишем отказоустойчивый код формирования печатной формы на сервере. Посмотрим на пример реализации:


// 1. Получаем макет печатной формы
Макет = ПолучитьМакет("МакетПечатнойФормы");

// 2. Получаем нужную область, где расположен наш рисунок-картинка
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьШтрихкода");

// 3. Подготавливаем параметры для генерации штрихкода
ПараметрыШтрихкода = Новый Структура;
// Рассчитываем размеры в пикселях на основе физического размера рамки в макете
ПараметрыШтрихкода.Вставить("Ширина", Окр(ОбластьМакета.Рисунки.КартинкаШтрихкода.Ширина * 4));
ПараметрыШтрихкода.Вставить("Высота", Окр(ОбластьМакета.Рисунки.КартинкаШтрихкода.Высота * 4));
ПараметрыШтрихкода.Вставить("Штрихкод", "4601234567890"); // Пример кода EAN-13
ПараметрыШтрихкода.Вставить("ТипКода", 1); // 1 соответствует типу EAN-13 в БПО
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Истина);
ПараметрыШтрихкода.Вставить("РазмерШрифта", 10);

// 4. Генерируем картинку с помощью функций БПО (на сервере)
КартинкаШК = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);

// 5. Проверяем, успешно ли получена картинка, и записываем ее в рисунок ОБЛАСТИ
Если ЗначениеЗаполнено(КартинкаШК) Тогда
    ОбластьМакета.Рисунки.КартинкаШтрихкода.Картинка = КартинкаШК;
КонецЕсли;

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

Важные нюансы и рекомендации

Проанализируем ключевые моменты, которые гарантируют качественный результат при выводе штрихкодов:

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

← На главную