Разработка отчетов на Системе компоновки данных (СКД) — это процесс, требующий внимательности не только к структуре запроса, но и к настройкам самой схемы. Часто возникает ситуация, когда запрос в консоли возвращает строки, а в итоговом отчете мы видим «белый лист». Или, что еще более коварно, запрос перестает возвращать данные из-за неочевидных условий соединения.
В этой статье мы подробно разберем ситуацию, когда отчет на базе документов планирования и регистров остатков не выводит данные, и проанализируем основные технические ошибки, допущенные в запросе.
Рассмотрим первый фрагмент запроса, где формируется временная таблица План. Проанализируем условие соединения табличной части и шапки документа:
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПланПроизводства КАК ПланПроизводства
ПО ПланПроизводстваСоставПлана.Ссылка = ПланПроизводства.Ссылка
И ПланПроизводстваСоставПлана.Источник = ПланПроизводства.Ссылка
Выясним, в чем здесь кроется подвох. Условие ПланПроизводстваСоставПлана.Источник = ПланПроизводства.Ссылка предполагает, что в каждой строке табличной части поле Источник заполнено ссылкой на сам этот документ. В типовых конфигурациях (например, 1С:ERP или 1С:КА) поле Источник обычно используется для указания документа-основания (другого плана или заказа) и часто бывает не заполнено (NULL), если план создавался вручную.
Решение: Если вам нужно просто получить данные из шапки документа (например, дату), достаточно соединения только по полю Ссылка. Проверьте содержимое поля Источник в консоли запросов. Если оно пустое, то условие соединения не выполняется, и ваша временная таблица План будет пустой.
В запросе используется соединение по периодам:
ВНУТРЕННЕЕ СОЕДИНЕНИЕ План КАК План
ПО ТоварыНаСкладахОстаткиИОбороты.Номенклатура = План.Номенклатура
И ТоварыНаСкладахОстаткиИОбороты.ПериодДень = План.ДатаПланирования
Проанализируем ситуацию с типом данных Дата в 1С. Поле ДатаПланирования в документе может содержать произвольное время (например, 15.10.2023 14:30:05). Виртуальная таблица ОстаткиИОбороты с периодичностью День всегда возвращает дату на начало дня (15.10.2023 00:00:00).
Важно: Для платформы 1С эти две даты не равны. В результате ВНУТРЕННЕЕ СОЕДИНЕНИЕ просто отсекает такие строки. Чтобы избежать этой ошибки, мы должны всегда приводить сравниваемые даты к началу периода.
Изменим запрос, используя функцию НАЧАЛОПЕРИОДА:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ПланПроизводства.ДатаПланирования, ДЕНЬ) КАК ДатаПланирования,
...
// И в условии соединения:
ПО ТоварыНаСкладахОстаткиИОбороты.ПериодДень = НАЧАЛОПЕРИОДА(План.ДатаПланирования, ДЕНЬ)
В финальном запросе мы видим ВНУТРЕННЕЕ СОЕДИНЕНИЕ между таблицами Склады (факт) и План (план). Это классическая архитектурная ошибка при построении отчетов «План-факт».
Рассмотрим, почему это приводит к пустым результатам:
Решение: Используйте ЛЕВОЕ СОЕДИНЕНИЕ (если приоритет — увидеть выполнение плана) или ПОЛНОЕ СОЕДИНЕНИЕ (чтобы увидеть и отклонения по плану, и излишки факта). Также обратите внимание на периодичность виртуальной таблицы ОстаткиИОбороты. Если установлена периодичность Авто, записи формируются только в те моменты, когда были обороты. Для план-фактного анализа лучше использовать фиксированную периодичность (День, Месяц).
В тексте запроса указаны параметры &НачалоПериода и &КонецПериода. В Системе компоновки данных существует встроенный механизм управления параметрами. Если вы не настроили их на вкладке «Параметры», СКД может передавать туда пустые значения или значения по умолчанию, которые не перекрывают нужный диапазон данных.
Посмотрим на настройки:
СтандартныйПериод). В этом случае в параметрах виртуальной таблицы лучше прописать &СтандартныйПериод.ДатаНачала и &СтандартныйПериод.ДатаОкончания.В запросе автора используется СУММА(КоличествоНачальныйОстаток). Для СКД это критично. Если вы группируете данные по периодам, простое суммирование остатков приведет к получению «астрономических» цифр, так как остаток на каждый день будет прибавляться к предыдущему.
Хотя это не влияет на «пустоту» отчета напрямую, это влияет на корректность вывода. Однако, если данные все же не выходят, проверьте вкладку «Наборы данных». Если для поля ПериодДень не установлена роль «Период», а для остатков — роли «Начальный остаток» и «Конечный остаток» с указанием соответствующих связей, СКД может запутаться в расчете итогов и вывести пустые ячейки при наличии детальных записей.
ПланПроизводстваСоставПлана.Источник = ПланПроизводства.Ссылка, заменив его на простое соединение по ссылке.НАЧАЛОПЕРИОДА(..., ДЕНЬ).ВНУТРЕННЕЕ СОЕДИНЕНИЕ на ЛЕВОЕ СОЕДИНЕНИЕ. Это позволит увидеть, какая часть данных «отваливается».Следуя этим шагам, мы сможем локализовать проблему и добиться корректного вывода данных в отчете СКД.