При разработке печатных форм в «1С:Предприятие 8.3» программисты часто сталкиваются с задачей вывода штрихкодов. В процессе реализации этой задачи может возникнуть крайне неприятная ошибка: «Поле объекта недоступно для чтения/записи (Картинка)». Обычно она появляется в строке кода, где сгенерированное изображение штрихкода пытается присвоиться рисунку в табличном документе.
В этой статье мы подробно разберем, почему возникает данная неполадка, проанализируем различия в технологиях работы со штрихкодами и пошагово настроим корректный вывод изображения в печатную форму.
Для начала проанализируем ситуацию, в которой возникает ошибка. Как правило, разработчик пытается выполнить следующий код:
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", Окр(Макет.Рисунки.D1.Ширина * 5));
ПараметрыШтрихкода.Вставить("Высота", Окр(Макет.Рисунки.D1.Высота * 5));
ПараметрыШтрихкода.Вставить("Штрихкод", "1234567891234");
ПараметрыШтрихкода.Вставить("ТипКода", 1);
Макет.Рисунки.D1.Картинка = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
При выполнении этого кода система выбрасывает исключение. Здесь кроются сразу две принципиальные архитектурные ошибки, которые мы сейчас подробно разберем.
Обратите внимание на конструкцию Макет.Рисунки.D1.Картинка. При формировании печатной формы сам исходный Макет выступает в роли неизменяемого шаблона (только для чтения). Платформа блокирует прямую запись в его структуру, чтобы избежать случайного изменения исходного шаблона во время сеанса печати.
Для вывода данных мы должны работать исключительно с копией этого шаблона — областью, полученной из макета. Правильный путь обращения выглядит так: сначала мы получаем область через метод ПолучитьОбласть(), затем производим манипуляции с рисунками внутри этой области и только потом выводим ее в результирующий табличный документ.
Эта проблема уходит корнями в историю развития платформы «1С:Предприятие». Раньше для вывода штрихкодов использовалась внешняя компонента 1CBarCode.dll, которая добавлялась на макет как элемент управления ActiveX (через меню Таблица — Рисунки — Вставить объект — Элемент управления).
У объекта типа ActiveX (элемента управления) свойство Картинка либо вообще отсутствует в объектной модели платформы, либо закрыто для прямой записи. Попытка присвоить ему объект типа Картинка напрямую всегда будет приводить к ошибке.
В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) и БПО (Библиотеки подключаемого оборудования) генерация штрихкода происходит на сервере. Компонента генерирует полноценное бинарное изображение в формате PNG. Чтобы вставить такое изображение в макет, сам рисунок на макете должен иметь тип Рисунок (Картинка), а не элемент управления ActiveX.
Рассмотрим подробнее, почему стоит полностью отказаться от использования старой компоненты 1C Barcode (ActiveX):
regsvr32, что часто вызывает проблемы из-за ограничений прав пользователей.Картинка.Решим задачу правильно и разберем по шагам весь процесс настройки макета и написания кода.
Откроем макет нашей печатной формы в конфигураторе и выполним следующие действия:
КартинкаШтрихкода.Теперь напишем отказоустойчивый код формирования печатной формы на сервере. Посмотрим на пример реализации:
// 1. Получаем макет печатной формы
Макет = ПолучитьМакет("МакетПечатнойФормы");
// 2. Получаем нужную область, где расположен наш рисунок-картинка
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьШтрихкода");
// 3. Подготавливаем параметры для генерации штрихкода
ПараметрыШтрихкода = Новый Структура;
// Рассчитываем размеры в пикселях на основе физического размера рамки в макете
ПараметрыШтрихкода.Вставить("Ширина", Окр(ОбластьМакета.Рисунки.КартинкаШтрихкода.Ширина * 4));
ПараметрыШтрихкода.Вставить("Высота", Окр(ОбластьМакета.Рисунки.КартинкаШтрихкода.Высота * 4));
ПараметрыШтрихкода.Вставить("Штрихкод", "4601234567890"); // Пример кода EAN-13
ПараметрыШтрихкода.Вставить("ТипКода", 1); // 1 соответствует типу EAN-13 в БПО
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Истина);
ПараметрыШтрихкода.Вставить("РазмерШрифта", 10);
// 4. Генерируем картинку с помощью функций БПО (на сервере)
КартинкаШК = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
// 5. Проверяем, успешно ли получена картинка, и записываем ее в рисунок ОБЛАСТИ
Если ЗначениеЗаполнено(КартинкаШК) Тогда
ОбластьМакета.Рисунки.КартинкаШтрихкода.Картинка = КартинкаШК;
КонецЕсли;
// 6. Выводим готовую область в итоговый табличный документ
ТабличныйДокумент.Вывести(ОбластьМакета);
Проанализируем ключевые моменты, которые гарантируют качественный результат при выводе штрихкодов:
Ширина и Высота на повышающий коэффициент (в нашем примере — 4 или 5). Это позволяет сгенерировать картинку высокого разрешения, которая при сжатии до размеров рамки в макете сохранит высокую плотность пикселей и четкость линий при печати.Рисунок.Картинка гарантирует, что печатная форма будет одинаково успешно формироваться как на веб-клиенте, так и в тонком клиенте под управлением любых операционных систем.Таким образом, соблюдая простые правила работы со свойствами областей табличного документа и используя современные Native-компоненты БПО вместо устаревших ActiveX-элементов управления, мы можем легко избежать ошибок доступа к свойствам объектов и гарантировать стабильную работу системы печати этикеток и документов.