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

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

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

Способ 1. Программное формирование и метод «Присоединить»

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

Разберем по шагам, как реализовать этот алгоритм. Сначала мы создаем функцию, которая возвращает заполненный табличный документ для конкретного склада. Затем в основной процедуре последовательно вызываем эти функции и склеиваем результат.

Посмотрим на пример программного кода:


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

КонецПроцедуры

Важный нюанс: при использовании метода Присоединить() 1С стыкует новую область к последней выведенной строке. Чтобы таблицы стояли ровно в ряд «голова к голове», необходимо убедиться, что вы копируете области одинаковой высоты или сбрасываете позицию вывода. Также стоит установить свойство Автомасштаб в значение Истина, чтобы итоговый широкий отчет вписался в лист при печати.

Способ 2. Искусственное выравнивание в СКД через «Порядковый номер»

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

Проанализируем ситуацию на уровне запроса. Нам нужно пронумеровать записи внутри каждой группы (склада). В языке запросов 1С это можно сделать с помощью временных таблиц и соединения таблицы самой с собой:


ВЫБРАТЬ
    Продажи.Склад КАК Склад,
    Продажи.Номенклатура КАК Номенклатура,
    Продажи.Количество КАК Количество
ПОМЕСТИТЬ ВТ_Данные
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода) КАК Продажи;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Т1.Склад КАК Склад,
    Т1.Номенклатура КАК Номенклатура,
    Т1.Количество КАК Количество,
    КОЛИЧЕСТВО(Т2.Номенклатура) КАК ПорядковыйНомер
ИЗ
    ВТ_Данные КАК Т1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Данные КАК Т2
        ПО Т1.Склад = Т2.Склад
            И (Т1.Количество < Т2.Количество 
                ИЛИ (Т1.Количество = Т2.Количество И Т1.Номенклатура <= Т2.Номенклатура))
СГРУППИРОВАТЬ ПО
    Т1.Склад, Т1.Номенклатура, Т1.Количество

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

  1. Добавить Таблицу в структуру отчета.
  2. В Группировки строк добавить поле ПорядковыйНомер.
  3. В Группировки колонок добавить поле Склад.
  4. В Выбранные поля добавить Номенклатура и Количество.

В итоге, благодаря общему полю ПорядковыйНомер, все данные выстроятся в аккуратные параллельные таблицы. Поле «Порядковый номер» в самом отчете можно скрыть, сделав его колонку невидимой или исключив из выбранных полей итогового макета.

Способ 3. Использование вложенных отчетов в схеме компоновки

Рассмотрим вариант, когда каждый склад — это фактически отдельный отчет. В СКД можно создать одну общую схему, в которой в качестве элементов структуры будут выступать Вложенные отчеты.

Разберем по шагам этот метод:

  1. Создаем основную схему компоновки.
  2. В настройках добавляем группировку по колонкам (например, по складу).
  3. Внутрь этой группировки вместо детальных записей вставляем вложенный отчет.
  4. Настраиваем связь параметров: передаем ссылку на текущий склад из внешней группировки в параметр вложенного отчета.

Этот способ сложнее в отладке, но он позволяет использовать абсолютно разные макеты и логику расчета для каждой вертикальной секции. Однако помните, что производительность вложенных отчетов может быть ниже при большом количестве итераций (складов).

Рекомендации по оформлению широких отчетов

Когда мы выводим таблицы «в бок», мы часто сталкиваемся с тем, что отчет перестает быть читаемым при печати или просмотре на маленьком мониторе. Проанализируем несколько приемов, которые помогут сделать такой отчет качественным:

Выбор конкретного метода зависит от ваших навыков. Если вам привычнее работать с объектами ТабличныйДокумент, выбирайте Способ 1. Если вы стремитесь минимизировать программный код и предпочитаете декларативный подход — Способ 2 станет отличным решением задачи.

← На главную