При разработке отчетов и печатных форм в системе 1С:Предприятие часто возникает задача программного формирования табличного документа без использования заранее подготовленного макета. Одной из наиболее трудоемких задач в этом контексте является добавление графических объектов: логотипов, печатей или штрихкодов. Рассмотрим подробно, почему возникают ошибки при попытке добавить рисунок "в лоб" и как правильно реализовать эту задачу, чтобы данные корректно отображались и выводились на печать.
Типичная ситуация, с которой сталкиваются разработчики: код по добавлению рисунка написан, объект РисунокТабличногоДокумента создан, картинка в него помещена, но при вызове метода Показать() или Напечатать() пользователь видит пустой лист. Проанализируем ситуацию: в 1С при программном добавлении рисунка через коллекцию Рисунки.Добавить() объект создается с нулевыми размерами (ширина и высота равны 0) и координатами (0,0). Визуально такой объект просто не виден.
Важный момент: Для того чтобы картинка появилась в документе, ей необходимо явно задать геометрические параметры или привязать её к сетке ячеек.
Этот способ удобен, когда вам нужно жестко закрепить картинку в определенном месте листа, независимо от того, как меняются колонки и строки. Посмотрим на пример кода, который позволяет вывести картинку из библиотеки:
ТабДок = Новый ТабличныйДокумент;
// Добавляем новый рисунок типа "Картинка"
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
// Устанавливаем картинку из библиотеки или внешнего файла
Рисунок.Картинка = БиблиотекаКартинок.GoogleMaps;
// Задаем размеры в миллиметрах
Рисунок.Ширина = 60;
Рисунок.Высота = 20;
// Указываем положение относительно верхнего левого угла документа
Рисунок.Лево = 10;
Рисунок.Верх = 10;
// Настраиваем режим отображения
Рисунок.РазмерКартинки = РазмерКартинки.Растянуть;
Рисунок.ВыводитьНаПечать = Истина;
ТабДок.Показать();
В данном примере мы используем свойства Лево и Верх. Обратите внимание, что в 1С эти параметры измеряются в миллиметрах, что удобно для подготовки печатных форм под конкретный формат бумаги.
Наиболее надежным и гибким методом является привязка рисунка к конкретной области ячеек. Рассмотрим подробнее, как это работает. Если мы хотим, чтобы наш штрихкод или логотип находился, например, в границах первых пяти строк и трех колонок, мы сначала определяем эту область, а затем вызываем метод Расположить().
Проанализируем шаги реализации:
Область(НомерСтроки, НомерКолонки, ...).Расположить(), передавая в него подготовленную область.Пример кода для вывода штрихкода в конкретную область:
ТДок = Новый ТабличныйДокумент;
// Подготавливаем ячейки под рисунок
ОбластьШтрихкода = ТДок.Область("R1C1:R5C4");
ОбластьШтрихкода.ШиринаКолонки = 20; // Устанавливаем ширину в символах
ОбластьШтрихкода.ВысотаСтроки = 50; // Устанавливаем высоту в пунктах
РисунокШтрихкода = ТДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
// Предположим, функция получения штрихкода возвращает объект типа Картинка
ПараметрыШтрихкода = Новый Структура("Штрихкод, ТипКода", "1234567890123", 4);
РисунокШтрихкода.Картинка = ГенерацияШтрихкода.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
// Привязываем рисунок к сетке ячеек
РисунокШтрихкода.Расположить(ОбластьШтрихкода);
РисунокШтрихкода.РазмерКартинки = РазмерКартинки.АвтоРазмер;
ТДок.Показать();
Начиная с версии платформы 8.3.6, разработчикам стал доступен специализированный ТипРисункаТабличногоДокумента.Штрихкод. Выясним причину, почему это лучше обычного типа Картинка. При использовании этого типа вам не нужно генерировать картинку внешними средствами или компонентами БСП. Объект рисунка сам обладает свойствами ТекстКода, ТипКода и ОтображатьТекст.
Выполним настройку такого объекта программно:
// Добавляем рисунок с типом Штрихкод
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Штрихкод);
Рисунок.Лево = 5;
Рисунок.Верх = 5;
Рисунок.Ширина = 50;
Рисунок.Высота = 25;
// Настраиваем свойства самого штрихкода (доступны только для этого типа рисунка)
Рисунок.ТипКода = 4; // Например, EAN13
Рисунок.Сообщение = "4601234567890";
Рисунок.ОтображатьТекст = Истина;
Рисунок.УголПоворота = 0;
Преимущество: Такой штрихкод генерируется платформой "на лету" и обычно имеет векторную природу, что обеспечивает высокое качество печати на любых принтерах.
Чтобы ваш программно созданный документ выглядел профессионально, рассмотрим несколько дополнительных настроек:
1. Управление границами. По умолчанию у добавленного рисунка может отображаться тонкая рамка. Если она не нужна, используйте объект Линия:
Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
2. Качество печати и формат SVG. Если вы используете внешние компоненты (например, из состава БСП) для генерации штрихкодов, старайтесь запрашивать изображение в формате SVG. Векторная графика сохраняет четкость линий при любом масштабировании, что критически важно для корректного считывания штрихкода сканером. Растровые форматы (PNG, BMP) могут "замыливаться" при изменении свойств Ширина и Высота.
3. Слоевое управление (Z-порядок). Если вы добавляете несколько изображений (например, подпись поверх печати), используйте методы УстановитьВперед() и УстановитьНазад() для управления наложением объектов друг на друга.
4. Защита от случайного сдвига. Если документ открывается для просмотра пользователю, программно добавленные рисунки можно случайно переместить мышкой. Чтобы этого избежать, установите свойство Защита:
Рисунок.Защита = Истина;
Не забудьте при этом включить общую защиту табличного документа: ТабДок.ТолькоПросмотр = Истина;.
Подводя итог нашему анализу, выделим ключевые правила программного добавления рисунков:
Ширина, Высота) сразу после добавления объекта в коллекцию Рисунки.РазмерКартинки.Растянуть или АвтоРазмер.Расположить(), привязывая картинку к заранее настроенным ячейкам.ТипРисункаТабличногоДокумента.Штрихкод — это самый простой и надежный путь.Соблюдение этих рекомендаций позволит вам создавать динамические печатные формы любой сложности, обеспечивая при этом корректное отображение графической информации на экране и бумажных носителях.