Предположим, у меня есть какая-то колонка в табличной части чего-то (документа, обработки, справочника), или реквизит в шапке. где надо выбитать документ. И этот документ надо выбирать только из определенных документов, у которых совпадают реквизиты с нашим объектом. Вроде чего там сложного, открываем форму выбора и устанавливаем на ней отбор программно. А вдруг надо, чтобы что то совпадало в табличной части выбираемого документа? Тоже никаких проблем. Что нам мешает предварительно выбрать список документов, которые разрешены к выбору, и затем передать в отбор формы списка список ссылок на объекты из этой формы списка? Вот вам пример из практики.
тд = ЭлементыФормы.ЗаказыПокупателей.ТекущиеДанные;
СтандартнаяОбработка = ложь;
тз = "ВЫБРАТЬ
| ЗаказПокупателяУслуги.Ссылка
|ИЗ
| Документ.ЗаказПокупателя.Услуги КАК ЗаказПокупателяУслуги
|ГДЕ
| (ЗаказПокупателяУслуги.Ссылка.НомерЗаказаТОРО = &НомерЗаказаТОРО
| ИЛИ ЗаказПокупателяУслуги.НомерЗаказаТОРО = &НомерЗаказаТОРО)
| И ЗаказПокупателяУслуги.Ссылка.СтатьяЗатратРемонта = &СтатьяЗатратРемонта
| И ЗаказПокупателяУслуги.Ссылка.ПодразделениеОрганизации = &Подразделение
|"+?(ЗначениеЗаполнено(ЦехЗаказчик)," И ЗаказПокупателяУслуги.Ссылка.ПодразделениеЗаказчик = &ПодразделениеЗаказчик","")+"
| И ЗаказПокупателяУслуги.Ссылка.ОбъектРемонта = &ОбъектРемонта
|
|СГРУППИРОВАТЬ ПО
| ЗаказПокупателяУслуги.Ссылка";
з = новый запрос (тз);
з.УстановитьПараметр("НомерЗаказаТОРО",тд.НомерЗаказаТОРО);
з.УстановитьПараметр("СтатьяЗатратРемонта",тд.ВидРемонта);
з.УстановитьПараметр("Подразделение",ЦехИсполнитель);
з.УстановитьПараметр("ПодразделениеЗаказчик",ЦехЗаказчик);
з.УстановитьПараметр("ОбъектРемонта",тд.ОбъектРемонта);
рез = з.Выполнить();
Если не рез.Пустой() тогда
списокСсылокНаДокументы = новый СписокЗначений;
выборка = рез.Выбрать();
пока выборка.Следующий() цикл
списокСсылокНаДокументы.Добавить(выборка.Ссылка);
КонецЦикла;
ф = Документы.ЗаказПокупателя.ПолучитьФормуВыбора(,Элемент);
ф.РежимВыбора=Истина;
ф.отбор.Ссылка.ВидСравнения = ВидСравнения.ВСписке;
ф.отбор.Ссылка.Значение = списокСсылокНаДокументы;
ф.отбор.Ссылка.Использование = Истина;
ф.Открыть();
Если ЗначениеЗаполнено(ЭлементыФормы.ЗаказыПокупателей.ТекущиеДанные.ЗаказПокупателя) тогда
ЭлементыФормы.ЗаказыПокупателей.ТекущиеДанные.ШПЗ = ЭлементыФормы.ЗаказыПокупателей.ТекущиеДанные.ЗаказПокупателя.ШПЗ;
КонецЕсли;
иначе
Предупреждение("Нет данных для выбора",6);
КонецЕсли;
КонецПроцедуры