При разработке печатных форм в нетиповых или самописных конфигурациях 1С часто возникает задача вывода штрихкодов для номенклатуры или документов. В отличие от типовых решений, где уже внедрены подсистемы БСП (Библиотека стандартных подсистем) или БПО (Библиотека подключаемого оборудования), в чистой конфигурации разработчик сталкивается с рядом технических нюансов: выбором подходящей компоненты с учетом разрядности платформы (x32/x64) и корректным размещением изображения в табличном документе.
Разберем типичную проблему: компонента подключена, двоичные данные или изображение штрихкода получены, но при попытке присвоения значения в макет возникает исключение:
{Документ.РасходнойДокумент.Форма.ФормаДокумента.Форма(320)}: Поле объекта недоступно для записи (Картинка)
Проанализируем причины этой ошибки и пошагово рассмотрим, как правильно организовать генерацию и вывод штрихкодов.
Рассмотрим, что происходит в момент выполнения строки кода:
Шапка.Рисунки.Штрихкод.Картинка = ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, Штрихкод, 50, 30);
В объектной модели табличного документа коллекция Рисунки содержит графические объекты разного типа. Ошибка возникает в двух основных случаях:
Объект (например, Шапка.Рисунки.Штрихкод.Объект.ТекстКода = ...), а базовое свойство Картинка у самого контейнера рисунка заблокировано как для записи, так и для чтения.Картинка.Разберем по шагам, как исправить макет вручную, чтобы свойство стало доступно:
Штрихкод.После этого объект получает тип ТипРисункаТабличногоДокумента.Картинка, и присвоение картинки из встроенного языка будет отрабатывать без ошибок.
Если макет нельзя или нежелательно менять вручную, создадим рисунок динамически прямо в коде формирования печатной формы. Рассмотрим пример:
// Получаем область шапки из макета
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
// Получаем объект картинки со штрихкодом
ИзображениеШтрихкода = ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, ЗначениеШтрихкода, 50, 30);
// Добавляем новый рисунок типа "Картинка"
РисунокШтрихкода = ОбластьШапка.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
РисунокШтрихкода.Имя = "Штрихкод";
РисунокШтрихкода.Картинка = ИзображениеШтрихкода;
// Позиционируем рисунок в пределах нужных ячеек области
РисунокШтрихкода.Расположить(ОбластьШапка.Область("R2C2:R5C5"));
// Выводим готовую область в итоговый табличный документ
ТабДокумент.Вывести(ОбластьШапка);
При таком подходе исключается конфликт типов объектов, так как элемент изначально создается нужного типа.
При печати штрихкодов в среде 1С критически важно учитывать разрядность клиентского приложения:
Подключение Native-компоненты штрихкодирования выполняется следующим образом:
// МакетКомпоненты - макет типа "Двоичные данные", содержащий архив с компонентой
АдресКомпоненты = "Макет.КомпонентаПечатиШтрихкодов";
РезультатПодключения = ПодключитьВнешнююКомпоненту(АдресКомпоненты, "BarcodeNative", ТипВнешнейКомпоненты.Native);
Если РезультатПодключения Тогда
КомпонентаШтрихкода = Новый("AddIn.BarcodeNative.BarcodeExtension");
Иначе
ВызватьИсключение "Не удалось подключить внешнюю компоненту печати штрихкодов!";
КонецЕсли;
Обратим внимание на функцию ПолучитьКартинкуШтрихкода. Во многих типовых функциях БПО и БСП результатом генерации является не сам объект Картинка, а структура, содержащая двоичные данные:
// Если функция вернула ДвоичныеДанные или структуру
Если ТипЗнч(РезультатГенерации) = Тип("Структура") Тогда
КартинкаДляВывода = Новый Картинка(РезультатГенерации.ДвоичныеДанные);
ИначеЕсли ТипЗнч(РезультатГенерации) = Тип("ДвоичныеДанные") Тогда
КартинкаДляВывода = Новый Картинка(РезультатГенерации);
Иначе
КартинкаДляВывода = РезультатГенерации;
КонецЕсли;
Шапка.Рисунки.Штрихкод.Картинка = КартинкаДляВывода;
Проверив тип графического объекта в макете, разрядность рабочего клиента и соответствие типа данных изображения, мы полностью устраняем ошибку записи свойства и получаем стабильную печать штрихкодов в любой конфигурации.