Почему при использовании метода Присоединить область с картинкой смещается вниз и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При формировании печатных форм в платформе 1С:Предприятие часто требуется расположить текстовое описание товара и его графическое изображение в одну строку. Однако при последовательном использовании методов Вывести() и Присоединить() картинка нередко оказывается ниже положенного уровня. Разберем по шагам, почему возникает такое смещение и какими способами можно реализовать параллельный вывод текста и графики.

Причина смещения при присоединении областей

Проанализируем механику работы метода ТабличныйДокумент.Присоединить(). Этот метод выводит новую область справа от последней выведенной, ориентируясь на верхнюю границу последней выведенной секции. Если базовая область текста состоит, например, из одной строки, а область с изображением в макете объединяет 3 строки по вертикали, то при присоединении происходит нестыковка строк макета. В результате результирующие ячейки могут смещаться относительно друг друга, а сама картинка отображается ниже ожидаемой позиции.

Рассмотрим исходный фрагмент кода, где возникает данная проблема:


ОбластьМакета = Макет.ПолучитьОбласть("ОписаниеТовара");
ОбластьМакета.Параметры.ОписаниеТовара = ОписаниеТовара;
ТабличныйДокумент.Вывести(ОбластьМакета);

Если ЗначениеЗаполнено(СтрокаТовары.Номенклатура.ФайлКартинки) Тогда
    ОбластьОписаниеКартинка = Макет.ПолучитьОбласть("ОписаниеКартинка");
    УстановитьПривилегированныйРежим(Истина);
    КартинкаНоменклатуры = ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(СтрокаТовары.Номенклатура.ФайлКартинки);
    УстановитьПривилегированныйРежим(Ложь);
    
    ОбластьКартинка = ОбластьОписаниеКартинка.Области.АдресКартинки; 
    
    Если ТипЗнч(КартинкаНоменклатуры) = Тип("Картинка") Тогда
        ОбластьКартинка.Картинка = КартинкаНоменклатуры;
    ИначеЕсли ТипЗнч(КартинкаНоменклатуры) = Тип("ДвоичныеДанные") Тогда
        ОбластьКартинка.Картинка = Новый Картинка(КартинкаНоменклатуры);
    КонецЕсли;
    
    ТабличныйДокумент.Присоединить(ОбластьОписаниеКартинка);
КонецЕсли;

Способ 1. Синхронизация строк или использование единой области

Самый простой вариант решения — скорректировать структуру самого макета. Разберем два пути:

  1. Выравнивание высоты областей в макете: убедимся, что область «ОписаниеТовара» и область «ОписаниеКартинка» занимают строго одинаковое количество строк по высоте.
  2. Объединение в единую строку-секцию: откажемся от вызова Присоединить() в пользу одного вызова Вывести(). Для этого в макете создается одна общая горизонтальная секция, включающая в себя и колонку для текста, и область для картинки.

Посмотрим на пример кода с единой горизонтальной областью:


ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТовара");
ОбластьСтрока.Параметры.ОписаниеТовара = ОписаниеТовара;

Если ЗначениеЗаполнено(СтрокаТовары.Номенклатура.ФайлКартинки) Тогда
    УстановитьПривилегированныйРежим(Истина);
    ДвоичныеДанные = ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(СтрокаТовары.Номенклатура.ФайлКартинки);
    УстановитьПривилегированныйРежим(Ложь);
    
    Если ЗначениеЗаполнено(ДвоичныеДанные) Тогда
        ОбластьСтрока.Области.АдресКартинки.Картинка = Новый Картинка(ДвоичныеДанные);
    КонецЕсли;
КонецЕсли;

ТабличныйДокумент.Вывести(ОбластьСтрока);

Способ 2. Программное позиционирование через объект «РисунокТабличногоДокумента»

Если требуется гибко управлять положением и пропорциями изображения без строгой привязки к ячейкам макета, применим метод Расположить() коллекции Рисунки табличного документа.

Рассмотрим по шагам реализацию данного подхода:

  1. Выводим текстовую часть в табличный документ обычным методом Вывести().
  2. Определяем координаты строк и колонок, куда необходимо поместить изображение, используя свойство ВысотаТаблицы или именованную область ячеек.
  3. Создаем новый объект в коллекции Рисунки табличного документа с типом ТипРисункаТабличногоДокумента.Картинка.
  4. Привязываем созданный рисунок к конкретным ячейкам с помощью метода Расположить() и настраиваем режим масштабирования через свойство РазмерКартинки.

Посмотрим на пример программного добавления рисунка:


// Выводим текстовую область
ОбластьМакета = Макет.ПолучитьОбласть("ОписаниеТовара");
ОбластьМакета.Параметры.ОписаниеТовара = ОписаниеТовара;
ТабличныйДокумент.Вывести(ОбластьМакета);

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

Использование свойства РазмерКартинки со значением ИзменениеРазмераРисунка.СохранятьПропорции гарантирует, что изображение впишется в указанные границы без искажения геометрии, а явное указание диапазона ячеек через Расположить() полностью исключает смещение по вертикали.

← На главную