При разработке отчетов на Системе компоновки данных (СКД) начинающие программисты часто сталкиваются с ситуацией, когда запрос, прекрасно работающий в консоли запросов, выдает пустой результат в самом отчете. Особенно часто это происходит при попытке внедрить удобный для пользователя механизм выбора дат — Стандартный период. Мы можем видеть параметры на форме, выбирать интервал, но данных в результате нет. Давайте подробно разберем, почему это происходит и как настроить отчет так, чтобы он работал корректно в любых условиях.
Первое, что нам необходимо понять: в СКД существует разница между параметрами, которые «понимает» ваш SQL-запрос (например, &НачалоПериода и &КонецПериода), и тем, что видит пользователь на форме (тип СтандартныйПериод). По умолчанию система не всегда может автоматически догадаться, как связать один сложный объект периода с двумя конкретными датами в запросе.
Рассмотрим стандартный запрос, который часто используется в таких случаях:
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка КАК Ссылка,
РеализацияТоваровУслуг.Дата КАК Дата
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Для того чтобы этот запрос заработал с интерфейсным полем выбора периода, нам нужно выполнить ручную привязку на закладке Параметры в конструкторе СКД. Проанализируем шаги настройки:
ПериодОтчета.СтандартныйПериод.&НачалоПериода и &КонецПериода установим флаг Ограничение доступности. Это скроет их от пользователя, чтобы он не путался, вводя даты дважды.Для параметра &НачалоПериода в колонке «Выражение» укажем:
&ПериодОтчета.ДатаНачала
Для параметра &КонецПериода укажем:
&ПериодОтчета.ДатаОкончания
После этого СКД при формировании отчета будет брать значения из выбранного пользователем периода и подставлять их в ваш запрос.
Даже после настройки связей мы можем заметить, что документы, созданные в последний день периода, не попадают в отчет. Выясним причину. В типе данных СтандартныйПериод дата окончания часто хранится как 00:00:00 последнего дня. Если пользователь выбрал период с 1 по 10 число, то условие МЕЖДУ превратится в «с 01.01.2023 00:00:00 по 10.01.2023 00:00:00». В итоге все документы за 10-е число, созданные после полуночи, будут проигнорированы.
Рассмотрим, как правильно обработать эту ситуацию прямо в настройках СКД. Нам поможет встроенная функция языка выражений СКД. Изменим выражение для параметра &КонецПериода:
КонецПериода(&ПериодОтчета.ДатаОкончания, "ДЕНЬ")
Это гарантирует нам, что время будет установлено на 23:59:59, и документы последнего дня будут включены в выборку. Аналогично, если мы хотим обезопасить себя от случайного ввода времени в начале периода, можно использовать НачалоПериода(&ПериодОтчета.ДатаНачала, "ДЕНЬ").
Если мы работаем не с простым запросом к таблице документов, а используем виртуальные таблицы (например, обороты регистров накопления), система СКД предоставляет еще более мощный механизм — фигурные скобки {}. Проанализируем пример:
ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
ПродажиОбороты.КоличествоОборот
ИЗ
РегистрНакопления.Продажи.Обороты({(&НачалоПериода)}, {(&КонецПериода)}, , ) КАК ПродажиОбороты
Фигурные скобки позволяют СКД интеллектуально управлять параметрами. Если пользователь не заполнит период, система просто не будет накладывать ограничение на виртуальную таблицу, что предотвратит получение пустого результата из-за пустых дат. Однако для обычных таблиц (документов или справочников) лучше использовать стандартное условие ГДЕ, если данные обязательно должны быть отфильтрованы по дате.
Иногда мы сталкиваемся с «магией»: настройки верные, код правильный, а отчет все равно пуст. Посмотрим на ситуацию со стороны платформы 1С. Система компоновки данных очень активно кэширует настройки. Если вы сначала создали отчет с ошибкой, запустили его в режиме «1С:Предприятие», а затем исправили схему в конфигураторе — старые (ошибочные) настройки могли сохраниться в вашей информационной базе.
Что нужно сделать:
Это заставит систему перечитать структуру параметров из новой схемы компоновки данных и сбросить привязки, которые могли «зависнуть» в пользовательском сеансе.
Проанализируем технический нюанс, специфичный для современных версий платформы (начиная с 8.3.14). В интерфейсе «Такси» поле стандартного периода может отображаться как пустое, даже если в конфигураторе заданы какие-то значения. Если параметр не инициализирован, СКД передает в запрос ПустаяДата (0001-01-01). Естественно, документов за первый год нашей эры в базе нет, и отчет получается пустым.
Рекомендация: всегда устанавливайте в схеме СКД значение параметра по умолчанию. Например, выберите «Этот месяц» или «Этот квартал». Это гарантирует, что при открытии отчета параметры всегда будут иметь валидные значения дат.
Если консоль запросов выдает данные, а отчет под тем же пользователем — нет, стоит проверить настройки RLS (Restriction Level Security). Механизм СКД при формировании итогового запроса автоматически добавляет условия проверки прав доступа. Если у пользователя нет прав на просмотр документов за определенный период или по определенному подразделению, СКД просто «молча» отсечет эти данные. Попробуйте запустить отчет под пользователем с полными правами, чтобы исключить этот фактор.
Подводя итог, можно сказать, что «магия» пустых отчетов в СКД всегда имеет под собой логическое объяснение. Тщательная проверка связи имен параметров, использование функций КонецПериода и обязательный сброс настроек до стандартных — это три кита, на которых держится стабильная работа любого отчета со стандартными периодами.