Очень часто, в универсальных обработках приходится делать отборы довольно c внушительным списком (будь то групповая обработка справочников и документов или универсальная выгрузка загрузка данных XML), что довольно утомительно.
Благодаря небольшой доработке можно упростить эту процедуру (если вы конечно мало-мальски владеете запросами) и не писать кучу маленьких обработок для каждого конкретного случая. Идею почерпнул из обработки регистрации изменений для обмена.
Как это работает?
Например: в групповой обработке справочников и документов нам необходимо обработать только тех контрагентов, по которым были продажи за последний месяц.
В отборе устанавливается отбор по интересующему вас полю, делаете его активным (пометив эту строку) и нажимается кнопка "Получить запросом". Открывается окно куда можно конструктором или вручную написать текст запроса к регистру продаж, использововав, если необходимо, параметры. Выполнив запрос, по нажатию кнопки "Ок" отобранные элементы попадают в отбор. В запросе можеть быть сколько угодно полей, главное чтоб присутсвовало поле с наименованием по которому собственно и делается отбор.
Как это сделать? (на примере всё той же групповой обработки справочников и документов)
В форме, в командной панели для отбора создаем кнопку, в тексте обработчика которой пишется лишь одна строка:
ПолучитьЗапросом(ЭлементыФормы.ТабличноеПолеОтбор);
Так же в модуле формы размещаем и саму процедуру, которую вызываем:
Процедура ПолучитьЗапросом(ЭлементФормыОтбор)
Если ЭлементФормыОтбор.ТекущаяСтрока = Неопределено Или Не ЗначениеЗаполнено(ЭлементФормыОтбор.ТекущаяСтрока.Представление) Тогда
Сообщить("Выделите строку нужного отбора!");
Возврат;
КонецЕсли;
// открываем форму выбора данных из запроса
ФормаЗапроса = ПолучитьФорму("ит_ФормаРезультатаЗапроса");
ФормаЗапроса.Представление = ЭлементФормыОтбор.ТекущаяСтрока.Представление;
РезультатОткрытияМодально = ФормаЗапроса.ОткрытьМодально();
Если НЕ (РезультатОткрытияМодально = Истина) Тогда
Возврат;
КонецЕсли;
СписокЗначений = Новый СписокЗначений; СписокЗначений.ЗагрузитьЗначения(ФормаЗапроса.РезультатТаблица.ВыгрузитьКолонку(ЭлементФормыОтбор.ТекущаяСтрока.Представление)); ЭлементФормыОтбор.ТекущаяСтрока.ВидСравнения = ВидСравнения.ВСписке; ЭлементФормыОтбор.ТекущаяСтрока.Значение = СписокЗначений;
КонецПроцедуры
и добавляем в обработку две формы: ит_ФормаРезультатаЗапроса и ит_ФормаПараметров
Процедура и эти две формы находятся в прикрепленной обработке-шаблоне к данной публикации.
Аналогичным образом дорабатывается обработка ВыгрузкаЗагрузкаДанныхXML, и другие обработки где используется отбор построителя.