1С. Форма подбора с использованием отборов СКД

Необходимо реализовать форму подбора с использованием отборов СКД. На форме необходимо отображать удовлетворяющие настроенному отбору элементы.

Задача

В некой обработке для конфигурации УТ 11.4 необходимо реализовать форму подбора соглашений с использованием отборов СКД:

  1. Форма подбора должна открываться по кнопке Подобрать из основной формы обработки. Форма подбора должна блокировать основную форму обработки;
  2. На форме подбора необходимо отображать таблицу отборов СКД, и список удовлетворяющих условиям отбора элементов;
  3. По завершению подбора, по кнопке Готово необходимо вернуть коллекцию подобранных  соглашений в основную форму обработки.

Решение

Часто в подобных случаях программисты создают макет СКД, в форме добавляют реквизит с типом КомпоновщикНастроекКомпоновкиДанных. Из формы получают макет СКД, при помощи компоновщика настроек и какой-то мате процессора компоновки получают результат. Результат помещаю в коллекции на форме, и при необходимости передают из формы как результат подбора.

Есть более простой и менее затратный по времени вариант с динамическим списком, его и рассмотрим.

Разработку будем производить в демонстрационной ИБ УТ 11.4.

Форма подбора

Первым делом в обработке создадим нашу форму подбора с произвольным типом, в форме подбора добавим реквизит  СписокОтбора (тип ДинамическийСписок). В  свойствах реквизита формы укажем основную таблицу Справочник.СоглашенияСКлиентами, остальные параметры оставим по умолчанию.

Разворачиваем реквизит СписокОтбора и перетаскиваем на форму Отбор, в появившемся диалоге выбираем тип элемента Таблица. На форме отобразится таблица отборов СКД.

1С. Форма подбора с использованием отборов СКД

Далее перетаскиваем на форму сам реквизит СписокОтбора, и добавляем для него необходимые колонки. Не забываем добавить колонку Ссылка скрыв ее видимость, а у реквизита формы указать признак Использовать всегда.

В итоге имеем форму в которой видна таблица настройки отбора СКД и динамический список отображающий результат отбора.

1С. Форма подбора с использованием отборов СКД

Вызов формы подбора

Вызов будет стандартным, создадим команду Подобрать, в которой просто укажем какую форму открыть и передадим описание оповещения о закрытии. Не забываем про условие блокирования формы основной обработки.

&НаКлиенте
Процедура Подобрать(Команда)

    Оповещение = Новый ОписаниеОповещения("Подобрать_Завершение", ЭтаФорма);
    
    ОткрытьФорму("ВнешняяОбработка.ОбработкаСоглашений.Форма.ФормаПодбораСКД", , ЭтаФорма, , , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
    
КонецПроцедуры

Сразу опишем процедуру обработки для переданного описания оповещения. От формы подбора будем ожидать, что вернется Массив или Неопределено, что обеспечим в самой форме подбора.

Остается просто загрузить возвращаемый массив соглашений в список значений имеющийся на форме.

&НаКлиенте
Процедура Подобрать_Завершение(ВозвращаемоеЗначение, ДополнительныеПарамтеры) Экспорт 
    
    Если ВозвращаемоеЗначение = Неопределено Тогда 
        Возврат;
    КонецЕсли;
    
    СписокСоглашений.ЗагрузитьЗначения(ВозвращаемоеЗначение);
    
КонецПроцедуры

Возврат данных подбора

Остается получить данные из динамического списка с установленными отборами. Тут приходит на помощь приходит заметка из зазеркалья. По сути можно взять готовую схему компоновки и ее настройки прямо из динамического списка и выполнить их.

Просто адаптируем код под наши нужды и вызываем его из команды Готово как параметр метода формы Закрыть().

&НаКлиенте
Процедура Готово(Команда)
    
    Закрыть(ДанныеПодбора());
    
КонецПроцедуры

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

Результат

Задача решена с минимальными усилиями и как можно больше функционала отдано на обработку платформе, что в свою очередь повышает живучесть решения при дальнейших изменения и обновлениях.

И как полагается демонстрация результата работы: открытие и настройка отбора

1С. Форма подбора с использованием отборов СКД

Результат подбора:

1С. Форма подбора с использованием отборов СКД

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *