Как реализовать печать штрихкода в нетиповой конфигурации и исправить ошибку «Поле объекта недоступно для записи (Картинка)»?

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

При разработке печатных форм в нетиповых или самописных конфигурациях 1С часто возникает задача вывода штрихкодов для номенклатуры или документов. В отличие от типовых решений, где уже внедрены подсистемы БСП (Библиотека стандартных подсистем) или БПО (Библиотека подключаемого оборудования), в чистой конфигурации разработчик сталкивается с рядом технических нюансов: выбором подходящей компоненты с учетом разрядности платформы (x32/x64) и корректным размещением изображения в табличном документе.

Разберем типичную проблему: компонента подключена, двоичные данные или изображение штрихкода получены, но при попытке присвоения значения в макет возникает исключение:

{Документ.РасходнойДокумент.Форма.ФормаДокумента.Форма(320)}: Поле объекта недоступно для записи (Картинка)

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

Выясним причину ошибки: почему поле «Картинка» недоступно для записи

Рассмотрим, что происходит в момент выполнения строки кода:


Шапка.Рисунки.Штрихкод.Картинка = ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, Штрихкод, 50, 30);

В объектной модели табличного документа коллекция Рисунки содержит графические объекты разного типа. Ошибка возникает в двух основных случаях:

  1. В макет внедрен OLE/ActiveX объект вместо стандартной картинки. В старых версиях конфигураций для компоненты 1C:Печать штрихкодов (1CBarCode) в макет вставлялся специальный элемент управления ActiveX. У такого объекта обращение к штрихкоду шло через вложенное свойство Объект (например, Шапка.Рисунки.Штрихкод.Объект.ТекстКода = ...), а базовое свойство Картинка у самого контейнера рисунка заблокировано как для записи, так и для чтения.
  2. Тип объекта в макете не является графическим изображением. Если элемент в макете был создан как фигура (прямоугольник, линия) или текстовое поле, у него тип рисунка табличного документа не поддерживает прямое присвоение объекта Картинка.

Способ 1. Замена элемента в макете табличного документа

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

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

После этого объект получает тип ТипРисункаТабличногоДокумента.Картинка, и присвоение картинки из встроенного языка будет отрабатывать без ошибок.

Способ 2. Программное создание рисунка в табличном документе

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


// Получаем область шапки из макета
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

// Получаем объект картинки со штрихкодом
ИзображениеШтрихкода = ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, ЗначениеШтрихкода, 50, 30);

// Добавляем новый рисунок типа "Картинка"
РисунокШтрихкода = ОбластьШапка.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
РисунокШтрихкода.Имя = "Штрихкод";
РисунокШтрихкода.Картинка = ИзображениеШтрихкода;

// Позиционируем рисунок в пределах нужных ячеек области
РисунокШтрихкода.Расположить(ОбластьШапка.Область("R2C2:R5C5"));

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

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

Особенности работы с компонентами и разрядность платформы (x32 vs x64)

При печати штрихкодов в среде 1С критически важно учитывать разрядность клиентского приложения:

  1. ActiveX-компонента (1C:Печать штрихкодов / 1CBarCode). Исторически использовалась в большинстве решений 1С 7.7 и 1С 8 ранних версий. Она является 32-битной. Если пользователь запускает 64-разрядный клиент 1С (толстый или тонкий клиент x64), загрузить такую компоненту в память процесса невозможно из-за архитектурных ограничений ОС Windows.
  2. Native-компонента из состава БПО. Библиотека подключаемого оборудования (БПО) содержит кроссплатформенные Native-компоненты штрихкодирования, скомпилированные как под 32-битную, так и под 64-битную архитектуру. Для платформы 1С 8.3 рекомендуется использовать именно их.

Подключение Native-компоненты штрихкодирования выполняется следующим образом:


// МакетКомпоненты - макет типа "Двоичные данные", содержащий архив с компонентой
АдресКомпоненты = "Макет.КомпонентаПечатиШтрихкодов"; 

РезультатПодключения = ПодключитьВнешнююКомпоненту(АдресКомпоненты, "BarcodeNative", ТипВнешнейКомпоненты.Native);
Если РезультатПодключения Тогда
    КомпонентаШтрихкода = Новый("AddIn.BarcodeNative.BarcodeExtension");
Иначе
    ВызватьИсключение "Не удалось подключить внешнюю компоненту печати штрихкодов!";
КонецЕсли;

Проверка возвращаемого значения функции генерации

Обратим внимание на функцию ПолучитьКартинкуШтрихкода. Во многих типовых функциях БПО и БСП результатом генерации является не сам объект Картинка, а структура, содержащая двоичные данные:


// Если функция вернула ДвоичныеДанные или структуру
Если ТипЗнч(РезультатГенерации) = Тип("Структура") Тогда
    КартинкаДляВывода = Новый Картинка(РезультатГенерации.ДвоичныеДанные);
ИначеЕсли ТипЗнч(РезультатГенерации) = Тип("ДвоичныеДанные") Тогда
    КартинкаДляВывода = Новый Картинка(РезультатГенерации);
Иначе
    КартинкаДляВывода = РезультатГенерации;
КонецЕсли;

Шапка.Рисунки.Штрихкод.Картинка = КартинкаДляВывода;

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

← На главную