Как вывести данные отчета СКД в несколько колонок на одном листе?

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

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

Ограничения стандартного процессора вывода СКД

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

Способ 1. Преобразование структуры данных в кросс-таблицу

Разберем подход, при котором длинный список превращается в таблицу-матрицу на уровне набора данных. Этот вариант позволяет обойтись стандартным механизмом вывода СКД без написания кода в модуле объекта.

Алгоритм реализации:

  1. Присваиваем каждой строке исходного набора данных порядковый номер с помощью нумерации в запросе.
  2. Фиксируем максимальное количество строк N, которое должно помещаться в одну вертикальную колонку (например, 40 строк). Этот параметр можно передавать через настройки отчета.
  3. Вычисляем два индекса для каждой записи:
    • Индекс колонки (по горизонтали): рассчитывается как целая часть от деления номер строки на N.
    • Индекс строки (по вертикали): рассчитывается как остаток от деления номера строки на N.
  4. В настройках структуры СКД настраиваем отчет как Таблицу:
    • В группировку Строки добавляем расчетный Индекс строки.
    • В группировку Колонки добавляем Индекс колонки.
    • В детальных записях выводим пару полей (Номенклатура, Количество).

Посмотрим на пример расчета индексов в запросе:


ВЫБРАТЬ
    ТаблицаТоваров.Номенклатура КАК Номенклатура,
    ТаблицаТоваров.Количество КАК Количество,
    ВЫРАЗИТЬ((ТаблицаТоваров.НомерСтроки - 1) / &КоличествоСтрокВКолонке - 0.5 КАК ЧИСЛО(10, 0)) КАК ИндексКолонки,
    (ТаблицаТоваров.НомерСтроки - 1) % &КоличествоСтрокВКолонке КАК ИндексСтроки
ПОМЕСТИТЬ ВТ_Индексы
ИЗ
    ИсходныеДанные КАК ТаблицаТоваров

Способ 2. Программный вывод с помощью процедуры ПриКомпоновкеРезультата

Проанализируем второй способ, который обеспечивает более гибкую работу с размерами страницы. Вывод отчета выполняется программно в модуле объекта отчета путем перехвата события ПриКомпоновкеРезультата.

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

Шаги выполнения:

  1. Отключаем стандартную обработку компоновки, установив параметр СтандартнаяОбработка = Ложь.
  2. Инициализируем процессор компоновки данных и создаем ТабличныйДокумент.
  3. Заполняем первую колонку таблицы методом Вывести().
  4. Перед выводом очередной строки вызываем метод ПроверитьВывод(). Если функция возвращает Ложь (строка не помещается по высоте листа), переходим к выводу следующей колонки справа.
  5. Смежные колонки выводим методом Присоединить().
  6. Чтобы форматирование и ширина колонок первой секции не искажали последующие, для области ячеек вызываем метод СоздатьФорматСтрок().
  7. Если ширина страницы исчерпана, добавляем разделитель с помощью метода ВывестиГоризонтальныйРазделительСтраниц().

Рассмотрим пример программного вывода табличного документа:


Процедура ПриКомпоновкеРезультата(ТабличныйДокумент, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
    
    // Далее выполняется обход элементов и формирование колонок
    
КонецПроцедуры

Важно: Метод ПроверитьВывод() выполняет расчет на основе параметров принтера по умолчанию. Убедитесь, что в системе или на сервере 1С настроен принтер, иначе вызов метода может вызвать ошибку.

Способ 3. Использование параметров печати табличного документа

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

В свойствах табличного документа можно настроить вывод нескольких виртуальных страниц на один физический лист бумаги:


ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабличныйДокумент.ЭкземпляровНаСтранице = 2;

При таких настройках платформа при отправке на печать автоматически разместит две последовательные страницы документа на одном листе формата А4.

← На главную