Как вывести даты и суммы в отчете 1С горизонтально в одну строку?

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

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

Способ 1: Использование методов Вывести() и Присоединить() в программном коде

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

Сначала проанализируем ситуацию с макетом. Чтобы данные выводились горизонтально, в макете необходимо создать вертикальные области. Для этого в конфигураторе нужно выделить одну или несколько колонок и присвоить им имя (например, "КолонкаДата").

Теперь разберем пример кода, который формирует такую горизонтальную последовательность:


ТабДок = Новый ТабличныйДокумент;
// Получаем основную секцию (например, заголовок строки)
СекцияЗаголовок = Макет.ПолучитьОбласть("Строка|НазваниеНоменклатуры");
ТабДок.Вывести(СекцияЗаголовок);

// Теперь в цикле будем присоединять даты по горизонтали
Для каждого ТекущаяДата Из МассивДат Цикл
    СекцияДанные = Макет.ПолучитьОбласть("Строка|КолонкаДата");
    СекцияДанные.Параметры.Дата = ТекущаяДата;
    
    // Важный момент: используем Присоединить, чтобы не переходить на новую строку
    ТабДок.Присоединить(СекцияДанные);
КонецЦикла;

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

Способ 2: Реализация через Систему компоновки данных (СКД)

Если вы не хотите писать много кода вручную, наиболее современным решением будет использование кросс-таблиц в СКД. Система сделает всю работу по группировке и горизонтальному выводу автоматически.

Проанализируем шаги настройки СКД для получения горизонтальных дат:

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

При таком подходе СКД сама определит, сколько уникальных дат есть в результате запроса, и сформирует нужное количество колонок. Это избавляет разработчика от необходимости вручную управлять областями макета.

Тонкости форматирования: даты и заголовки

Часто при горизонтальном выводе возникает проблема: даты слишком длинные, и отчет становится слишком широким ("простыня"). Чтобы сделать отчет читаемым, проанализируем следующие приемы:

1. Ориентация текста. В свойствах ячейки макета (или в условном оформлении СКД) можно установить свойство ОриентацияТекста в значение 90 градусов. Тогда даты будут отображаться вертикально (снизу вверх), что значительно сузит колонки.

2. Форматирование даты. Используйте функцию Формат(), чтобы выводить только нужные части даты. Например, вместо "02.03.2020 0:00:00" лучше вывести "02.03" или "Март 20". В коде это выглядит так:

СекцияДанные.Параметры.Дата = Формат(ТекущаяДата, "ДФ=dd.MM");

Группировка колонок и фиксация

Когда данных очень много, пользователю становится трудно ориентироваться. Выясним, как улучшить эргономику такого отчета.

Посмотрим на пример использования автогруппировки. Это позволяет «сворачивать» и «разворачивать» блоки данных (например, дни внутри месяца). Для этого используются методы табличного документа:


ТабДок.НачатьАвтогруппировкуКолонок();
// Вывод колонок в цикле через Присоединить()
ТабДок.ЗакончитьАвтогруппировкуКолонок();

Также крайне полезно использовать свойство ФиксацияСлева. Это позволит закрепить первые колонки (с названиями товаров или клиентов), чтобы при горизонтальной прокрутке пользователь всегда видел, к какой строке относятся данные в правой части экрана.

Подведем итог: для вывода данных в строку мы либо используем связку Вывести() + Присоединить() при работе с макетом, либо настраиваем структуру Таблица в СКД. Второй вариант предпочтительнее для стандартных отчетов, а первый — для сложных печатных форм с нестандартным дизайном.

← На главную