Как исправить ошибку «Не определен параметр» во внешнем отчете СКД

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

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

Выясним причину возникновения ошибки

Проанализируем ситуацию: в языке запросов 1С, если параметр &ВидОперации прописан в блоке ГДЕ или в конструкции ВЫБОР, платформа ожидает его обязательного наличия в структуре исполняемого запроса. Даже если вы пытаетесь написать логику &ВидОперации <> НЕОПРЕДЕЛЕНО, система все равно сначала пытается найти значение этого параметра, чтобы вычислить результат выражения. Если значение не передано (флажок использования в настройках снят), возникает исключение.

В представленном коде автор пытается объединить данные из разных документов (ПКО и Оплата платежной картой), добавляя строковое поле ВидОперации. Основная сложность заключается в том, что этот фильтр должен быть необязательным. Разберем, как реализовать это правильно.

Способ 1. Использование расширения языка запросов СКД (Фигурные скобки)

Наиболее корректным методом в рамках СКД является использование фигурных скобок {}. Этот механизм позволяет пометить часть запроса как «необязательную». Если параметр не будет заполнен пользователем, СКД просто вырежет это условие из итогового SQL-запроса, который отправится к базе данных.

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


ВЫБРАТЬ
    ВТ_Документы.Дата КАК Дата,
    ВТ_Документы.Номер КАК Номер,
    ВТ_Документы.СуммаДокумента КАК СуммаДокумента,
    ВТ_Документы.ВидОперации КАК ВидОперации
ИЗ
    ВТ_Документы КАК ВТ_Документы
{ГДЕ
    ВТ_Документы.ВидОперации = &ВидОперации}

Почему это работает: Когда СКД видит конструкцию внутри {ГДЕ ...}, она управляет этим условием автоматически. Если параметр &ВидОперации активен (стоит галочка), условие добавляется. Если нет — текст внутри фигурных скобок игнорируется, и ошибка не возникает.

Способ 2. Использование стандартных отборов вместо параметров

Проанализируем альтернативный подход: часто разработчики создают параметры там, где можно обойтись стандартным механизмом отборов. Если поле ВидОперации присутствует в выборке (как в нашем примере), нам не нужно явно прописывать ГДЕ в тексте запроса.

  1. Удалите любое упоминание &ВидОперации из текста запроса.
  2. Перейдите на вкладку Настройки в схеме компоновки данных.
  3. Выберите вкладку Отбор.
  4. Добавьте поле ВидОперации в список отборов.
  5. Нажмите правой кнопкой мыши на этот отбор и выберите Свойства элемента пользовательских настроек.
  6. Установите флаг Включать в пользовательские настройки.

Теперь пользователь сможет сам решать, фильтровать данные по виду операции или нет, а платформа 1С автоматически добавит нужное условие в запрос только при необходимости.

Способ 3. Логический флаг «Использовать отбор»

Если по каким-то причинам вам необходимо оставить условие именно в тексте запроса (например, при сложной логике объединений), можно применить метод с дополнительным параметром-флагом. Добавим параметр &ИспользоватьОтборПоВиду (тип Булево).

Перепишем условие ГДЕ следующим образом:


ГДЕ (&ИспользоватьОтборПоВиду = ЛОЖЬ ИЛИ ВТ_Документы.ВидОперации = &ВидОперации)

В этом случае вам нужно будет программно или через выражения СКД устанавливать значение &ИспользоватьОтборПоВиду. Если он равен ИСТИНА, сработает вторая часть условия с равенством. Если ЛОЖЬ — всё условие целиком всегда будет истинным для всех строк. Однако помните: в этом варианте оба параметра должны быть инициализированы (иметь хотя бы пустое значение), чтобы запрос не упал.

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

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


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

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

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

Рекомендации по оптимизации

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

  1. Стандартные отборы СКД: Самый производительный и «чистый» способ.
  2. Фигурные скобки: Лучший вариант, если условие должно быть именно внутри текста запроса (например, внутри вложенного запроса).
  3. Значения по умолчанию: На вкладке Параметры в СКД всегда указывайте тип значения и, по возможности, значение по умолчанию. Это предотвратит ошибку «Не определен параметр», даже если пользователь забыл про него.

Используя эти методы, вы создадите надежный отчет, который не будет «падать» при изменении пользовательских фильтров, обеспечивая стабильную работу системы 1С.

← На главную