Динамический список появился на платформе 8, как отдельный тип данных. Основан он на системе компановки данных и из коробки уже предлагает много «вкусностей» — полнотекстовый поиск, сортировку, отбор, поле поиска, условное оформление. В общем при правильном применении можно убить много зайцев, при помощи динамического списка. Чаще всего его применяют для отображения данных из БД.
В одном из своих проектов, я делал подбор товаров в РМК на основе динамического списка. Получилось надо скзать круто, пользователи были очень довольны скоростью работы и возможностями полнотекстового поиска. Я кажется уже писал об этом в одной из предыдущих записей блога.
Так вот понадобилось мне, программное изменение текста запроса. К счастью решение было найдено довольно быстро и реализация оказалась довольно простой. Код приложу ниже. В моем случае я при установке галки на форме, подменял текст запроса динамического списка. Важными замечанием является, что наименования колонок в обоих запросах должны быть полностью идентичными, чтоб сработал метод описанный мною. На форму я вывел реквизит ОстаткиСклада с типом Булево, и при установке этого значения менял запрос.
&НаСервере Процедура ОстаткиСкладаПриИзмененииНаСервере() Если ОстаткиСклада Тогда ТекстЗапроса = "ВЫБРАТЬ | ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, | ТоварыНаСкладахОстатки.Характеристика КАК Характеристика, | СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток |ПОМЕСТИТЬ ОстаткиСклада |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &СкладОптовый) КАК ТоварыНаСкладахОстатки | |СГРУППИРОВАТЬ ПО | ТоварыНаСкладахОстатки.Номенклатура, | ТоварыНаСкладахОстатки.Характеристика |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура, | ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика, | ЦеныНоменклатурыСрезПоследних.Цена КАК Цена |ПОМЕСТИТЬ Цены |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ЦенаОптовая) КАК ЦеныНоменклатурыСрезПоследних |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Номен.Ссылка КАК Номенклатура, | ОстаткиСклада.Характеристика КАК Характеристика, | Цены.Цена КАК Цена, | ОстаткиСклада.КоличествоОстаток КАК Остаток |ИЗ | Справочник.Номенклатура КАК Номен | ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиСклада КАК ОстаткиСклада | ЛЕВОЕ СОЕДИНЕНИЕ Цены КАК Цены | ПО (Цены.Характеристика = ОстаткиСклада.Характеристика) | ПО (ОстаткиСклада.Номенклатура = Номен.Ссылка)"; ОстаткиТоваров.ТекстЗапроса = ТекстЗапроса; ОстаткиТоваров.Параметры.УстановитьЗначениеПараметра("ЦенаОптовая", Справочники.ВидыЦен.НайтиПоНаименованию("Оптовая")); ОстаткиТоваров.Параметры.УстановитьЗначениеПараметра("СкладОптовый", Справочники.Склады.НайтиПоНаименованию("Оптовый")); Элементы.ОстаткиТоваров.Обновить(); Иначе ТекстЗапроса = "ВЫБРАТЬ | ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, | ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток, | ТоварыНаСкладахОстатки.Характеристика КАК Характеристика |ПОМЕСТИТЬ ОстатокРозницы |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &РозничныйСклад) КАК ТоварыНаСкладахОстатки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика, | ЦеныНоменклатурыСрезПоследних.Цена КАК Цена |ПОМЕСТИТЬ ЦеныРозницы |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &Розничная) КАК ЦеныНоменклатурыСрезПоследних |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Номен.Ссылка КАК Номенклатура, | ОстатокРозницы.Характеристика КАК Характеристика, | ЦеныРозницы.Цена КАК Цена, | ОстатокРозницы.КоличествоОстаток КАК Остаток |ИЗ | Справочник.Номенклатура КАК Номен | ЛЕВОЕ СОЕДИНЕНИЕ ОстатокРозницы КАК ОстатокРозницы | ЛЕВОЕ СОЕДИНЕНИЕ ЦеныРозницы КАК ЦеныРозницы | ПО ОстатокРозницы.Характеристика = ЦеныРозницы.Характеристика | ПО (ОстатокРозницы.Номенклатура = Номен.Ссылка)"; ОстаткиТоваров.ТекстЗапроса = ТекстЗапроса; ОстаткиТоваров.Параметры.УстановитьЗначениеПараметра("Розничная", Справочники.ВидыЦен.НайтиПоНаименованию("Розничная")); ОстаткиТоваров.Параметры.УстановитьЗначениеПараметра("РозничныйСклад", Справочники.Склады.НайтиПоНаименованию("Агасиева 17")); Элементы.ОстаткиТоваров.Обновить(); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОстаткиСкладаПриИзменении(Элемент) ОстаткиСкладаПриИзмененииНаСервере(); Элементы.ОстаткиТоваров.Обновить(); КонецПроцедуры
Приятным бонусом оказалось, что если в поле поиска уже введено значение, и далее нажать галку которая меняет текст запроса, то в динамический список будут выведены записи с учетом значения значения поиска. Надеюсь данная запись блога будет кому либо полезна.