Как в СКД вывести данные за два периода в соседние колонки?

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

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

Способ 1: Использование объединения в запросе (UNION ALL)

Это один из самых прямолинейных методов, который предложили участники форума. Его суть заключается в том, чтобы подготовить данные еще на уровне SQL-запроса. Мы выбираем данные дважды: первый раз за первый период, второй раз — за второй. Чтобы СКД могла их разделить, мы добавляем искусственное поле-маркер.

Рассмотрим пример запроса для регистра бухгалтерии:


ВЫБРАТЬ
    "Период 1" КАК НазваниеПериода,
    ХозрасчетныйОбороты.Счет КАК Счет,
    ХозрасчетныйОбороты.СуммаОборотДт КАК Сумма
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&Начало1, &Конец1, , , , , , ) КАК ХозрасчетныйОбороты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Период 2",
    ХозрасчетныйОбороты.Счет,
    ХозрасчетныйОбороты.СуммаОборотДт
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&Начало2, &Конец2, , , , , , ) КАК ХозрасчетныйОбороты

Разберем, что мы сделали. Мы создали поле НазваниеПериода, которое принимает строковое значение. Теперь в настройках СКД на вкладке «Настройки» нам достаточно добавить таблицу, где в Строки мы выберем Счет, а в Колонки — наше поле НазваниеПериода. Система автоматически создаст две колонки («Период 1» и «Период 2») и распределит суммы по ним.

Способ 2: Настройка кросс-таблицы без изменения запроса

Если данные в вашем запросе уже содержат поле Период (например, с периодичностью «Месяц»), вам не обязательно использовать объединение. Мы можем воспользоваться мощью встроенных инструментов группировки.

Выполним следующие шаги:

  1. Перейдем на вкладку Настройки в схеме компоновки данных.
  2. В иерархии настроек нажмем правую кнопку мыши и выберем Новая таблица.
  3. В секцию Строки добавим нужную нам аналитику (например, Контрагент или Номенклатура).
  4. В секцию Колонки добавим поле Период.

Чтобы колонки выглядели красиво, в поле Период можно настроить формат (например, «ДФ=MMMM yyyy»), тогда заголовки колонок будут содержать названия месяцев. Этот способ идеален, если периодов может быть больше двух (динамическое количество колонок).

Способ 3: Горизонтальное расположение группировок

Бывают ситуации, когда нам нужно вывести две совершенно разные группировки рядом друг с другом, и они не связаны единым полем периода. В этом случае проанализируем настройки расположения группировок.

Рассмотрим алгоритм настройки:

  1. Создадим общую группировку (без указания поля, просто «Детальные записи» или пустая группировка).
  2. Внутри этой группировки создадим две подгруппировки. Например, первая будет выводить данные по «Основному складу», а вторая по «Удаленному складу».
  3. Выделим родительскую (общую) группировку и перейдем на вкладку Дополнительные настройки.
  4. Найдем параметр Расположение группировок и установим значение Горизонтально.

Важный момент: При таком подходе система выведет первую группу данных, а сразу справа от неё — вторую. Это позволяет визуально «склеить» две разные части отчета в одну строку.

Способ 4: Использование функции «ВычислитьВыражение»

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

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

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

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

Способ 5: Связи наборов данных

Рассмотрим еще одну ситуацию: данные за разные периоды хранятся в разных регистрах или требуют разных условий отбора. В этом случае создадим два набора данных: НаборДанныхТекущий и НаборДанныхПрошлый.

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

  1. В каждом наборе прописываем свой запрос с параметрами (например, &Начало1 и &Начало2).
  2. На вкладке Связи наборов данных связываем их по ключевому полю, например, по Номенклатуре.
  3. Указываем НаборДанныхТекущий как источник связи, а НаборДанныхПрошлый как приемник.

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

Рекомендации по оформлению

При выводе данных в две колонки за разные периоды легко запутаться в цифрах. Чтобы сделать отчет читаемым, рекомендуем использовать Условное оформление:

Подводя итог, выбор метода зависит от сложности вашего запроса. Если вам нужно простое сравнение — используйте Объединение или Горизонтальные группировки. Если же вы строите сложный аналитический отчет с динамическим выбором периодов — лучше всего подойдет Кросс-таблица или работа с Вычисляемыми полями.

← На главную