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