Часто при разработке отчетов в 1С возникает необходимость представить данные в разных разрезах времени на одной форме. Рассмотрим классическую задачу: у нас есть данные по продажам, и мы хотим вывести в одном отчете график динамики продаж по дням, а под ним разместить таблицу с суммами оборотов по месяцам для каждого товара. Проанализируем ситуацию и разберем по шагам, как правильно настроить запрос и Систему компоновки данных (СКД), чтобы получить нужный результат.
Основная проблема, с которой сталкиваются разработчики при попытке получить разные периоды, заключается в неправильной настройке виртуальной таблицы оборотов. Чтобы СКД могла автоматически работать с любыми временными разрезами (день, неделя, месяц, год), мы используем параметр периодичности Авто.
Посмотрим на пример правильного запроса. Обратите внимание, что при использовании Авто нам необходимо явно выбрать нужные поля периодов в тексте запроса, чтобы они появились в доступных полях СКД:
ВЫБРАТЬ
ПродажиОбороты.ПериодДень КАК ПериодДень,
ПродажиОбороты.ПериодМесяц КАК ПериодМесяц,
ПродажиОбороты.Покупатель КАК Покупатель,
ПродажиОбороты.Товар КАК Товар,
ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
ПродажиОбороты.СуммаОборот КАК СуммаОборот
ИЗ
РегистрНакопления.Продажи.Обороты(, , Авто, ) КАК ПродажиОбороты
Если мы просто установим параметр Авто, но попытаемся выбрать только Период, конструктор может выдать ошибку. Явное указание ПериодДень и ПериодМесяц гарантирует, что конструктор СКД автоматически назначит этим полям роли периодов.
Выясним причину, почему первый вариант иногда вызывает затруднения. Бывает, что использование Авто приводит к ошибкам из-за сбоя в настройках ролей СКД у начинающих разработчиков. Если вы столкнулись с такой ситуацией, применим более предсказуемый метод.
Мы можем установить базовую периодичность День в параметрах виртуальной таблицы, а месяц вычислить прямо в запросе с помощью встроенной функции НАЧАЛОПЕРИОДА. Разберем этот вариант:
ВЫБРАТЬ
ПродажиОбороты.ПериодДень КАК ПериодДень,
НАЧАЛОПЕРИОДА(ПродажиОбороты.ПериодДень, МЕСЯЦ) КАК ПериодМесяц,
ПродажиОбороты.Покупатель КАК Покупатель,
ПродажиОбороты.Товар КАК Товар,
ПродажиОбороты.СуммаОборот КАК СуммаОборот
ИЗ
РегистрНакопления.Продажи.Обороты(, , День, ) КАК ПродажиОбороты
При таком подходе в наборе данных гарантированно появятся два независимых поля для группировок, и мы избежим сложных конфликтов с авто-периодами.
Важный шаг, который нельзя пропустить! При извлечении нескольких периодов из виртуальной таблицы перейдем на вкладку Наборы данных в СКД и проверим колонку Роли.
Для полей времени должен быть обязательно указан тип Период и проставлен их иерархический номер. Например, для поля ПериодМесяц ставим номер 1, а для ПериодДень — 2. Если роли не настроены корректно, при формировании отчета СКД начнет многократно задваивать оборотные суммы.
Теперь перейдем к самому главному — визуальному выводу. Объединение двух разных блоков (графика и таблицы) в одном отчете делается не в тексте запроса, а на вкладке Настройки в СКД. По умолчанию создается одна структура вывода, но нам нужны независимые элементы.
Рассмотрим по шагам, как создать параллельные группировки на корневом уровне отчета:
ПериодДень (в Точки или Серии) и выведите нужный ресурс (например, СуммаОборот).Товар.ПериодМесяц. В выбранные поля выведите тот же ресурс СуммаОборот.В результате этих действий СКД скомпонует единый красивый документ. В его верхней части будет располагаться диаграмма, наглядно показывающая динамику по дням, а сразу под ней — детальная таблица с суммами по месяцам в разрезе каждого проданного товара. Таким образом, мы полностью решили поставленную задачу, используя штатные механизмы 1С.