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