При формировании отчетов в Системе компоновки данных (СКД) часто возникает ситуация, когда таблица содержит всего пару колонок (например, Номенклатура и Количество). По умолчанию 1С выводит такие данные строго вертикально, из-за чего отчет растягивается на несколько листов в длину, оставляя большую часть страницы по ширине пустой. Рассмотрим, как реализовать так называемую «газетную» верстку и разместить данные в несколько параллельных колонок на одной печатной странице.
В платформе 1С и механизме СКД отсутствует встроенный флаг или переключатель в настройках макета для автоматической разбивки одной длинной таблицы на параллельные колонки. Стандартный процессор вывода всегда формирует последовательный вертикальный список. Однако эту задачу можно решить несколькими техническими способами.
Разберем подход, при котором длинный список превращается в таблицу-матрицу на уровне набора данных. Этот вариант позволяет обойтись стандартным механизмом вывода СКД без написания кода в модуле объекта.
Алгоритм реализации:
N, которое должно помещаться в одну вертикальную колонку (например, 40 строк). Этот параметр можно передавать через настройки отчета.N.N.Индекс строки.Индекс колонки.Номенклатура, Количество).Посмотрим на пример расчета индексов в запросе:
ВЫБРАТЬ
ТаблицаТоваров.Номенклатура КАК Номенклатура,
ТаблицаТоваров.Количество КАК Количество,
ВЫРАЗИТЬ((ТаблицаТоваров.НомерСтроки - 1) / &КоличествоСтрокВКолонке - 0.5 КАК ЧИСЛО(10, 0)) КАК ИндексКолонки,
(ТаблицаТоваров.НомерСтроки - 1) % &КоличествоСтрокВКолонке КАК ИндексСтроки
ПОМЕСТИТЬ ВТ_Индексы
ИЗ
ИсходныеДанные КАК ТаблицаТоваров
Проанализируем второй способ, который обеспечивает более гибкую работу с размерами страницы. Вывод отчета выполняется программно в модуле объекта отчета путем перехвата события ПриКомпоновкеРезультата.
Для реализации этого метода используются функции табличного документа Вывести(), Присоединить() и ПроверитьВывод().
Шаги выполнения:
СтандартнаяОбработка = Ложь.ТабличныйДокумент.Вывести().ПроверитьВывод(). Если функция возвращает Ложь (строка не помещается по высоте листа), переходим к выводу следующей колонки справа.Присоединить().СоздатьФорматСтрок().ВывестиГоризонтальныйРазделительСтраниц().Рассмотрим пример программного вывода табличного документа:
Процедура ПриКомпоновкеРезультата(ТабличныйДокумент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
// Далее выполняется обход элементов и формирование колонок
КонецПроцедуры
Важно: Метод ПроверитьВывод() выполняет расчет на основе параметров принтера по умолчанию. Убедитесь, что в системе или на сервере 1С настроен принтер, иначе вызов метода может вызвать ошибку.
Выясним, как разместить несколько страниц на одном листе средствами печати платформы. Этот вариант подходит, если отчет уже скомпонован в виде повторяющихся таблиц на разных страницах.
В свойствах табличного документа можно настроить вывод нескольких виртуальных страниц на один физический лист бумаги:
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабличныйДокумент.ЭкземпляровНаСтранице = 2;
При таких настройках платформа при отправке на печать автоматически разместит две последовательные страницы документа на одном листе формата А4.