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