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