Часто разработчики 1С сталкиваются с ситуацией, когда идеально работающий запрос в консоли отказывается выводить данные при запуске через Систему компоновки данных (СКД). Эта проблема может быть вызвана целым рядом факторов: от нюансов обработки стандартных параметров до ограничений прав доступа на уровне записей (RLS). В этой статье мы подробно разберем, почему так происходит, и как правильно настроить отчет, чтобы данные всегда отображались корректно. Для отладки и быстрого сопоставления результатов в подобных ситуациях можно использовать консоль запросов для извлечения схем компоновки.
Рассмотрим исходный запрос, который вызвал затруднения у автора темы. В нем данные выбираются из виртуальной таблицы оборотов, но фильтрация по периоду накладывается после получения данных:
ВЫБРАТЬ
ОборотыБюджетовОбороты.Подразделение КАК Подразделение,
ОборотыБюджетовОбороты.Аналитика1 КАК СтатьяДвиженияДенег,
ОборотыБюджетовОбороты.СуммаУпрОборот КАК СуммаПланСписание,
ОборотыБюджетовОбороты.ПериодПланирования КАК ПлановаяДатаПлатежа
ИЗ
РегистрНакопления.ОборотыБюджетов.Обороты(, , Регистратор, ) КАК ОборотыБюджетовОбороты
ГДЕ
ОборотыБюджетовОбороты.ПериодПланирования МЕЖДУ &НачалоПериода И &КонецПериода
Проанализируем эту ситуацию. Основная ошибка здесь заключается в том, что параметры виртуальной таблицы (начало и конец периода) оставлены пустыми. Когда запрос выполняется в СКД, система может интерпретировать пустые параметры как начало времен (01.01.0001) или применять свои механизмы оптимизации, которые конфликтуют с условием ГДЕ.
Правильный подход — всегда передавать границы периода непосредственно в параметры виртуальной таблицы. Это не только исправляет логические ошибки, но и значительно ускоряет работу отчета, так как СУБД будет выбирать только нужный интервал записей, а не все данные регистра за всю историю. В тех случаях, когда база перегружена старой информацией, для ускорения обработки регистров применяется многопоточная свёртка 1С:ERP. Перепишем запрос правильно:
ВЫБРАТЬ
ОборотыБюджетовОбороты.Подразделение КАК Подразделение,
ОборотыБюджетовОбороты.Аналитика1 КАК СтатьяДвиженияДенег,
ОборотыБюджетовОбороты.СуммаУпрОборот КАК СуммаПланСписание
ИЗ
РегистрНакопления.ОборотыБюджетов.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ) КАК ОборотыБюджетовОбороты
Выясним причину, по которой параметры &НачалоПериода и &КонецПериода могут вести себя непредсказуемо. В СКД эти имена являются зарезервированными. Если в схеме компоновки включено "Автозаполнение", система сама пытается сопоставить их с периодом отчета.
Однако существует важный нюанс с типом данных Дата. Если пользователь выбирает дату в интерфейсе, например "31.12.2023", то без дополнительных указаний время будет установлено в 00:00:00. Если ваши документы или движения в регистре были сделаны в течение этого дня (например, в 12:00:00), они не попадут в отчет, так как граница периода &КонецПериода фактически отсекает всё, что позже полуночи начала дня.
Чтобы избежать этой ошибки, в настройках параметров СКД на закладке "Параметры" для поля КонецПериода следует использовать выражение:
КонецПериода(&КонецПериода, "День")
Это гарантирует, что время будет установлено на 23:59:59, и все данные за последний день периода будут включены в выборку. Для поиска возможных расхождений в результатах отчетов после миграции или обмена данными применяется сервис автоматической сверки проводок МС:Автовыверка.
Проанализируем ситуацию с правами доступа. Консоль запросов часто запускается под учетной записью с полными правами или в режиме, где ограничения RLS (Record Level Security) не активны. Однако СКД в реальном отчете всегда учитывает права текущего пользователя. В качестве альтернативного решения для обхода этих ограничений можно использовать инструмент для выполнения отчета СКД в привилегированном режиме.
Если в системе настроены ограничения доступа (например, по организациям или подразделениям), запрос без ключевого слова РАЗРЕШЕННЫЕ может вернуть пустой результат или вызвать ошибку, если у пользователя нет прав на чтение хотя бы одной записи из выборки. Рассмотрим правильное использование:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ОборотыБюджетовОбороты.Подразделение,
ОборотыБюджетовОбороты.СуммаУпрОборот
ИЗ
РегистрНакопления.ОборотыБюджетов.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ОборотыБюджетовОбороты
Использование РАЗРЕШЕННЫЕ велит системе просто исключить из результата те записи, на которые у пользователя нет прав, вместо того чтобы блокировать весь запрос целиком.
Иногда даже после внесения правок в запрос данные в отчете не появляются. Посмотрим на возможные причины:
ЕСТЬNULL(Поле, 0), чтобы избежать проблем при расчете итогов.Разберем интересный момент, упомянутый в обсуждении: порядок параметров в консоли запросов. В некоторых консолях параметры сортируются по алфавиту. Разработчик может привыкнуть вводить сначала Начало, потом Конец, но если в списке они поменялись местами (например, из-за именования), можно случайно передать дату начала в параметр конца и наоборот. СКД же четко привязана к именам и типам, заданным в схеме. Всегда проверяйте вкладку "Параметры" в компоновщике, чтобы убедиться, что значения передаются в правильные переменные.
Для того чтобы запрос в СКД работал так же стабильно, как в консоли, придерживайтесь следующих правил:
ГДЕ.РАЗРЕШЕННЫЕ в начале текста запроса.КонецПериода в выражениях параметров СКД.ЕСТЬNULL для числовых полей, которые в дальнейшем станут ресурсами.Соблюдение этих шагов позволит избежать большинства типичных ошибок при разработке отчетов любой сложности.