Перекрёстный отчёт на СКД: строки, колонки, ресурсы и оформление

· 9 мин

Содержание

Таблица в СКД 1С делается не в запросе и не в макете, а на закладке Настройки схемы компоновки: в структуре отчёта добавляют элемент «Новая таблица», в его узел «Строки» кладут группировку строк (например, по номенклатуре), в узел «Колонки» — группировку колонок (по месяцам), а на закладке Ресурсы указывают, какие числа считать на пересечении. Без ресурса ячейки останутся пустыми — это самая частая причина вопроса «почему таблица не заполняется».

Ещё одно заблуждение: будто для таблицы нужен особый запрос. Нет. Запрос в наборе данных тот же, что и для обычного списка. Табличный вид — это только вариант настройки, и один и тот же набор данных можно показать и списком, и таблицей, и диаграммой. Ниже пример для платформы 8.3 в интерфейсе «Такси»: продажи в разрезе товаров по строкам и месяцев по колонкам.

Подготовка: новый отчёт и схема компоновки данных

Отчёт можно сделать в конфигурации или внешним файлом. Для первой таблицы удобнее внешний — он не требует изменения конфигурации и обновления базы.

Внешний отчёт

  1. Откройте базу в Конфигураторе.
  2. Выберите Файл → Новый… → Внешний отчет.
  3. На форме отчёта нажмите кнопку «Открыть схему компоновки данных». Платформа предложит создать макет — согласитесь. Он получит имя ОсновнаяСхемаКомпоновкиДанных.
  4. Сохраните файл с расширением .erf. Открыть его в пользовательском режиме можно через Файл → Открыть.

Отчёт в конфигурации

В дереве метаданных: ветка Отчеты → «Добавить» → закладка «Основные» → та же кнопка «Открыть схему компоновки данных». После правки нужно обновить конфигурацию базы данных.

Если конфигурация типовая и стоит на поддержке, не правьте её напрямую. Сделайте внешний отчёт или расширение — иначе следующее обновление превратится в ручное сравнение и объединение.

Набор данных

В открывшемся редакторе схемы на закладке Наборы данных нажмите зелёный плюс → «Добавить набор данных - запрос». Запрос можно набрать вручную или собрать конструктором. Пример для регистра продаж:

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

Имена регистра и его измерений зависят от конфигурации: откройте конструктор запроса и посмотрите, какие поля есть у вашего регистра. Флажок «Автозаполнение» оставьте включённым — схема сама создаст поля набора и параметры НачалоПериода и КонецПериода.

💡 Поле Период в оборотной таблице с периодичностью Месяц уже содержит начало месяца. Именно оно и станет заголовками колонок.

Структура таблицы в СКД: строки, колонки и поля

Это главный шаг. Перейдите на закладку Настройки. Есть два пути: мастер и ручная сборка.

Через конструктор настроек

На закладке Настройки нажмите кнопку с волшебной палочкой — «Открыть конструктор настроек». Выберите тип отчёта «Таблица», затем отметьте поля. Мастер спросит, какие поля пойдут в строки, какие в колонки, какие будут ресурсами. Для учебного примера мастер удобен, но результат всё равно придётся донастроить руками.

Вручную

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

Если в строках нужна вложенность, добавьте вторую группировку внутрь первой: правой кнопкой по группировке Номенклатура → «Новая группировка» → например, Контрагент. Получится дерево «товар → покупатель».

Ресурсы — что считается в ячейках

Откройте закладку Ресурсы. Перенесите туда поля Количество и Сумма (двойной щелчок или кнопка «»»). По умолчанию выражение — Сумма(Сумма), то есть сложение по всем записям группы.

ЗадачаВыражение ресурса
📊 Сумма продажСумма(Сумма)
🔢 Число разных покупателейКоличество(Различные Контрагент)
📈 Максимальная разовая суммаМаксимум(Сумма)
💰 Средняя ценаВЫБОР КОГДА Сумма(Количество) = 0 ТОГДА 0 ИНАЧЕ Сумма(Сумма) / Сумма(Количество) КОНЕЦ

