Как вывести график по дням и таблицу по месяцам в одном отчете СКД 1С?

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

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

Настройка периодичности в запросе: параметр «Авто»

Основная проблема, с которой сталкиваются разработчики при попытке получить разные периоды, заключается в неправильной настройке виртуальной таблицы оборотов. Чтобы СКД могла автоматически работать с любыми временными разрезами (день, неделя, месяц, год), мы используем параметр периодичности Авто.

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


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

Если мы просто установим параметр Авто, но попытаемся выбрать только Период, конструктор может выдать ошибку. Явное указание ПериодДень и ПериодМесяц гарантирует, что конструктор СКД автоматически назначит этим полям роли периодов.

Альтернативный подход: использование функции НАЧАЛОПЕРИОДА

Выясним причину, почему первый вариант иногда вызывает затруднения. Бывает, что использование Авто приводит к ошибкам из-за сбоя в настройках ролей СКД у начинающих разработчиков. Если вы столкнулись с такой ситуацией, применим более предсказуемый метод.

Мы можем установить базовую периодичность День в параметрах виртуальной таблицы, а месяц вычислить прямо в запросе с помощью встроенной функции НАЧАЛОПЕРИОДА. Разберем этот вариант:


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

При таком подходе в наборе данных гарантированно появятся два независимых поля для группировок, и мы избежим сложных конфликтов с авто-периодами.

Настройка ролей полей в СКД

Важный шаг, который нельзя пропустить! При извлечении нескольких периодов из виртуальной таблицы перейдем на вкладку Наборы данных в СКД и проверим колонку Роли.

Для полей времени должен быть обязательно указан тип Период и проставлен их иерархический номер. Например, для поля ПериодМесяц ставим номер 1, а для ПериодДень — 2. Если роли не настроены корректно, при формировании отчета СКД начнет многократно задваивать оборотные суммы.

Объединение графика и таблицы в структуре отчета

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

Рассмотрим по шагам, как создать параллельные группировки на корневом уровне отчета:

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

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

← На главную