При разработке сложных отчетов на базе Системы компоновки данных (СКД), особенно в типовых конфигурациях вроде ЗУП 3.1, программисты часто сталкиваются с ситуацией, когда описанные в тексте запроса необязательные условия {ГДЕ ...} бесследно исчезают из итогового макета компоновки. Ситуация выглядит парадоксально: параметры заполнены, значения переданы, но фильтрация не применяется. Разберем подробно, почему это происходит и как исправить эту ошибку, связанную с механизмом СхемаЗапроса.
Для начала проанализируем, как работают фигурные скобки в языке запросов СКД. Конструкция {ГДЕ (Таблица.Поле <= &Параметр)} указывает компоновщику данных, что данное условие должно быть добавлено в итоговый запрос только в том случае, если параметр &Параметр или само поле задействованы в настройках отчета пользователем. Если СКД видит, что синтаксис внутри скобок нарушен или параметры не определены, она просто вырезает этот блок текста перед отправкой запроса в СУБД. Это штатное поведение системы, направленное на минимизацию текста запроса.
Рассмотрим основную причину проблемы. В современных конфигурациях на базе БСП (Библиотека стандартных подсистем) текст запроса редко остается статичным. Он часто дорабатывается программно с использованием объекта СхемаЗапроса. Проанализируем, что происходит при передаче текста СКД в этот объект:
СхемаЗапроса предназначен для работы со стандартным SQL-синтаксисом 1С, но он «плохо знаком» со специфическими расширениями языка СКД (фигурными скобками).{ГДЕ ...}. Если внутри условия находится выражение, которое кажется схеме «безымянным», она автоматически назначает ему псевдоним.СхемаЗапроса.ПолучитьТекстЗапроса() мы получаем конструкцию вида: {ГДЕ (Регистр.Период <= &КонецПериода) КАК Поле2}.Важный момент: наличие псевдонима КАК Поле2 внутри секции ГДЕ является синтаксической ошибкой для компоновщика данных. Видя некорректную конструкцию, СКД принимает решение полностью игнорировать этот блок условия, что и приводит к его отсутствию в итоговом макете.
Часто в отчетах используется параметр типа СтандартныйПериод. Мы настраиваем зависимые параметры, например, &КонецПериода, через выражения: &Период.ДатаОкончания. Рассмотрим, на что нужно обратить внимание при настройке схемы:
&КонецПериода установлено использование Авто, компоновщик может посчитать его неиспользуемым, если он не выведен в пользовательские настройки. Рекомендуется устанавливать значение Всегда для параметров, которые вычисляются программно или на основе других параметров.Ограничение доступности, но убедитесь, что флаг Включать в доступные поля установлен, если вы планируете использовать это поле в отборах.Если вы обнаружили, что условие пропадает из-за добавления лишних псевдонимов, выполните следующие действия:
Если невозможно отказаться от использования СхемаЗапроса, необходимо внедрить «пост-обработку» текста. После того как схема сформировала текст, следует программно удалить некорректные псевдонимы внутри фигурных скобок. Рассмотрим пример кода:
// Получаем текст из схемы
ТекстЗапроса = МояСхемаЗапроса.ПолучитьТекстЗапроса();
// Убираем псевдонимы, которые "сломали" условия компоновки
// Важно найти именно те вхождения, которые находятся внутри {}
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ") КАК Поле2}", ")}");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ") КАК Поле1}", ")}");
// Устанавливаем исправленный текст обратно в схему компоновки
СхемаКомпоновки.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса;
Для простых манипуляций с текстом (например, в отчете «Анализ начислений и удержаний») более надежным методом является обычная работа со строками. Рассмотрим, как можно внедрить условие через маркеры:
// В тексте запроса в конфигураторе пишем:
// //УСЛОВИЕ_ПЕРИОДА
ТекстЗапроса = СхемаКомпоновки.НаборыДанных.НаборДанных1.Запрос;
СтрокаУсловия = "{ГДЕ (ФизическаяТаблица.Период <= &КонецПериода)}";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//УСЛОВИЕ_ПЕРИОДА", СтрокаУсловия);
СхемаКомпоновки.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса;
Проанализируем состояние настроек перед компоновкой макета. Проверьте, что в объекте КомпоновщикНастроек.Настройки.ПараметрыДанных значение &КонецПериода действительно заполнено и флаг использования установлен в Истина. Если параметр заполнен, но в тексте макета условия нет — значит, причина именно в синтаксической ошибке, описанной выше.
В отчетах типа «Анализ начислений» структура запроса собирается динамически из множества фрагментов. Выясним причину конфликта: система объединяет данные по регистрам расчета и накопления. Если вы добавляете условие по полю Период, убедитесь, что вы используете правильный псевдоним таблицы. В таких отчетах эффективнее использовать расширения языка запросов для полей, а не параметров:
Вместо {ГДЕ Регистр.Период <= &КонецПериода} лучше использовать {ГДЕ (Регистр.Период >= &НачалоПериода, Регистр.Период <= &КонецПериода)}. Это позволит СКД корректно сопоставить границы периодов при объединении нескольких источников данных, что критично для зарплатных отчетов.
Резюме: Основной «подвох» при работе с параметрами в условиях компоновки — это автоматическая модификация текста запроса сторонними объектами. Всегда проверяйте финальный текст запроса в СхемеКомпоновкиДанных непосредственно перед вызовом КомпоновщикМакета.Выполнить(). Если вы видите там лишние КАК Поле_N — это сигнал к тому, что текст нужно «почистить» вручную.