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