Почему метод Присоединить() в 1С выводит табличный документ снизу, а не справа

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

При формировании печатных форм и отчетов в 1С часто возникает необходимость вывести две секции или два блока данных горизонтально — друг рядом с другом. Для этого в платформе предусмотрены методы Вывести() и Присоединить(). Однако разработчики нередко сталкиваются с ситуацией, когда метод Присоединить() отрабатывает как обычный Вывести(), смещая данные вниз, а не вправо.

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

В чем заключается проблема

Проанализируем исходный код, в котором проявляется ошибка. Допустим, мы циклически формируем данные за каждый год в отдельном табличном документе и пытаемся вывести их по два блока на страницу:


ТабДок = Новый ТабличныйДокумент;
Счетчик = 0;

Для каждого Элемента Из Год Цикл
    СекцияГод = Новый ТабличныйДокумент;
    // ... Заполнение промежуточного табличного документа СекцияГод ...
    
    Если Счетчик % 2 = 0 Тогда
        ТабДок.Вывести(СекцияГод);
    Иначе
        ТабДок.Присоединить(СекцияГод);
        ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
    КонецЕсли;
    
    Счетчик = Счетчик + 1;
КонецЦикла;

В данном примере второй блок выводится не справа от первого, а под ним. Выясним причину этого поведения.

Почему Присоединить() сдвигает данные вниз

Метод Присоединить() помещает данные в итоговый табличный документ справа от самой правой выведенной колонки, начиная со строки, с которой выводился предыдущий блок методом Вывести(). Чтобы этот механизм сработал корректно, платформе требуется строго определенная область ячеек с явными границами по строкам и колонкам.

Когда мы передаем в метод Присоединить() или Вывести() весь объект ТабличныйДокумент целиком (переменную СекцияГод), 1C позиционирует его с учетом полной виртуальной сетки этого документа. Из-за отсутствия четкой правой границы выведенной ранее секции метод Присоединить() не может определить начальную позицию для горизонтального встраивания и автоматически выполняет переход на новую строку.

Решение: вывод конкретной области ячеек

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

Рассмотрим верный вариант реализации:


ТабДок = Новый ТабличныйДокумент;
Счетчик = 0;

Для каждого Элемента Из Год Цикл
    СекцияГод = Новый ТабличныйДокумент;
    // ... Заполнение СекцияГод ...
    
    // Получаем точные границы таблицы по количеству строк и колонок
    Высота = СекцияГод.ВысотаТаблицы;
    Ширина = СекцияГод.ШиринаТаблицы;
    
    Если Высота > 0 И Ширина > 0 Тогда
        ОбластьДляВывода = СекцияГод.ПолучитьОбласть(1, 1, Высота, Ширина);
        
        Если Счетчик % 2 = 0 Тогда
            ТабДок.Вывести(ОбластьДляВывода);
        Иначе
            ТабДок.Присоединить(ОбластьДляВывода);
            ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;
    КонецЕсли;
    
    Счетчик = Счетчик + 1;
КонецЦикла;

Рекомендации по работе с горизонтальным выводом

  1. Избегайте жестко зашитых координат ячеек: Вместо указания фиксированных чисел, таких как ПолучитьОбласть(1, 1, 20, 15), лучше использовать свойства ВысотаТаблицы и ШиринаТаблицы. Это защитит код от ошибок, если структура выводимого блока изменится.
  2. Используйте именованные области макета: В стандартных отчетах удобнее заранее разметить макет и получать пересечение строк и колонок по именам: Макет.ПолучитьОбласть("Шапка|ЛеваяКолонка").
  3. Управляйте шириной колонок: Если присоединяемый блок имеет другую ширину колонок относительно основной таблицы, используйте метод СоздатьФорматСтрок(), чтобы форматирование соседних секций не искажалось.
  4. Контролируйте ширину страницы: Если присоединяемый блок не помещается на листе по ширине, используйте метод ПроверитьПрисоединение() или включите свойство АвтоМасштаб = Истина у итогового табличного документа.
← На главную