Как в СКД вывести только последний месяц, сохранив итоги за весь период?

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

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

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

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

Способ 1. Использование локального отбора в группировке колонок (Рекомендуемый)

Это наиболее правильный и производительный метод для структуры отчета типа «Таблица» (кросс-таблица). Он основан на разделении контекста расчета ресурсов и визуального вывода данных.

Давайте разберем по шагам, как настроить такой отчет:

  1. Перейдем на вкладку Настройки нашей схемы компоновки данных.
  2. В структуре настроек отчета создадим Таблицу. В Строки таблицы добавим нужные нам группировки (например, Номенклатура или Контрагент), а в Колонки добавим группировку по периоду (например, ПериодМесяц).
  3. Выделим мышкой группировку колонок ПериодМесяц в дереве структуры отчета.
  4. В нижней части экрана перейдем на вкладку Отбор. Обратите внимание: это должен быть именно локальный отбор для выбранной группировки колонок, а не общий отбор всего отчета.
  5. Добавим новый элемент отбора: ПериодМесяц Равно &КонецПериода. Вместо параметра &КонецПериода можно использовать выражение, которое автоматически вычисляет дату начала последнего месяца периода.
  6. Важный нюанс: Чтобы параметр &КонецПериода стал доступен для выбора в локальном отборе группировки, перейдем на вкладку Параметры схемы СКД и убедимся, что для него снят флаг Ограничение доступности. Если этот флаг установлен, параметр будет скрыт из списка доступных полей компоновки.

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

Способ 2. Использование вычисляемых полей и разделения ресурсов (Для линейных отчетов)

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

Проанализируем этот подход по шагам:

  1. Перейдем на вкладку Вычисляемые поля в схеме компоновки данных.
  2. Добавим новое поле со следующими настройками:
    • Путь к данным: СуммаПоследнийМесяц
    • Выражение:
      
      Выбор Когда НачалоПериода(ПериодМесяц, "Месяц") = НачалоПериода(&КонецПериода, "Месяц") Тогда Сумма Иначе 0 Конец
      
    • Заголовок: Сумма за последний месяц
  3. Перейдем на вкладку Ресурсы.
  4. Определим два ресурса:
    • Для базового поля Сумма (которое будет отвечать за итог за весь период) укажем выражение: Сумма(Сумма). Назовем его заголовок на вкладке параметров как Итого за весь период.
    • Для нашего вычисляемого поля СуммаПоследнийМесяц укажем выражение: Сумма(СуммаПоследнийМесяц).
  5. В настройках отчета (в структуре «Список» или «Таблица» без группировки по месяцам в колонках) просто выведем эти два ресурса в выбранные поля.

Этот способ крайне надежен, работает быстро и исключает любые проблемы с выводом пустых колонок при экспорте отчета в сторонние форматы.

Способ 3. Визуальное скрытие колонок через «Условное оформление»

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

Рассмотрим, как настроить такое поведение системы:

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

Преимущества и недостатки метода: Данные по всем месяцам будут полноценно получены из СУБД, обработаны и корректно просуммированы в общих итогах. Колонки предыдущих месяцев физически останутся в результирующем табличном документе, но сожмутся до невидимого глазу размера в 0.1 символа. Главный минус метода — при сохранении или выгрузке отчета в формат Excel или HTML эти сверхтонкие колонки все равно будут присутствовать в файле, и пользователь сможет раздвинуть их вручную мышкой.

Способ 4. Принудительный расчет итогов через функцию ВычислитьВыражение

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

Выясним причину эффективности этого способа и настроим его:

Вкладка Ресурсы позволяет нам переопределить формулу расчета агрегатных функций. Вместо стандартного суммирования мы можем указать для ресурса СуммаВсего следующее выражение:

ВычислитьВыражение("Сумма(Сумма)", , "ОбщийИтог")

Рассмотрим параметры этой функции подробнее:

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

Резюме и рекомендации по выбору метода

Подводя итоги нашего анализа, сопоставим рассмотренные методы для выбора оптимального решения:

← На главную