Средняя цена — показательный пример. Её нельзя считать как Среднее(Цена): это будет среднее по строкам, а не взвешенное по количеству. Отношение сумм даёт правильную цифру и в итогах, и в ячейках.

Поля, которые не стали ресурсами, СКД считает измерениями. Их можно ставить в группировки. Ресурсы в группировки не ставят — только в выбранные поля.

Отборы и условия: какие данные попадут в таблицу

Ограничить данные можно на трёх уровнях. От выбора зависят и удобство, и скорость.

ГдеКак задаётсяКогда подходит
ЗапросГДЕ в тексте запросаУсловие постоянное, пользователь его не меняет
Отбор настроекЗакладка ОтборПользователь сам выбирает склад, товар, контрагента
Отбор элемента структурыВыделить таблицу или группировку → её ОтборУсловие касается только одной таблицы в отчёте

Отбор на закладке настроек

  1. На закладке Настройки выделите корневой узел «Отчет».
  2. Внизу откройте закладку Отбор, добавьте поле Номенклатура.
  3. Вид сравнения — например, «В группе». Значение пока можно не заполнять.
  4. Чтобы пользователь видел отбор прямо на форме, откройте свойства элемента пользовательских настроек (кнопка с шестерёнкой в строке отбора) и установите режим редактирования «Быстрый доступ».

💡 Отбор по измерению виртуальной таблицы СКД при автозаполнении сама переносит в параметры этой таблицы. Поэтому не пишите ГДЕ Номенклатура В (&Список) ради скорости — отбор настроек сделает то же и останется гибким.

Фигурные скобки в запросе

Если автозаполнение выключено, доступные для отбора поля перечисляют в разделе {ВЫБРАТЬ …}, а условия — в {ГДЕ …}. Блок в фигурных скобках СКД применяет, только если пользователь задал отбор. Для первой таблицы эта техника не нужна, но в чужих отчётах она встречается часто, и знать её стоит.

Параметры и вычисляемые поля в табличном отчёте

Период одним полем

Два отдельных поля «Начало» и «Конец» неудобны. Сделайте общий параметр:

  1. Закладка Параметры → добавить параметр Период, тип СтандартныйПериод.
  2. У параметра НачалоПериода в колонке «Выражение» напишите &Период.ДатаНачала, у КонецПериода — &Период.ДатаОкончания.
  3. У обоих параметров снимите флажок «Доступен» (колонка ограничения доступности), чтобы пользователь видел только Период.
  4. На закладке Настройки → Параметры включите Период и вынесите в быстрый доступ.

Задать параметр из кода, например перед программным формированием:

Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период", Новый СтандартныйПериод(ВариантСтандартногоПериода.ЭтотГод));

Вычисляемые поля

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

ВЫБОР КОГДА Себестоимость = 0 ТОГДА 0 ИНАЧЕ (Сумма - Себестоимость) / Себестоимость * 100 КОНЕЦ

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

Правило выбора простое:

  • 🔹 значение для каждой записи и группировки по нему — вычисляемое поле;
  • 🔹 число в ячейке таблицы и в итогах — ресурс;
  • 🔹 то, что можно сразу посчитать запросом, — лучше в запросе.

Оформление таблицы и условное форматирование

Параметры вывода

На закладке Настройки выделите узел «Отчет» и откройте внизу Другие настройки (параметры вывода). Для таблицы чаще всего меняют:

  • 📐 «Расположение итогов» — сверху, снизу или без итогов по группировкам;
  • 📐 «Расположение общих итогов по вертикали» и «…по горизонтали» — где выводить строку и колонку «Итого»;
  • 📐 «Расположение полей группировок» — отдельно или в одной колонке с отступом, это влияет на ширину;
  • 🎨 «Макет оформления» — готовая цветовая схема шапки и итогов;
  • 🏷 «Заголовок» и «Выводить заголовок» — название над таблицей.

