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