В процессе разработки печатных форм часто возникает задача вывода графической информации: логотипов компаний, фотографий товаров, штрихкодов или печатей. Как правило, такие данные хранятся в базе данных в объектах типа ХранилищеЗначений. В данной статье мы подробно разберем, как правильно извлечь эти данные и передать их в табличный документ так, чтобы изображение отображалось корректно и с нужными пропорциями.
Прежде чем приступать к выводу в макет, проанализируем, как данные хранятся. В 1С ХранилищеЗначений — это специальный тип, который позволяет упаковывать бинарные данные (картинки, файлы) для хранения в таблицах СУБД. Для работы с ними нам необходимо выполнить обратную операцию — распаковку.
Рассмотрим стандартный сценарий: у нас есть справочник, где в одном из реквизитов (например, ДанныеХЗ) лежит упакованная картинка. Первым делом нам нужно получить объект типа ДвоичныеДанные, а затем преобразовать его в объект Картинка, который «понимает» табличный документ.
// Получаем структуру или выборку из справочника
ДанныеСправочника = РаботаСоСправочниками.ПолучитьДанныеКартинки(Номенклатура);
// Извлекаем данные из хранилища значений
ДвоичныеДанные = ДанныеСправочника.ДанныеХЗ.Получить();
// Важно проверить, что в хранилище действительно что-то было
Если ТипЗнч(ДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда
// Создаем объект Картинка. Второй параметр "Истина" отвечает за прозрачность
НужнаяКартинка = Новый Картинка(ДвоичныеДанные, Истина);
Иначе
НужнаяКартинка = Новый Картинка; // Пустая картинка, если данных нет
КонецЕсли;
Чтобы изображение появилось в печатной форме, недостаточно просто написать код. Нужно подготовить «контейнер» в самом макете. Разберем этот процесс по шагам:
ЛоготипКомпании).ПараметрКартинка).Рассмотрим типичную ошибку начинающих разработчиков: попытку присвоить значение параметру после того, как область уже выведена в табличный документ. Выясним причину, почему это не работает. Когда мы вызываем метод Вывести(), 1С делает «снимок» области макета со всеми заполненными на этот момент значениями. Любые изменения параметров после этого метода не затронут уже выведенный в результат текст и графику.
Посмотрим на правильный алгоритм работы в модуле объекта или менеджера:
// 1. Инициализируем табличный документ
ТабДок = Новый ТабличныйДокумент;
// 2. Получаем макет
Макет = ПолучитьМакет("ПечатьЭтикетки");
// 3. Получаем область, в которой мы разместили наш рисунок-параметр
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
// 4. Подготавливаем изображение (как мы разбирали выше)
ДанныеКартинки = Справочники.ХранилищеКартинок.НайтиПоНаименованию("Лого").ДанныеХЗ.Получить();
ОбъектКартинка = Новый Картинка(ДанныеКартинки);
// 5. Заполняем параметры области ПЕРЕД выводом
ОбластьШапка.Параметры.Заполнить(ЭтотОбъект); // Если нужно заполнить текстовые поля
ОбластьШапка.Параметры.ПараметрКартинка = ОбъектКартинка; // Присваиваем саму картинку
// 6. Только теперь выводим область в результирующий документ
ТабДок.Вывести(ОбластьШапка);
Проанализируем ситуацию, когда картинка в макете выглядит растянутой или, наоборот, слишком мелкой. В свойствах объекта «Рисунок» в макете есть ключевое поле Размер. Рассмотрим, как ведут себя его основные значения:
Иногда требуется вставить изображение не через параметр-рисунок, а непосредственно в конкретную ячейку табличного документа, зная её координаты. Это может быть полезно при динамическом формировании сложных отчетов.
Разберем пример кода для такого случая:
// Предположим, ТабДок уже частично заполнен
КартинкаШК = Новый Картинка(ДвоичныеДанныеШтрихкода);
// Определяем область (ячейку) по координатам (строка, колонка)
ЦелеваяОбласть = ТабДок.Область(5, 2);
// В коллекции Рисунки табличного документа добавляем новый объект
НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
НовыйРисунок.Картинка = КартинкаШК;
// Устанавливаем положение рисунка, привязывая его к ячейке
НовыйРисунок.Расположить(ЦелеваяОбласть);
// Настраиваем отображение границ
НовыйРисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
Проанализируем несколько моментов, которые могут вызвать затруднения при работе с изображениями:
ДанныеХЗ.Получить(). Если в базе вместо картинки лежит Неопределено, попытка создать Новый Картинка(Неопределено) вызовет критическую ошибку выполнения кода.Новый Картинка(Данные, Истина), второй параметр включает поддержку прозрачного слоя. Однако помните, что в самом макете у рисунка должно быть установлено свойство Узор — Без цвета, иначе фон будет белым.Таким образом, мы выяснили, что успешный вывод картинки в макет 1С зависит от трех составляющих: правильной распаковки ХранилищаЗначений, корректной настройки свойств объекта «Рисунок» в макете (тип «Параметр») и строгого соблюдения порядка заполнения данных перед выводом области в табличный документ.