Как в одном отчете СКД объединить данные без периодов с данными по периодам

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

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

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

Способ 1. Использование «пустого» периода в объединении (UNION ALL)

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

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

Проанализируем структуру запроса:


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

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

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

Что мы здесь сделали? Мы привели оба запроса к общему списку полей. Там, где данных о периоде нет, мы подставили пустую дату. Теперь перейдем к настройкам СКД:

  1. На вкладке Настройки создадим структуру типа «Таблица».
  2. В Строки добавим группировку по полю Номенклатура.
  3. В Колонки добавим группировку по полю Период.
  4. В Выбранные поля таблицы добавим наши ресурсы ПолеОстаток и ПолеОборот.

Результат: СКД создаст колонку для каждой даты, где будет заполнен «ПолеОборот». Также появится отдельная колонка для даты 01.01.0001 (пустой даты), где будет выведен «ПолеОстаток». Чтобы заголовок «01.01.0001» не пугал пользователя, на вкладке «Наборы данных» для поля Период можно задать оформление или использовать функцию ЕСТЬNULL(Период, "Общий итог"), однако лучше всего в настройках группировки колонки по периоду установить параметр «Игнорировать значения NULL» или задать представление.

Способ 2. Связь двух наборов данных (DataSets)

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

Разберем этот вариант подробнее:

НаборДанных1 (Статичный): Выбирает номенклатуру и общие показатели.

НаборДанных2 (Периодический): Выбирает номенклатуру, период (день) и обороты.

Для корректной работы нам необходимо настроить Связи наборов данных:

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

Способ 3. Управление расположением полей в структуре таблицы

Выясним, как вывести данные так, чтобы одна колонка была статичной, а другие — динамическими, не прибегая к сложным манипуляциям с NULL. В настройках СКД (вкладка «Настройки») можно управлять иерархией полей в колонках таблицы.

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

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

Функция ВычислитьВыражение для сложных расчетов

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

Например, в поле ресурса можно написать:

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

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

Настройка ролей полей периода

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

Для периодических данных из регистра оборотов убедитесь, что:

  1. У поля Период стоит роль «Период».
  2. Указан соответствующий уровень (например, 1).
  3. Если это поле «День», тип должен соответствовать дате.

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

Практические советы по оформлению

Рассмотрим несколько хитростей, которые сделают ваш отчет профессиональным:

1. Игнорирование пустых значений: Чтобы в колонках, где нет движений, не отображались нули или пустые места (что важно при объединении через UNION ALL), в настройках ресурса (вкладка «Ресурсы») используйте условие ЕстьNULL(Сумма(Ресурс), 0) или снимите галочку в настройках отчета «Выводить пустые значения».

2. Заголовки: Если вы используете Способ 3 (разные группировки в колонках), обязательно задайте понятные «Имена» для группировок на вкладке «Дополнительные настройки», чтобы пользователь понимал, где заканчиваются общие данные и начинаются ежедневные обороты.

3. Использование характеристик: Если данные без периодов — это свойства номенклатуры (например, «Цена» или «Минимальный остаток»), лучше выводить их не как ресурсы, а как обычные поля в строках рядом с наименованием номенклатуры. Это сэкономит место в горизонтальной плоскости отчета.

Таким образом, мы разобрали три основных подхода. Выбор метода зависит от сложности ваших запросов: UNION ALL идеален для простых отчетов на одном наборе данных, а разделение группировок в колонках — для тех случаев, когда нужно строгое визуальное разделение показателей.

← На главную