Разработка отчетов в системе компоновки данных (СКД) часто сопряжена с нюансами работы пакетов запросов и виртуальных таблиц. Типичная ситуация: программист добавляет поле в запрос, но оно не отображается в отчете или по нему не срабатывает группировка. Особенно это актуально для сложных аналитических отчетов, таких как «Потерянные клиенты» в конфигурации 1С:Управление торговлей 11.5. В этой статье мы подробно разберем, как правильно выстроить архитектуру такого отчета, чтобы все поля выводились корректно.
Прежде чем приступать к настройке полей в СКД, проанализируем, откуда мы берем данные. Одной из главных ошибок при работе с УТ 11.5 является прямое обращение к документам РеализацияТоваровУслуг. Рассмотрим, почему это неэффективно:
Для корректного построения отчета по продажам и клиентам мы рекомендуем использовать регистр накопления ВыручкаИСебестоимостьПродаж. В этом регистре измерение Организация является базовым, что гарантирует корректную работу всех стандартных механизмов группировки.
Часто в СКД используется не один запрос, а пакет запросов с созданием временных таблиц (ВТ). Это удобно для реализации сложной логики (например, сравнение периодов). Однако здесь кроется главная техническая причина проблемы: если поле есть во временной таблице, но оно не выбрано в финальном запросе пакета, СКД его «не увидит».
Проанализируем структуру правильного пакета запросов для поиска потерянных клиентов:
Запрос 1: Получение клиентов прошлого периода (Базовый период)
ВЫБРАТЬ
ПродажиОбороты.Организация КАК Организация,
ПродажиОбороты.АналитикаУчетаПоПартнерам.Партнер КАК Партнер,
СУММА(ПродажиОбороты.СуммаВыручкиОборот) КАК СуммаПрошлогоПериода
ПОМЕСТИТЬ ВТ_ПрошлыйПериод
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПрошлогоПериода, &КонецПрошлогоПериода, , ) КАК ПродажиОбороты
СГРУППИРОВАТЬ ПО
ПродажиОбороты.Организация,
ПродажиОбороты.АналитикаУчетаПоПартнерам.Партнер
;
Запрос 2: Получение клиентов текущего периода
ВЫБРАТЬ
ПродажиОбороты.АналитикаУчетаПоПартнерам.Партнер КАК Партнер
ПОМЕСТИТЬ ВТ_ТекущийПериод
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоТекущегоПериода, &КонецТекущегоПериода, , ) КАК ПродажиОбороты
СГРУППИРОВАТЬ ПО
ПродажиОбороты.АналитикаУчетаПоПартнерам.Партнер
;
Запрос 3: Итоговый выбор (Где чаще всего совершается ошибка)
Выясним причину, почему группировка не работает. В итоговом запросе необходимо явно выбрать поле Организация из временной таблицы. Если вы просто сделаете соединение по партнеру, но забудете пробросить организацию в список ВЫБРАТЬ, поле будет недоступно для настроек СКД.
ВЫБРАТЬ
ВТ_ПрошлыйПериод.Организация КАК Организация,
ВТ_ПрошлыйПериод.Партнер КАК Партнер,
ВТ_ПрошлыйПериод.СуммаПрошлогоПериода КАК СуммаПрошлогоПериода
ИЗ
ВТ_ПрошлыйПериод КАК ВТ_ПрошлыйПериод
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ТекущийПериод КАК ВТ_ТекущийПериод
ПО ВТ_ПрошлыйПериод.Партнер = ВТ_ТекущийПериод.Партнер
ГДЕ
ВТ_ТекущийПериод.Партнер ЕСТЬ NULL
Рассмотрим подробнее логику ЛЕВОГО СОЕДИНЕНИЯ. Чтобы найти «потерянных» клиентов, мы берем всех, кто совершал покупки в прошлом периоде (левая таблица), и пытаемся сопоставить их с теми, кто покупал в текущем (правая таблица). Условие ГДЕ ВТ_ТекущийПериод.Партнер ЕСТЬ NULL отфильтрует только тех, кто был в прошлом, но отсутствует в текущем.
Важный нюанс: Поле Организация должно браться именно из таблицы прошлого периода. Если вы попытаетесь взять его из текущего периода (где продаж не было), СКД вернет значение NULL, и группировка в отчете будет пустой или схлопнется в одну строку.
После того как запрос написан правильно, перейдем к настройкам схемы компоновки данных. Выполним следующие шаги:
Организация заполнена колонка «Роль». Для него должно быть указано, что это Измерение. Это позволит СКД правильно рассчитывать итоги.Организация. Все остальные поля (Партнер, Сумма) должны находиться внутри этой группировки (как детальные записи или вложенные группировки).Организация добавлена в список выбранных полей на уровне группировки. Если поле добавлено только в итоговый отчет, но не в саму группировку, оно может не отображаться в заголовке.Проанализируем ситуацию, когда в базе появляется вторая организация. Если отчет внезапно перестал выводить данные, проверьте параметры и фильтры:
Партнеру, но и по Организации. Без этого фильтрация по организации на уровне отчета будет работать некорректно.Таким образом, для успешного вывода организации в отчете СКД необходимо соблюсти три условия: наличие поля в финальной выборке пакета запросов, использование правильного источника данных (регистр накопления) и корректная иерархия группировок в настройках компоновки.