Перекрёстный отчёт на СКД: строки, колонки, ресурсы и оформление
Содержание
Таблица в СКД 1С делается не в запросе и не в макете, а на закладке Настройки схемы компоновки: в структуре отчёта добавляют элемент «Новая таблица», в его узел «Строки» кладут группировку строк (например, по номенклатуре), в узел «Колонки» — группировку колонок (по месяцам), а на закладке Ресурсы указывают, какие числа считать на пересечении. Без ресурса ячейки останутся пустыми — это самая частая причина вопроса «почему таблица не заполняется».
Ещё одно заблуждение: будто для таблицы нужен особый запрос. Нет. Запрос в наборе данных тот же, что и для обычного списка. Табличный вид — это только вариант настройки, и один и тот же набор данных можно показать и списком, и таблицей, и диаграммой. Ниже пример для платформы 8.3 в интерфейсе «Такси»: продажи в разрезе товаров по строкам и месяцев по колонкам.
Подготовка: новый отчёт и схема компоновки данных
Отчёт можно сделать в конфигурации или внешним файлом. Для первой таблицы удобнее внешний — он не требует изменения конфигурации и обновления базы.
Внешний отчёт
- Откройте базу в Конфигураторе.
- Выберите
Файл → Новый… → Внешний отчет. - На форме отчёта нажмите кнопку «Открыть схему компоновки данных». Платформа предложит создать макет — согласитесь. Он получит имя
ОсновнаяСхемаКомпоновкиДанных. - Сохраните файл с расширением
.erf. Открыть его в пользовательском режиме можно черезФайл → Открыть.
Отчёт в конфигурации
В дереве метаданных: ветка Отчеты → «Добавить» → закладка «Основные» → та же кнопка «Открыть схему компоновки данных». После правки нужно обновить конфигурацию
базы данных.
Если конфигурация типовая и стоит на поддержке, не правьте её напрямую. Сделайте внешний отчёт или расширение — иначе следующее обновление превратится в ручное сравнение и объединение.
Набор данных
В открывшемся редакторе схемы на закладке Наборы данных нажмите зелёный плюс → «Добавить набор данных - запрос». Запрос можно набрать вручную или собрать конструктором. Пример для регистра продаж:
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
Продажи.Период КАК Период,
Продажи.КоличествоОборот КАК Количество,
Продажи.СуммаОборот КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Месяц, ) КАК Продажи
Имена регистра и его измерений зависят от конфигурации: откройте конструктор запроса и посмотрите, какие поля есть у вашего регистра. Флажок «Автозаполнение» оставьте включённым — схема сама создаст поля набора и параметры НачалоПериода и КонецПериода.
💡 Поле Период в оборотной таблице с периодичностью Месяц уже содержит начало месяца. Именно оно и станет заголовками колонок.
Структура таблицы в СКД: строки, колонки и поля
Это главный шаг. Перейдите на закладку Настройки. Есть два пути: мастер и ручная сборка.
Через конструктор настроек
На закладке Настройки нажмите кнопку с волшебной палочкой — «Открыть конструктор настроек». Выберите тип отчёта «Таблица», затем отметьте поля. Мастер спросит, какие поля пойдут в строки, какие в колонки, какие будут ресурсами. Для учебного примера мастер удобен, но результат всё равно придётся донастроить руками.
Вручную
- В дереве структуры (верхняя часть закладки
Настройки) щёлкните правой кнопкой по корневому узлу «Отчет». - Выберите «Новая таблица». Появится элемент «Таблица» с двумя узлами: «Строки» и «Колонки».
- Правой кнопкой по «Строки» → «Новая группировка» → поле
Номенклатура. - Правой кнопкой по «Колонки» → «Новая группировка» → поле
Период. В колонке «Тип дополнения» выберитеМесяц, если хотите видеть месяцы без продаж. - На закладке
Выбранные поля(нижняя часть) добавьтеКоличествоиСумма.
Если в строках нужна вложенность, добавьте вторую группировку внутрь первой: правой кнопкой по группировке Номенклатура → «Новая группировка» → например, Контрагент. Получится дерево «товар → покупатель».
Ресурсы — что считается в ячейках
Откройте закладку Ресурсы. Перенесите туда поля Количество и Сумма (двойной щелчок или кнопка «»»). По умолчанию выражение — Сумма(Сумма), то есть сложение по всем записям группы.
| Задача | Выражение ресурса |
|---|---|
| 📊 Сумма продаж | Сумма(Сумма) |
| 🔢 Число разных покупателей | Количество(Различные Контрагент) |
| 📈 Максимальная разовая сумма | Максимум(Сумма) |
| 💰 Средняя цена | ВЫБОР КОГДА Сумма(Количество) = 0 ТОГДА 0 ИНАЧЕ Сумма(Сумма) / Сумма(Количество) КОНЕЦ |
Средняя цена — показательный пример. Её нельзя считать как Среднее(Цена): это будет среднее по строкам, а не взвешенное по количеству. Отношение сумм даёт правильную цифру и в итогах, и в ячейках.
Поля, которые не стали ресурсами, СКД считает измерениями. Их можно ставить в группировки. Ресурсы в группировки не ставят — только в выбранные поля.
Отборы и условия: какие данные попадут в таблицу
Ограничить данные можно на трёх уровнях. От выбора зависят и удобство, и скорость.
| Где | Как задаётся | Когда подходит |
|---|---|---|
| Запрос | ГДЕ в тексте запроса | Условие постоянное, пользователь его не меняет |
| Отбор настроек | Закладка Отбор | Пользователь сам выбирает склад, товар, контрагента |
| Отбор элемента структуры | Выделить таблицу или группировку → её Отбор | Условие касается только одной таблицы в отчёте |
Отбор на закладке настроек
- На закладке
Настройкивыделите корневой узел «Отчет». - Внизу откройте закладку
Отбор, добавьте полеНоменклатура. - Вид сравнения — например, «В группе». Значение пока можно не заполнять.
- Чтобы пользователь видел отбор прямо на форме, откройте свойства элемента пользовательских настроек (кнопка с шестерёнкой в строке отбора) и установите режим редактирования «Быстрый доступ».
💡 Отбор по измерению виртуальной таблицы СКД при автозаполнении сама переносит в параметры этой таблицы. Поэтому не пишите ГДЕ Номенклатура В (&Список) ради скорости — отбор настроек сделает то же и останется гибким.
Фигурные скобки в запросе
Если автозаполнение выключено, доступные для отбора поля перечисляют в разделе {ВЫБРАТЬ …}, а условия — в {ГДЕ …}. Блок в фигурных скобках СКД применяет, только если пользователь задал отбор. Для первой таблицы эта техника не нужна, но в чужих отчётах она встречается часто, и знать её стоит.
Параметры и вычисляемые поля в табличном отчёте
Период одним полем
Два отдельных поля «Начало» и «Конец» неудобны. Сделайте общий параметр:
- Закладка
Параметры→ добавить параметрПериод, типСтандартныйПериод. - У параметра
НачалоПериодав колонке «Выражение» напишите&Период.ДатаНачала, уКонецПериода—&Период.ДатаОкончания. - У обоих параметров снимите флажок «Доступен» (колонка ограничения доступности), чтобы пользователь видел только
Период. - На закладке
Настройки→ПараметрывключитеПериоди вынесите в быстрый доступ.
Задать параметр из кода, например перед программным формированием:
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период", Новый СтандартныйПериод(ВариантСтандартногоПериода.ЭтотГод));
Вычисляемые поля
Закладка Вычисляемые поля нужна, когда значения нет в запросе, но его можно получить из других полей. Пример — наценка в процентах при наличии полей Сумма и Себестоимость:
ВЫБОР КОГДА Себестоимость = 0 ТОГДА 0 ИНАЧЕ (Сумма - Себестоимость) / Себестоимость * 100 КОНЕЦ
Вычисляемое поле считается по каждой записи. Если нужна наценка на уровне группы и в итогах, добавьте ресурс с тем же выражением, но через Сумма(Сумма) и Сумма(Себестоимость). Иначе итог сложит проценты строк, а это бессмыслица.
Правило выбора простое:
- 🔹 значение для каждой записи и группировки по нему — вычисляемое поле;
- 🔹 число в ячейке таблицы и в итогах — ресурс;
- 🔹 то, что можно сразу посчитать запросом, — лучше в запросе.
Оформление таблицы и условное форматирование
Параметры вывода
На закладке Настройки выделите узел «Отчет» и откройте внизу Другие настройки (параметры вывода). Для таблицы чаще всего меняют:
- 📐 «Расположение итогов» — сверху, снизу или без итогов по группировкам;
- 📐 «Расположение общих итогов по вертикали» и «…по горизонтали» — где выводить строку и колонку «Итого»;
- 📐 «Расположение полей группировок» — отдельно или в одной колонке с отступом, это влияет на ширину;
- 🎨 «Макет оформления» — готовая цветовая схема шапки и итогов;
- 🏷 «Заголовок» и «Выводить заголовок» — название над таблицей.
Если таблиц в отчёте несколько, те же параметры можно задать у отдельной таблицы: выделите её в структуре, и внизу появятся её собственные настройки.
Формат чисел
Чтобы суммы выглядели как 1 250 000,00, откройте закладку Условное оформление, добавьте элемент без отбора, в поле «Оформление» задайте параметр «Формат» со значением ЧДЦ=2, а в «Оформляемые поля» укажите Сумма. Для количества подойдёт ЧДЦ=0, для пустых значений — ЧН=0 или ЧН=-.
Подсветка по условию
Пример: красный фон, если сумма за месяц отрицательная (возвраты перекрыли продажи).
- Закладка
Условное оформление→ «Добавить». - В «Оформление» включите «Цвет фона» и выберите цвет.
- В «Условие» добавьте отбор
Сумма Меньше 0. - В «Оформляемые поля» укажите
Сумма. Если поле не указать, подсветится вся строка.
Условное оформление работает и в ячейках на пересечении строк и колонок. Его же пользователь может менять сам, если вы включили для элемента быстрый или обычный доступ.
Вывод таблицы из кода
Иногда таблицу нужно получить программно: показать в своей форме, отправить по почте или обработать дальше. Минимальный рабочий фрагмент для серверного кода модуля отчёта:
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = Схема.НастройкиПоУмолчанию;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(МакетКомпоновки);
ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(Процессор);
Если отчёт открывает пользователь через стандартную форму, этот код не нужен: форма сама собирает настройки, включая пользовательские.
Частые ошибки и скорость табличного отчёта
Что замедляет таблицу
- 🐢 Пустой период. Без ограничения дат отчёт читает регистр за все годы. Сделайте параметр
Периодобязательным или задайте значение по умолчанию. - 🐢 Дополнение периодов на большом интервале. Тип дополнения
Деньза три года — это больше тысячи колонок. Для длинных интервалов берите месяц или квартал. - 🐢 Детальные записи в строках. Группировка «Детальные записи» внутри таблицы выводит каждую запись регистра. На миллионах строк форма зависнет. Оставляйте её только для расшифровки.
- 🐢 Разыменование через точку. Поля вида
Номенклатура.Родитель.Родительв группировках добавляют соединения. Если такое поле нужно всегда, получите его в запросе. - 🐢 Условия в
ГДЕпосле виртуальной таблицы. Ставьте отбор по измерениям в параметры виртуальной таблицы, а лучше — через отбор настроек, который СКД перенесёт туда сама.
Проверять скорость стоит на рабочей копии базы с реальным объёмом данных. На демобазе всё летает, а у пользователя с базой за пять лет тот же отчёт строится минуту.
Частые вопросы
Чем «Таблица» в структуре отличается от «Группировки»?
Можно ли в одном отчёте вывести две таблицы?
Как убрать колонку «Итого» справа?
Как получить результат СКД в таблицу значений, а не в табличный документ?
КомпоновщикМакета.Выполнить пятым параметром Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений") и выводите через ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений. Табличную структуру с колонками при этом лучше заменить группировками.