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