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