diff --git a/public/skd/proizvolnie-otbory/1.png b/public/skd/proizvolnie-otbory/1.png new file mode 100644 index 0000000..1a9be9b Binary files /dev/null and b/public/skd/proizvolnie-otbory/1.png differ diff --git a/public/skd/proizvolnie-otbory/2.png b/public/skd/proizvolnie-otbory/2.png new file mode 100644 index 0000000..cbb0f29 Binary files /dev/null and b/public/skd/proizvolnie-otbory/2.png differ diff --git a/public/skd/proizvolnie-otbory/3.png b/public/skd/proizvolnie-otbory/3.png new file mode 100644 index 0000000..0603421 Binary files /dev/null and b/public/skd/proizvolnie-otbory/3.png differ diff --git a/public/skd/proizvolnie-otbory/4.png b/public/skd/proizvolnie-otbory/4.png new file mode 100644 index 0000000..ea17793 Binary files /dev/null and b/public/skd/proizvolnie-otbory/4.png differ diff --git a/public/skd/proizvolnie-otbory/5.png b/public/skd/proizvolnie-otbory/5.png new file mode 100644 index 0000000..31b196f Binary files /dev/null and b/public/skd/proizvolnie-otbory/5.png differ diff --git a/public/skd/proizvolnie-otbory/6.gif b/public/skd/proizvolnie-otbory/6.gif new file mode 100644 index 0000000..5103163 Binary files /dev/null and b/public/skd/proizvolnie-otbory/6.gif differ diff --git a/src/content/docs/knowledge-base/Общие/СКД и отчеты/Реализация произвольных отборов на форме.md b/src/content/docs/knowledge-base/Общие/СКД и отчеты/Реализация произвольных отборов на форме.md new file mode 100644 index 0000000..037cd02 --- /dev/null +++ b/src/content/docs/knowledge-base/Общие/СКД и отчеты/Реализация произвольных отборов на форме.md @@ -0,0 +1,187 @@ +--- +title: Реализация произвольных отборов на форме +slug: общие-скд-и-отчеты/реализация-произвольных-отборов-на-форме +--- + +Для того, чтобы у пользователя была возомжность управлять выборкой с помощью `произвольных отборов` (например, для загрузки в табличную часть всей номенклатуры, отвечающей некоторым условиям) необходимо сделать следующее: + +## Шаг 1. Создать схему компоновки данных + +Макет типа `Схема компоновки данных` может распологаться в любом месте конфигурации. Главное, чтобы его можно было получить в коде. + +В схеме компоновки данных определяем запрос любого вида (соединения, отборы и пр.) +![Изображение](/skd/proizvolnie-otbory/1.png) + +На вкладке `Настройки` определяем состав полей, которые будут выгружены в коллекцию значений (`таблицу` или `дерево`, в зависимости от настроенных группировок) + +![Изображение](/skd/proizvolnie-otbory/2.png) + +![Изображение](/skd/proizvolnie-otbory/3.png) + +На вкладке `Отбор` настраиваем те отборы, которые будут устанавливаться по умолчанию: + +![Изображение](/skd/proizvolnie-otbory/4.png) + +## Шаг 2. Настроить форму + +Для того, чтобы у пользователя была возможность управлять настройками определенной схемы компоновки данных необходимо: +1. Создать реквизит формы с типом `КомпоновщикНастроекКомпоновкиДанных` (в примере имя реквизита - `КомпоновщикНастроек`). Вывести из него элемент `Отбор` коллекции `НастройкиКомпоновкиДанных` + +![Изображение](/skd/proizvolnie-otbory/5.png) + +2. В обработчике `ПриСозданииНаСервере` формы загружаем настройки созданной ранее схемы в компоновщик настроек +```bsl +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + // Получаем схему + СхемаКомпоновкиДанных = Справочники.Контрагенты.ПолучитьМакет("ДанныеКонтрагентов"); + + // Помещаем в ВХ для извлечения настроек + АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор); + ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы); + + // инициализируем реквизит формы с типом КомпоновщикНастроекКомпоновкиДанных + КомпоновщикНастроек.Инициализировать(ИсточникНастроек); + + // загружаем настройки из созданной схемы в реквизит формы + КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию); + +КонецПроцедуры +``` +3. В требуемый обработчик прописать выполнение нужной схемы компоновки данных с теми настройками, которые установит пользователь. Например, при изменении отборов компоновщика или при нажатии на кнопку. + +```bsl +&НаКлиенте +Процедура КомпоновщикНастроекНастройкиОтборПриИзменении(Элемент) + НайтиПоОтборамНаСервере(); +КонецПроцедуры + +&НаСервере +Процедура НайтиПоОтборамНаСервере() + + // получаем схему + СхемаКомпоновкиДанных = Справочники.Контрагенты.ПолучитьМакет("ДанныеКонтрагентов"); + + // из реквизита формы получаем настройки, которые установил пользователь + Настройки = КомпоновщикНастроек.ПолучитьНастройки(); + + // Выполняем схему компоновки с нужными настройками + КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; + МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, + Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); + + // Обязательно ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений + ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; + ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных); + ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; + + ТаблицаРезультат = Новый ТаблицаЗначений; // или дерево значений, в зависимости от настроек СКД + + // Заполняем таблицу/дерево + ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат); + ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); + + // Обрабатываем + Для Каждого Строка Из ТаблицаРезультат Цикл + ... + КонецЦикла; + +КонецПроцедуры +``` + +![Изображение](/skd/proizvolnie-otbory/6.gif) + +
+Весь модуль формы + +```bsl + + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + СхемаКомпоновкиДанных = Справочники.Контрагенты.ПолучитьМакет("ДанныеКонтрагентов"); + + АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор); + ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы); + + КомпоновщикНастроек.Инициализировать(ИсточникНастроек); + + КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура КомпоновщикНастроекНастройкиОтборПриИзменении(Элемент) + НайтиПоОтборамНаСервере(); +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура НайтиПоОтборам(Команда) + НайтиПоОтборамНаСервере(); +КонецПроцедуры + +&НаКлиенте +Процедура ПодобратьИЗакрыть(Команда) + + СписокВыбранных = Новый Массив; + Для Каждого Строка Из ВыбранныеКонтрагенты Цикл + СписокВыбранных.Добавить(Строка.Контрагент); + КонецЦикла; + + Закрыть(СписокВыбранных); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура НайтиПоОтборамНаСервере() + + СхемаКомпоновкиДанных = Справочники.Контрагенты.ПолучитьМакет("ДанныеКонтрагентов"); + + Настройки = КомпоновщикНастроек.ПолучитьНастройки(); + + КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; + + МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, + Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); + + ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; + + ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных); + + ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; + + ТаблицаРезультат = Новый ТаблицаЗначений; + + ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат); + + ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); + + ВыбранныеКонтрагенты.Очистить(); + Для Каждого Строка Из ТаблицаРезультат Цикл + ВыбранныеКонтрагенты.Добавить().Контрагент = Строка.Ссылка; + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + + +``` + +
\ No newline at end of file