При формировании печатных форм и отчетов в 1С часто возникает необходимость вывести две секции или два блока данных горизонтально — друг рядом с другом. Для этого в платформе предусмотрены методы Вывести() и Присоединить(). Однако разработчики нередко сталкиваются с ситуацией, когда метод Присоединить() отрабатывает как обычный Вывести(), смещая данные вниз, а не вправо.
Рассмотрим подробно причины такого поведения платформы и разберем по шагам, как правильно организовать горизонтальный вывод данных в табличный документ.
Проанализируем исходный код, в котором проявляется ошибка. Допустим, мы циклически формируем данные за каждый год в отдельном табличном документе и пытаемся вывести их по два блока на страницу:
ТабДок = Новый ТабличныйДокумент;
Счетчик = 0;
Для каждого Элемента Из Год Цикл
СекцияГод = Новый ТабличныйДокумент;
// ... Заполнение промежуточного табличного документа СекцияГод ...
Если Счетчик % 2 = 0 Тогда
ТабДок.Вывести(СекцияГод);
Иначе
ТабДок.Присоединить(СекцияГод);
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
Счетчик = Счетчик + 1;
КонецЦикла;
В данном примере второй блок выводится не справа от первого, а под ним. Выясним причину этого поведения.
Метод Присоединить() помещает данные в итоговый табличный документ справа от самой правой выведенной колонки, начиная со строки, с которой выводился предыдущий блок методом Вывести(). Чтобы этот механизм сработал корректно, платформе требуется строго определенная область ячеек с явными границами по строкам и колонкам.
Когда мы передаем в метод Присоединить() или Вывести() весь объект ТабличныйДокумент целиком (переменную СекцияГод), 1C позиционирует его с учетом полной виртуальной сетки этого документа. Из-за отсутствия четкой правой границы выведенной ранее секции метод Присоединить() не может определить начальную позицию для горизонтального встраивания и автоматически выполняет переход на новую строку.
Для исправления ошибки необходимо передавать в методы Вывести() и Присоединить() не сам объект ТабличныйДокумент, а область ячеек из него. Получить область можно с помощью метода ПолучитьОбласть().
Рассмотрим верный вариант реализации:
ТабДок = Новый ТабличныйДокумент;
Счетчик = 0;
Для каждого Элемента Из Год Цикл
СекцияГод = Новый ТабличныйДокумент;
// ... Заполнение СекцияГод ...
// Получаем точные границы таблицы по количеству строк и колонок
Высота = СекцияГод.ВысотаТаблицы;
Ширина = СекцияГод.ШиринаТаблицы;
Если Высота > 0 И Ширина > 0 Тогда
ОбластьДляВывода = СекцияГод.ПолучитьОбласть(1, 1, Высота, Ширина);
Если Счетчик % 2 = 0 Тогда
ТабДок.Вывести(ОбластьДляВывода);
Иначе
ТабДок.Присоединить(ОбластьДляВывода);
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
КонецЕсли;
Счетчик = Счетчик + 1;
КонецЦикла;
ПолучитьОбласть(1, 1, 20, 15), лучше использовать свойства ВысотаТаблицы и ШиринаТаблицы. Это защитит код от ошибок, если структура выводимого блока изменится.Макет.ПолучитьОбласть("Шапка|ЛеваяКолонка").СоздатьФорматСтрок(), чтобы форматирование соседних секций не искажалось.ПроверитьПрисоединение() или включите свойство АвтоМасштаб = Истина у итогового табличного документа.