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

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

Часто разработчики 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) не активны. Однако СКД в реальном отчете всегда учитывает права текущего пользователя. В качестве альтернативного решения для обхода этих ограничений можно использовать инструмент для выполнения отчета СКД в привилегированном режиме.

Если в системе настроены ограничения доступа (например, по организациям или подразделениям), запрос без ключевого слова РАЗРЕШЕННЫЕ может вернуть пустой результат или вызвать ошибку, если у пользователя нет прав на чтение хотя бы одной записи из выборки. Рассмотрим правильное использование:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ОборотыБюджетовОбороты.Подразделение,
    ОборотыБюджетовОбороты.СуммаУпрОборот
ИЗ
    РегистрНакопления.ОборотыБюджетов.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ОборотыБюджетовОбороты

Использование РАЗРЕШЕННЫЕ велит системе просто исключить из результата те записи, на которые у пользователя нет прав, вместо того чтобы блокировать весь запрос целиком.

Механизм автозаполнения и кэширование настроек

Иногда даже после внесения правок в запрос данные в отчете не появляются. Посмотрим на возможные причины:

  1. Флаг "Автозаполнение": Если этот флаг включен в наборе данных запроса, СКД сама анализирует доступные поля. Если вы вручную меняете параметры в тексте запроса, но не обновляете их в настройках схемы, может возникнуть конфликт имен.
  2. Сохраненные настройки пользователя: Это одна из самых частых причин "неработающих" отчетов. 1С сохраняет вариант отчета, выбранный пользователем ранее. Если вы изменили структуру запроса (добавили поля или изменили параметры), старые настройки в режиме "1С:Предприятие" могут затирать новые параметры. Решение: всегда сбрасывайте настройки на стандартные (Еще -> Установить стандартные настройки) после изменения схемы СКД.
  3. Типы данных и ЕСТЬNULL: СКД строго относится к типам. Если вы используете агрегатные функции (Сумма, Количество) в ресурсах, убедитесь, что в запросе обработаны пустые значения. Используйте ЕСТЬNULL(Поле, 0), чтобы избежать проблем при расчете итогов.

Различие в порядке параметров

Разберем интересный момент, упомянутый в обсуждении: порядок параметров в консоли запросов. В некоторых консолях параметры сортируются по алфавиту. Разработчик может привыкнуть вводить сначала Начало, потом Конец, но если в списке они поменялись местами (например, из-за именования), можно случайно передать дату начала в параметр конца и наоборот. СКД же четко привязана к именам и типам, заданным в схеме. Всегда проверяйте вкладку "Параметры" в компоновщике, чтобы убедиться, что значения передаются в правильные переменные.

Итоги и рекомендации

Для того чтобы запрос в СКД работал так же стабильно, как в консоли, придерживайтесь следующих правил:

Соблюдение этих шагов позволит избежать большинства типичных ошибок при разработке отчетов любой сложности.

← На главную