Почему отчет СКД выводит пустой результат при наличии данных в базе?

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

Разработка отчетов на Системе компоновки данных (СКД) — это процесс, требующий внимательности не только к структуре запроса, но и к настройкам самой схемы. Часто возникает ситуация, когда запрос в консоли возвращает строки, а в итоговом отчете мы видим «белый лист». Или, что еще более коварно, запрос перестает возвращать данные из-за неочевидных условий соединения.

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

Причина 1. Ошибка в условиях соединения: ловушка поля «Источник»

Рассмотрим первый фрагмент запроса, где формируется временная таблица План. Проанализируем условие соединения табличной части и шапки документа:


ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПланПроизводства КАК ПланПроизводства 
ПО ПланПроизводстваСоставПлана.Ссылка = ПланПроизводства.Ссылка 
И ПланПроизводстваСоставПлана.Источник = ПланПроизводства.Ссылка

Выясним, в чем здесь кроется подвох. Условие ПланПроизводстваСоставПлана.Источник = ПланПроизводства.Ссылка предполагает, что в каждой строке табличной части поле Источник заполнено ссылкой на сам этот документ. В типовых конфигурациях (например, 1С:ERP или 1С:КА) поле Источник обычно используется для указания документа-основания (другого плана или заказа) и часто бывает не заполнено (NULL), если план создавался вручную.

Решение: Если вам нужно просто получить данные из шапки документа (например, дату), достаточно соединения только по полю Ссылка. Проверьте содержимое поля Источник в консоли запросов. Если оно пустое, то условие соединения не выполняется, и ваша временная таблица План будет пустой.

Причина 2. Проблема сопоставления дат (время в дате)

В запросе используется соединение по периодам:


ВНУТРЕННЕЕ СОЕДИНЕНИЕ План КАК План 
ПО ТоварыНаСкладахОстаткиИОбороты.Номенклатура = План.Номенклатура 
И ТоварыНаСкладахОстаткиИОбороты.ПериодДень = План.ДатаПланирования

Проанализируем ситуацию с типом данных Дата в 1С. Поле ДатаПланирования в документе может содержать произвольное время (например, 15.10.2023 14:30:05). Виртуальная таблица ОстаткиИОбороты с периодичностью День всегда возвращает дату на начало дня (15.10.2023 00:00:00).

Важно: Для платформы 1С эти две даты не равны. В результате ВНУТРЕННЕЕ СОЕДИНЕНИЕ просто отсекает такие строки. Чтобы избежать этой ошибки, мы должны всегда приводить сравниваемые даты к началу периода.

Изменим запрос, используя функцию НАЧАЛОПЕРИОДА:


ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(ПланПроизводства.ДатаПланирования, ДЕНЬ) КАК ДатаПланирования,
    ...
// И в условии соединения:
ПО ТоварыНаСкладахОстаткиИОбороты.ПериодДень = НАЧАЛОПЕРИОДА(План.ДатаПланирования, ДЕНЬ)

Причина 3. Опасность использования внутреннего соединения

В финальном запросе мы видим ВНУТРЕННЕЕ СОЕДИНЕНИЕ между таблицами Склады (факт) и План (план). Это классическая архитектурная ошибка при построении отчетов «План-факт».

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

  1. Если по номенклатуре есть план, но за этот день не было движений по складу (и нет остатков), внутренняя связь удалит строку плана.
  2. Если по складу есть остатки, но на этот день не назначен план, внутренняя связь удалит строку факта.

Решение: Используйте ЛЕВОЕ СОЕДИНЕНИЕ (если приоритет — увидеть выполнение плана) или ПОЛНОЕ СОЕДИНЕНИЕ (чтобы увидеть и отклонения по плану, и излишки факта). Также обратите внимание на периодичность виртуальной таблицы ОстаткиИОбороты. Если установлена периодичность Авто, записи формируются только в те моменты, когда были обороты. Для план-фактного анализа лучше использовать фиксированную периодичность (День, Месяц).

Причина 4. Конфликт параметров СКД и виртуальных таблиц

В тексте запроса указаны параметры &НачалоПериода и &КонецПериода. В Системе компоновки данных существует встроенный механизм управления параметрами. Если вы не настроили их на вкладке «Параметры», СКД может передавать туда пустые значения или значения по умолчанию, которые не перекрывают нужный диапазон данных.

Посмотрим на настройки:

Причина 5. Роли полей и агрегатные функции

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

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

Итоговый чек-лист для исправления отчета:

  1. Упростите запрос: Выполните по отдельности каждую временную таблицу в консоли. Выясните, на каком этапе пропадают данные.
  2. Проверьте «Источник»: Уберите условие ПланПроизводстваСоставПлана.Источник = ПланПроизводства.Ссылка, заменив его на простое соединение по ссылке.
  3. Синхронизируйте время: Оберните все даты в соединениях функцией НАЧАЛОПЕРИОДА(..., ДЕНЬ).
  4. Смените тип соединения: Замените ВНУТРЕННЕЕ СОЕДИНЕНИЕ на ЛЕВОЕ СОЕДИНЕНИЕ. Это позволит увидеть, какая часть данных «отваливается».
  5. Проверьте RLS: Если под полными правами данные есть, а под пользователем — нет, проверьте ограничения доступа к документам планирования.

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

← На главную