Как программно изменить текст запроса динамического списка и добавить в него новые параметры?

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

При разработке управляемых форм в 1С:Предприятии 8.3 программисты часто сталкиваются с необходимостью динамически изменять поведение списков в зависимости от действий пользователя. Одной из самых распространенных задач является полная подмена текста запроса в объекте ДинамическийСписок с последующей установкой новых параметров. Однако на этом этапе новички часто получают ошибку "Параметр не найден", даже если в тексте запроса этот параметр явно присутствует. В данной статье мы подробно разберем, почему это происходит, и как правильно реализовать данный механизм.

Разберем причину возникновения ошибки

Проанализируем ситуацию: когда мы программно меняем свойство ТекстЗапроса у динамического списка, платформа выполняет перестроение внутренней структуры запроса. В этот момент коллекция Параметры полностью обновляется. Если мы пытаемся установить значение параметра до того, как присвоили новый текст запроса, система ищет этот параметр в "старом" тексте. Если его там нет — возникает ошибка.

Выясним причину ошибки на примере кода, который часто приводит к сбою:


// ОШИБОЧНЫЙ ВАРИАНТ
Список.Параметры.УстановитьЗначениеПараметра("СкладПараметр", Объект.Склад);
Список.ТекстЗапроса = "ВЫБРАТЬ * ИЗ Справочник.Номенклатура ГДЕ Склад = &СкладПараметр";

В данном случае на первой строке кода платформа еще "не знает" о существовании &СкладПараметр, так как он появится только во второй строке. Именно поэтому крайне важно соблюдать строгую последовательность действий.

Правильный алгоритм изменения текста и параметров

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

Посмотрим на пример корректного кода:


// ПРАВИЛЬНЫЙ ВАРИАНТ
НовыйТекст = 
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка КАК Ссылка,
    |	Номенклатура.Код КАК Код,
    |	Номенклатура.Наименование КАК Наименование
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |	Номенклатура.Склад = &СкладПараметр";

// 1. Сначала меняем текст запроса
ЭтаФорма.СписокНоменклатура.ТекстЗапроса = НовыйТекст;

// 2. Затем устанавливаем параметр
ЭтаФорма.СписокНоменклатура.Параметры.УстановитьЗначениеПараметра("СкладПараметр", НужныйСклад);

Этот подход гарантирует, что к моменту вызова метода УстановитьЗначениеПараметра система уже проанализировала новый текст запроса и добавила СкладПараметр в коллекцию доступных параметров динамического списка. При комплексном изменении структуры выборки могут пригодиться практические методы доработки динамических списков и добавления полей.

Использование метода УстановитьЗначениеПараметра напрямую

Существует несколько способов обращения к параметрам. Самый простой и современный для управляемых форм — это вызов метода непосредственно у элемента данных формы. Как было замечено в обсуждении, использование ЭтаФорма.Список.УстановитьЗначениеПараметра(...) является предпочтительным и наиболее лаконичным способом.

Проанализируем ситуацию: метод УстановитьЗначениеПараметра объекта ДинамическийСписок автоматически управляет свойством Использование. Это избавляет разработчика от необходимости вручную устанавливать флаг Параметр.Использование = Истина.

Работа через Компоновщик настроек

В некоторых сложных сценариях (например, когда динамический список имеет сложную структуру или вы работаете с настройками компоновки данных) полезно знать, что параметры динамического списка — это часть системы компоновки данных (СКД). Мы можем управлять ими через КомпоновщикНастроек.

Разберем по шагам, как это сделать:

  1. Получаем доступ к параметрам данных через компоновщик.
  2. Находим нужный параметр по имени.
  3. Устанавливаем его значение и флаг использования.

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

Работа через КомпоновщикНастроек дает больше контроля, но в большинстве повседневных задач достаточно прямого метода Список.Параметры.УстановитьЗначениеПараметра(). Для более детального изучения тонкостей компоновки пригодится руководство по возможностям системы настроек динамических списков.

Важные нюансы настройки в конфигураторе

Чтобы программное изменение текста запроса работало корректно, необходимо проверить свойства динамического списка в конфигураторе. Проанализируем настройки:

Использование необязательных параметров (фигурные скобки)

Часто возникает задача сделать параметр необязательным: если пользователь не выбрал значение, то условие в запросе не должно применяться. В динамических списках это реализуется с помощью синтаксиса СКД.

Рассмотрим пример использования фигурных скобок:


// Текст запроса с необязательным условием
Текст = "ВЫБРАТЬ * ИЗ Справочник.Номенклатура ГДЕ {Склад = &СкладПараметр}";
Список.ТекстЗапроса = Текст;

В такой конструкции, если вы не вызовете УстановитьЗначениеПараметра("СкладПараметр", ...), 1С просто проигнорирует часть условия внутри фигурных скобок при формировании финального SQL-запроса к базе данных. Это делает динамические списки очень гибкими.

Советы по отладке и типичные ошибки

Если вы все же получаете ошибку, рекомендуем проверить следующее:

  1. Проверка текста в отладчике: Перед установкой параметров посмотрите значение Список.ТекстЗапроса. Убедитесь, что там действительно есть текст с символом & перед именем параметра.
  2. Раскладка клавиатуры: Убедитесь, что имя параметра в коде и в тексте запроса написано в одной раскладке (кириллица/латиница). Символы "а", "е", "с", "о" часто становятся причиной трудноуловимых ошибок.
  3. Событие обновления: Обычно динамический список обновляется автоматически при возврате управления с сервера на клиент. Однако, если данные на форме не обновились, можно явно вызвать метод Элементы.Список.Обновить().

Таким образом, ключ к успешному добавлению параметра в динамический список — это приоритет текста над параметрами. Сначала мы "учим" список новому запросу, а затем наполняем этот запрос данными через параметры.

← На главную