Если таблиц в отчёте несколько, те же параметры можно задать у отдельной таблицы: выделите её в структуре, и внизу появятся её собственные настройки.

Формат чисел

Чтобы суммы выглядели как 1 250 000,00, откройте закладку Условное оформление, добавьте элемент без отбора, в поле «Оформление» задайте параметр «Формат» со значением ЧДЦ=2, а в «Оформляемые поля» укажите Сумма. Для количества подойдёт ЧДЦ=0, для пустых значений — ЧН=0 или ЧН=-.

Подсветка по условию

Пример: красный фон, если сумма за месяц отрицательная (возвраты перекрыли продажи).

  1. Закладка Условное оформление → «Добавить».
  2. В «Оформление» включите «Цвет фона» и выберите цвет.
  3. В «Условие» добавьте отбор Сумма Меньше 0.
  4. В «Оформляемые поля» укажите Сумма. Если поле не указать, подсветится вся строка.

Условное оформление работает и в ячейках на пересечении строк и колонок. Его же пользователь может менять сам, если вы включили для элемента быстрый или обычный доступ.

Таблица на СКД готова к сдаче
Выполнено: 0 / 7

Вывод таблицы из кода

Иногда таблицу нужно получить программно: показать в своей форме, отправить по почте или обработать дальше. Минимальный рабочий фрагмент для серверного кода модуля отчёта:

Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = Схема.НастройкиПоУмолчанию;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);

Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(МакетКомпоновки);

ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(Процессор);

Если отчёт открывает пользователь через стандартную форму, этот код не нужен: форма сама собирает настройки, включая пользовательские.

Частые ошибки и скорость табличного отчёта

Диагностика: выберите симптом

Что замедляет таблицу

  • 🐢 Пустой период. Без ограничения дат отчёт читает регистр за все годы. Сделайте параметр Период обязательным или задайте значение по умолчанию.
  • 🐢 Дополнение периодов на большом интервале. Тип дополнения День за три года — это больше тысячи колонок. Для длинных интервалов берите месяц или квартал.
  • 🐢 Детальные записи в строках. Группировка «Детальные записи» внутри таблицы выводит каждую запись регистра. На миллионах строк форма зависнет. Оставляйте её только для расшифровки.
  • 🐢 Разыменование через точку. Поля вида Номенклатура.Родитель.Родитель в группировках добавляют соединения. Если такое поле нужно всегда, получите его в запросе.
  • 🐢 Условия в ГДЕ после виртуальной таблицы. Ставьте отбор по измерениям в параметры виртуальной таблицы, а лучше — через отбор настроек, который СКД перенесёт туда сама.

Проверять скорость стоит на рабочей копии базы с реальным объёмом данных. На демобазе всё летает, а у пользователя с базой за пять лет тот же отчёт строится минуту.

Частые вопросы

Чем «Таблица» в структуре отличается от «Группировки»?
Группировка выводит данные списком сверху вниз. Таблица добавляет второе измерение — колонки, и числа стоят на пересечении строки и колонки.
Можно ли в одном отчёте вывести две таблицы?
Да. Добавьте в корень структуры второй элемент «Новая таблица». У каждой будут свои группировки, отборы и параметры вывода.
Как убрать колонку «Итого» справа?
В параметрах вывода таблицы задайте «Расположение общих итогов по горизонтали» со значением «Нет».
Как получить результат СКД в таблицу значений, а не в табличный документ?
Передайте в КомпоновщикМакета.Выполнить пятым параметром Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений") и выводите через ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений. Табличную структуру с колонками при этом лучше заменить группировками.
Почему пользователь не видит мои настройки таблицы?
Сохранённый у пользователя вариант отчёта перекрывает настройки по умолчанию. Попросите выбрать стандартные настройки на форме отчёта или удалить сохранённый вариант.