Как правильно передать параметр из формы в условие запроса СКД?

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

При разработке отчетов на базе системы компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда параметр, объявленный в секции ГДЕ запроса, вызывает ошибку вида «Не задано значение параметра» либо условие просто не применяется при формировании отчета, несмотря на ввод значения в реквизит формы. Разберем причины такого поведения и рассмотрим все надежные способы правильной передачи параметров в схему компоновки данных.

Почему возникает ошибка или игнорируется условие

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

  1. Жесткое условие в запросе без использования синтаксиса расширения СКД. Если в тексте запроса (особенно во временных таблицах) написать классическое условие ГДЕ Поле >= &ИмяПараметра, платформа требует обязательной инициализации этого параметра на уровне запроса. Если значение не передано или параметр выключен в настройках, система выдаст ошибку.
  2. Конфликт настроек и пользовательских настроек. Если параметр вынесен в пользовательские настройки, прямое изменение значения через КомпоновщикНастроек.Настройки.ПараметрыДанных может перезаписываться значениями из коллекции КомпоновщикНастроек.ПользовательскиеНастройки в момент формирования отчета.
  3. Сброшенный флаг использования. Даже если реквизит формы заполнен, в структуре компоновщика свойство параметра Использование может оставаться в значении Ложь.

Способ 1. Использование синтаксиса расширения языка запросов СКД

Выясним, как сделать условие гибким. СКД предоставляет специальный синтаксис фигурных скобок, который указывает платформе, что блок условия является необязательным. Если параметр не заполнен или отключен пользователем, СКД автоматически исключит этот фрагмент из итогового SQL-запроса.

Посмотрим на пример запроса с расширением СКД:


ВЫБРАТЬ
    ВТ_КоличествоВозвратов.КоличествоВозвратов КАК КоличествоВозвратов
ИЗ
    ВТ_КоличествоВозвратов КАК ВТ_КоличествоВозвратов
{ГДЕ
    ВТ_КоличествоВозвратов.КоличествоВозвратов >= &КоличествоВозвратов}

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

Способ 2. Вывод параметра в пользовательские настройки отчета

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

  1. Открываем схему компоновки данных и переходим на закладку Настройки.
  2. В нижней части переходим на закладку Параметры.
  3. Находим нужный параметр (например, КоличествоВозвратов) и нажимаем кнопку Свойства элемента пользовательских настроек.
  4. Устанавливаем флаг Включать в пользовательские настройки и выбираем режим редактирования (например, Быстрый доступ).

После этой настройки поле ввода параметра появится на форме отчета автоматически в шапке пользовательских настроек, а значение будет корректно транслироваться в запрос СКД при нажатии кнопки «Сформировать».

Способ 3. Программная установка параметра в модуле объекта

Рассмотрим вариант, когда параметр должен рассчитываться или передаваться жестко перед формированием отчета. Наиболее надежное место для передачи значений — предопределенное событие ПриКомпоновкеРезультата в модуле объекта отчета.

Посмотрим на пример реализации:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, СхемаКомпоновкиДанных, ВыводЗавершен, Настройки, СтандартнаяОбработка)
    
    // Ищем параметр в переданных настройках компоновки
    ЭлементПараметра = Настройки.ПараметрыДанных.Элементы.Найти("КоличествоВозвратов");
    
    Если ЭлементПараметра <> Неопределено Тогда
        ЭлементПараметра.Значение = КоличествоВозвратов; // Передаем значение реквизита
        ЭлементПараметра.Использование = Истина;
    КонецЕсли;

КонецПроцедуры

Модификация переданной в данный обработчик структуры Настройки гарантирует, что значение применится к итоговой схеме независимо от сохраненных настроек пользователя.

Способ 4. Программная установка через пользовательские настройки формы

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


// Получаем идентификатор пользовательской настройки параметра
ЭлементПараметра = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("КоличествоВозвратов");

Если ЭлементПараметра <> Неопределено Тогда
    Идентификатор = ЭлементПараметра.ИдентификаторПользовательскойНастройки;
    
    // Ищем элемент в коллекции пользовательских настроек
    ЭлементПользовательскойНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Идентификатор);
    Если ЭлементПользовательскойНастройки <> Неопределено Тогда
        ЭлементПользовательскойНастройки.Значение = КоличествоВозвратов;
        ЭлементПользовательскойНастройки.Использование = Истина;
    КонецЕсли;
КонецЕсли;

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

← На главную