Почему результат запроса в СКД отличается от результата в консоли запросов

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

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

Автоматическое управление параметрами виртуальных таблиц в СКД

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

Если в тексте запроса разработчик пытается наложить отбор по дополнительному реквизиту (например, по реквизиту документа ЖелаемаяДатаОтгрузки) и использует для этого стандартные имена параметров &НачалоПериода и &КонецПериода, компоновщик автоматически передаст эти значения в параметры самой виртуальной таблицы регистра. В результате виртуальная таблица сначала отсечет движения за пределами периода, а затем выполнит фильтрацию по условию ГДЕ, что приведет к искажению выборки по сравнению с прямым выполнением в консоли запросов.

Чтобы избежать нежелательного наложения параметров, разделим период виртуальной таблицы и параметры пользовательского фильтра по реквизиту:


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

Явное управление параметрами через расширение языка СКД

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

  1. Для виртуальной таблицы СрезПоследних передаем границу среза:

    РегистрСведений.ЦеныНоменклатуры.СрезПоследних({&ПериодСреза}, ) КАК Цены

  2. Для виртуальной таблицы Обороты явно указываем границы периода:

    РегистрНакопления.ЗаказыКлиентов.Обороты({(&НачалоПериода)}, {(&КонецПериода)}, Авто, ) КАК ЗаказыКлиентовОбороты

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

Особенности работы с границами дат и функциями выражений СКД

Частая ошибка при настройке параметров периода в СКД связана с неверным форматом конечной даты. Если пользователь выбирает дату окончания без времени (со значением 00:00:00), то движения за последний день периода полностью исключаются из отчета.

Разберем по шагам правильную настройку составного периода:

  1. Создаем пользовательский параметр &Период с типом СтандартныйПериод.
  2. Для системных параметров &НачалоПериода и &КонецПериода устанавливаем флаг Ограничение доступности, чтобы скрыть их из пользовательских настроек.
  3. В колонке Выражение для параметра &НачалоПериода указываем:

    &Период.ДатаНачала

  4. В колонке Выражение для параметра &КонецПериода прописываем стандартную функцию языка выражений СКД:

    КонецПериода(&Период.ДатаОкончания, "День")

Обратите внимание: функция КонецДня() относится к встроенному языку платформы и не поддерживается в языке выражений СКД. Попытка ее использования вызовет ошибку Функция КонецДня не найдена.

Влияние сохраненных пользовательских настроек и прав доступа (RLS)

Если запрос проверен в консоли компоновки данных и выдает верный результат, но во внешнем отчете данные по-прежнему отличаются, проанализируем следующие факторы:

  1. Кэш пользовательских настроек варианта отчета: платформа сохраняет настройки формы и параметров отчета в системном хранилище. При доработке схемы компоновки старые пользовательские настройки могут перекрывать новые выражения параметров. Для проверки сбросим настройки через меню Еще — Стандартные настройки.
  2. Ограничения на уровне записей (RLS): консоль запросов обычно запускается с полными правами или в привилегированном режиме, тогда как внешний отчет исполняется в контексте прав текущего пользователя. При включенном RLS платформа автоматически добавляет неявные условия отбора к таблицам базы данных.
← На главную