Иногда бывает необходимо построить совершенно разные отчеты с отбором по некоторому перечню, например, продажи по некоторому списку контрагентов или номенклатуры, дебиторку по некоторому списку реализаций, или же запустить Групповую обработку справочников и документов по некоторому заранее составленному списку.
Думаю, нет смысла обсуждать выгоду от автоматического подбора в отбор длинных списков - это очевидно.
Данная задача не решается без модификации конфигурации.
Варианты решения:
1) модифицировать код форм каждого из отчетов, внедряя несколько строк, которые заменяют для каждого из элементов на форме стандартную обработку редактирования списка на свою (как это сделано у
e.kogan)
2) модифицировать формы выбора объектов, внедряя несколько строк, которые добавляют на форму кнопку, позволяющую "оповещать о выборе" стандартную обработку редактирования списка (как это сделано здесь).
Мне больше нравится второй подход, т.к. своих отчетов может быть наделано много, и еще есть стандартные отчеты (остатки товаров на складах, оборотно-сальдовая), в которые не очень хочется лезть. Зато с объектами, которые нужно подбирать, всё несколько проще - 3-5 документов и 3-5 справочников. Вдобавок форму выбора в типовых редко меняют и при обновлении сильно не мешает.
Но, при желании, подходы можно комбинировать. Например, в Универсальной обработке справочников и документов я также и первый подход реализовал.
Если сравнивать сами обработки по функционалу, то вышеупомянутая обработка более универсальная. В текущей обработке зато есть загрузка по дате и периоду и по представлению, что на практике встречается часто. Также из плюшек - для каждого документа или справочника запоминается последний выбранный режим.
Хитрости
Одна из проблем, которую удалось решить для универсальности модификаций форм выбора: найти основной реквизит формы выбора и определить его тип. Тема поднималась на ИнфоСтарте, но решалась она довольно злобным кодом, поэтому решил, не мудрствуя лукаво, использовать то, что в формах выбора справочников (документов) в 99% случаев основной реквизит называется "СправочникСписок" ("ДокументСписок"), т.к. так его именует конструктор.
А уже тип (имя типа) определяется через отбор по ссылке
ФормаВыбора["СправочникСписок"].ТекСписок.Отбор.Ссылка.Значение.Метаданные().Имя
или так (если в отборе уже был список)
ФормаВыбора["СправочникСписок"].ТекСписок.Отбор.Ссылка.Значение[0].Метаданные().Имя
Стандартную форму "Редактирование списка значений" заполняем оповещением:
Для каждого СтрокаПодбора Из ТаблицаПодбора Цикл
ФормаВыбора.ОповеститьОВыборе(СтрокаПодбора.Ссылка);
КонецЦикла;
И еще на последок: как-то понадобилось отобрать в форме списка документов по произвольному отбору. Решение нашлось такое: включаем доступность отбора по ссылке в форме списка:
Процедура ПриОткрытии()
ЭлементыФормы.Список.НастройкаОтбора.Ссылка.Доступность = Истина;
КонецПроцедуры
и пользуемся этой обработкой.
Внедрение
Внедрение описано в макете README.
Если вкратце, то необходимо в процедуру "ПриОткрытии" формы выбора добавить код, который рисует кнопку на командной панели:
ЭлементыФормы.ДействияФормы.Кнопки.Добавить("ПодобратьСписком", ТипКнопкиКоманднойПанели.Действие, "Подобрать списком", Новый Действие("ДействияФормыПодобратьСписком"));
А также в модуль формы добавить саму процедуру-обработчик нажатия кнопки.
Процедура ДействияФормыПодобратьСписком(Кнопка)
МнПодбор = Обработки.МножественныйПодбор.Создать();
Если МнПодбор.Инициализировать(ЭтаФорма) Тогда
//успех
МнПодбор.Подобрать(ЭтаФорма)
КонецЕсли;
КонецПроцедуры
Замечания и отзывы приветствуются!
Обновления
05.12.2013 - добавлен подбор по документам (в том числе - по представлениям); добавлена версия для 8.1; обновлена статья