+1
Как программно Изменить Отбор в отчете СКД
Эта тема тоже достаточна распространена. Нюанс программного изменения отбора заключается в том, что коллекция:
Код 1C v 8.х
КомпоновщикНастроек.Настройки.Отбор.Элементы
в отличие от аналогичной коллекции параметров, не имеет метода Найти(). Можно конечно изменять отбор «в лоб», т.е. по индексу, но это не есть хорошо. Самый оптимальный вариант, обходить все поля отбора в цикле.
Приведу пример универсальной функции для изменения отбор компоновки данных:
Код 1C v 8.х
//Ищет отбор в компоновщике настроек по параметрам, заданным через
//"СоответствиеПоискаОтбора", и заменяет
//на отбор с параметрами, указанными в "СоответствиеНовогоОтбора"
Процедура ИзменитьОтбор(ЭлементСтруктуры,
СоответствиеПоискаОтбора = Неопределено, СоответствиеНовогоОтбора) Экспорт
Если ТипЗнч(ЭлементСтруктуры) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
Отбор = ЭлементСтруктуры.Настройки.Отбор;
Иначе
Отбор = ЭлементСтруктуры;
КонецЕсли;
Если ТипЗнч(СоответствиеНовогоОтбора["ЛевоеЗначение"]) = Тип("Строка") Тогда
нПоле = Новый ПолеКомпоновкиДанных(СоответствиеНовогоОтбора.ЛевоеЗначение);
Иначе
нПоле = СоответствиеНовогоОтбора["ЛевоеЗначение"];
КонецЕсли;
Если СоответствиеНовогоОтбора.Получить("ВидСравнения") = Неопределено Тогда
нВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Иначе
нВидСравнения = СоответствиеНовогоОтбора["ВидСравнения"];
КонецЕсли;
Если СоответствиеНовогоОтбора.Получить("Использование") = Неопределено Тогда
нИспользование = Истина;
Иначе
нИспользование = СоответствиеНовогоОтбора["Использование"];
КонецЕсли;
нЗначение = СоответствиеНовогоОтбора["Значение"];
ТолькоПоЛевомуЗначению = Ложь;
Если СоответствиеПоискаОтбора = Неопределено Тогда
ТолькоПоЛевомуЗначению = Истина;
КонецЕсли;
сЛевоеЗначение = СоответствиеПоискаОтбора.Получить("ЛевоеЗначение");
Если сЛевоеЗначение = Неопределено Тогда
сЛевоеЗначение = нПоле;
КонецЕсли;
сВидСравнения = СоответствиеПоискаОтбора.Получить("ВидСравнения");
Если ВидСравнения = Неопределено Тогда
сВидСравнения = ВидСравнения;
КонецЕсли;
сИспользование = СоответствиеПоискаОтбора.Получить("Использование");
Если сИспользование = Неопределено Тогда
сИспользование = нИспользование;
КонецЕсли;
Для каждого ЭлементОтбора Из Отбор.Элементы Цикл
Если ТолькоПоЛевомуЗначению Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать;
Иначе
Если (ЭлементОтбора.ЛевоеЗначение = сЛевоеЗначение)
И (ЭлементОтбора.ВидСравнения = сВидСравнения)
И (ЭлементОтбора.Использование = сИспользование) Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если НайденныйОтбор <> Неопределено Тогда
НайденныйОтбор.ЛевоеЗначение = нПоле;
НайденныйОтбор.Использование = нИспользование;
НайденныйОтбор.ВидСравнения = нВидСравнения;
НайденныйОтбор.ПравоеЗначение = нЗначение;
КонецЕсли;
КонецПроцедуры
Пример вызова процедуры:
Код 1C v 8.х
СоответствиеПоискаОтбора = Новый Соответствие;
СоответствиеПоискаОтбора.Вставить("ЛевоеЗначение",Новый ПолеКомпоновкиДанных("Наименование"));
СоответствиеПоискаОтбора.Вставить("ВидСравнения",ВидСравненияКомпоновкиДанных.Содержит);
СоответствиеПоискаОтбора.Вставить("Использование",Истина);
СоответствиеНовогоОтбора = Новый Соответствие;
СоответствиеНовогоОтбора.Вставить("ЛевоеЗначение",Новый ПолеКомпоновкиДанных("Наименование"));
СоответствиеНовогоОтбора.Вставить("ВидСравнения",ВидСравненияКомпоновкиДанных.Содержит);
СоответствиеНовогоОтбора.Вставить("Использование",Истина);
СоответствиеНовогоОтбора.Вставить("Значение","бла-бла-бла");
ИзменитьОтбор(КомпоновщикНастроек,СоответствиеПоискаОтбора,СоответствиеНовогоОтбора);
Автор: also
В данном материале приведены примеры и кейсы программного формирования отчетов с использованием системы компоновки данных. Статья в большей степени практическая, с конкретными рецептами кода для той или иной задачи.
Пример программного формирования отчета на СКД
&НаСервере Процедура СформироватьНаСервере(ТабДок) ОбъектОтчетНаСервере = РеквизитФормыВЗначение("Отчет"); // Здесь стоит обратить внимание, что мы можем работать с любым макетом, // не обязательно с основной схемой компоновки данных СхемаСКД = ОбъектОтчетНаСервере.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); КомпоновщикНастроекДанныхОтчета = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроекДанныхОтчета.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаСКД)); КомпоновщикНастроекДанныхОтчета.ЗагрузитьНастройки(СхемаСКД.НастройкиПоУмолчанию); // В том случае, если нам нужно учитывать настройки, выполненные пользователем, их необходимо загрузить КомпоновщикНастроекДанныхОтчета.ЗагрузитьПользовательскиеНастройки(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; Макет = КомпоновщикМакета.Выполнить(СхемаСКД, КомпоновщикНастроекДанныхОтчета.ПолучитьНастройки()); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(Макет); // Выведем полученные данные в табличный документ ТабДок.Очистить(); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ТабДок); ПроцессорВывода.Вывести(ПроцессорКомпоновки); КонецПроцедуры &НаКлиенте Процедура СформироватьОтчетПрограммно(Команда) // Для того, чтобы сделать код универсальнее, явным образом передадим табличный документ, куда будет выведен отчет. СформироватьНаСервере(Результат); Элементы.Результат.ОтображениеСостояния.Видимость = Ложь; Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать; КонецПроцедуры
Программная установка параметров и отборов в СКД
Для того чтобы программно установить параметр или отбор в отчете СКД, дополним рассмотренный выше пример.
Важно! Чтобы без дополнительного кода применять программно заданные настройки, соответствующие элементы (конкретные параметры, или строки отбора) необходимо исключить из пользовательских настроек! В противном случае, приоритет будут иметь пользовательские настройки.
// Использование текущих настроек компоновщика вместо настроек по умолчанию из схемы КомпоновщикНастроекДанныхОтчета.ЗагрузитьНастройки(ОбъектОтчетНаСервере.КомпоновщикНастроек.Настройки); // Параметры в СКД можно найти по имени параметра. ПараметрыДанных = КомпоновщикНастроекДанныхОтчета.Настройки.ПараметрыДанных.Элементы; ЭлементНачалоПериода = ПараметрыДанных.Найти("НачалоПериода"); ЭлементНачалоПериода.Использование = Истина; ЭлементНачалоПериода.Значение = ДАТА(2017,01,01,00,00,00); // В отличие от параметров, отбор необходимо обходить циклом и проверять каждую строку. // Кроме того, сравниваем не строки, а поля компоновки, используя ПолеКомпоновкиДанных ОтборКомпоновщика = КомпоновщикНастроекДанныхОтчета.Настройки.Отбор; Для Каждого ЭлементОтбора Из ОтборКомпоновщика.Элементы Цикл Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товар") Тогда ОтборКомпоновщика.Элементы.Удалить(ЭлементОтбора); КонецЕсли; КонецЦикла; НоменклатураОтбор = ОтборКомпоновщика.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); НоменклатураОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; НоменклатураОтбор.Использование = Истина; НоменклатураОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товар"); НоменклатураОтбор.ПравоеЗначение = Справочники.Товары.НайтиПоНаименованию("Авторучка");
Как программно изменить структуру отчета СКД
Иногда возникает задача в зависимости от разных условий изменять структуру отчета – включить одну группировку и выключить другую, заменить детальные записи на группировку по каким-нибудь полям, добавить новую группировку, изменить отбор на уровне группировки и т.п.
Для решения данного класса задач используется объект Структура. Следует иметь в виду, что структура имеет древовидный характер, и в общем виде обходить ее нужно рекурсивно.
// Добавим программно группировку по складу Структура = КомпоновщикНастроекДанныхОтчета.Настройки.Структура; ГруппировкаПоСкладу = Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); ГруппировкаПоСкладу.Имя = "Склад"; ГруппировкаПоСкладу.Использование = Истина; //группировка по полю "Склад". Если нужны детальные записи, то просто не заполняем ПоляГруппировки ПолеГруппировкиСклад = ГруппировкаПоСкладу.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ПолеГруппировкиСклад.Использование = Истина; ПолеГруппировкиСклад.Поле = Новый ПолеКомпоновкиДанных("Склад"); ПолеГруппировкиСклад.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы; //добавить выводимые поля в группировке: склад и количество приход. ВыбранноеПоле = ГруппировкаПоСкладу.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Склад"); ВыбранноеПоле = ГруппировкаПоСкладу.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("КоличествоПриход");
В случае, если нам понадобится добавить подчиненную (вложенную) группировку, нужно будет работать с коллекцией ГруппировкаПоСкладу.Структура. Принцип останется тот же – добавить при необходимости поля группировки, добавить выводимые поля. Также, на уровне конкретной группировки в структуре можно программно настроить отбор, сортировку, условное оформление и др.
Использование обработчика ПриКомпоновкеРезультата
У отчетов в 1С есть обработчик события ПриКомпоновкеРезультата. В контексте этого обработчика доступны объекты КомпоновщикНастроек и СхемаКомпоновкиДанных, если у отчета задана Основная схема компоновки данных.
Важный нюанс: данный обработчик не будет выполнен, если отчет формируется программно, как рассмотрено в примерах выше.
Начнем с простого формирования отчета, без учета пользовательских настроек:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки,,, Тип("ГенераторМакетаКомпоновкиДанных")); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; Результат = Новый ТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(Результат); ПроцессорВывода.Вывести(ПроцессорКомпоновки); ДокументРезультат.Вывести(Результат); КонецПроцедуры
Это по сути заготовка, шаблон для всех дальнейших манипуляций с отчетом. Подходы к работе с СКД в этом обработчике практически ничем не отличаются от рассмотренных выше.
Следующий распространенный вариант использования программного формирования отчета – вывод данных в таблицу значений или дерево значений. Ключевое отличие – другой тип генератора, и использование метода УстановитьОбъект вместо метода УстановитьДокумент.
//Вывод результата в Таблицу значений или Дерево значений Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; Результат = Новый ТаблицаЗначений; ПроцессорВывода.УстановитьОбъект(Результат); ПроцессорВывода.Вывести(ПроцессорКомпоновки); КонецПроцедуры
Схема компоновки данных представляет собой большой конструктор, состоящий из наборов данных, вычисляемых полей, описания итоговых полей (ресурсов), макетов, вариантов настроек и т.д. Схему компоновки достаточно удобно создавать в конфигураторе при помощи конструктора схемы компоновки.
Но на практике часто встречаются задачи, когда схему компоновки нужно программно создать с нуля или доработать существующую схему при помощи кода на встроенном языке, настроить вариант отчета – добавить отбор, установить условное оформление, добавить группировку и т.д. Такие задачи решаются на внедрениях при адаптации типовых конфигураций фирмы “1С” под требования конкретного заказчика.
В курсе Профессиональная разработка отчетов в 1С 8.3 на Системе Компоновки Данных (СКД) подробно рассматривается программная работа со схемой компоновки данных.
Задача действительно очень актуальная, участники Мастер-группы по СКД задают много вопросов на эту тему 🙂
Также традиционно много вопросов возникает при программной работе с пользовательскими настройками отчетов:
- Почему отличаются значения параметра в настройках компоновщика и в пользовательских настройках? Которое из этих значений используется для формирования отчета?
- Как связываются между собой настройки компоновщика и пользовательские настройки?
- Как установить значение отбора или параметра, если они вынесены в пользовательские настройки?
- И многие другие…
Поэтому мы опубликовали серию видеоуроков, в которых рассказывается, как работать со схемой компоновки программно.
Общая длительность всех видеоуроков – 1 час 5 минут.
Для того, чтобы Вам было проще ориентироваться в материале, мы указали тайминг наиболее важных моментов в видео.
Полезного просмотра 🙂
Видео 1 – Программное создание варианта отчета
00:37 – В каком обработчике можно расположить код для создания настроек компоновки
01:00 – Где в Синтакс-помощнике можно “подсмотреть” свойства, которые потребуются при написании кода
01:58 – Как настроить группировки отчета
02:28 – Какое свойство позволяет создавать вложенные группировки
03:11 – Как включить/выключить отдельные элементы настроек.
Видео 2 – Программное создание группировки
00:22 – Как создать структуру отчета
02:00 – Как указать поля, по которым выполняется группировка
04:10 – Как настроить выбранные поля
06:30 – Как создать автополе.
Видео 3 – Программное создание вложенной группировки
00:22 – Как создать подчиненную группировку
02:05 – Почему в отчете группировки могут выводиться несколько раз
02:40 – Как проверить наличие группировок в структуре отчета.
Видео 4 – Программное добавление отбора
00:18 – Где в Синтакс-помощнике найти типы данных, необходимые для создания отборов
00:55 – Какие свойства объекта типа ЭлементОтбораКомпоновкиДанных нужно использовать для создания отбора
01:20 – Как создать отбор при помощи программного кода.
Видео 5 – Программная установка сортировки
00:25– Где в Синтакс-помощнике найти типы данных, необходимые для включения сортировки
00:50 – Какие свойства объекта типа ЭлементПорядкаКомпоновкиДанных нужно использовать для включения сортировки
01:00 – Как установить сортировку при помощи программного кода.
Видео 6 – Программное добавление условного оформления
00:25 – Где в Синтакс-помощнике найти типы данных, необходимые для работы с условным оформлением
00:33 – Какие свойства объекта типа ЭлементУсловногоОформленияКомпоновкиДанных нужно использовать
02:08 – Как добавить условное оформление при помощи программного кода
02:31 – Как задать перечень полей, к которым будет применяться условное оформление
03:34 – Как отобрать оформляемые данные
04:15 – Как при помощи программного кода описать применяемое оформление.
Видео 7 – Программная работа с пользовательскими настройками
01:01 – Как программно установить значение параметра
02:00 – Почему значения параметров, выводимые на форму отчета, не совпадают со значениями в самом отчете
04:25 – Что делает метод ПолучитьНастройки
05:10 – Как нужно работать с пользовательскими настройками
06:17 – Для чего нужно свойство ИдентификаторПользовательскойНастройки
07:10 – Где в типовой конфигурации УТ 11 можно найти пример работы с пользовательскими настройками.
Видео 8 – Особенности использования метода ПолучитьНастройки
00:58 – Почему отличаются значения параметра в настройках компоновщика и в пользовательских настройках
01:23 – Как связываются между собой настройки компоновщика и пользовательские настройки
03:06 – Как работает метод ПолучитьНастройки и значение какого типа он возвращает
Видео 9 – Программное создание отборов в пользовательских настройках
00:34 – Чем отличается отбор в настройках компоновщика и отбор в пользовательских настройках
02:34 – Как используется свойство ИдентификаторПользовательскойНастройки
03:08 – Какой алгоритм должен использоваться для установки значения отбора в пользовательских настройках
03:42 – Как реализовать процедуру для установки значения отбора в пользовательских настройках.
Видео 10 – Программное создание схемы компоновки
00:40 – Как при компоновке отчета программно создать схему, по которой будет формироваться отчет
02:15 – Какой алгоритм должен использоваться для программного создания с нуля схемы компоновки
02:50 – Как программно создать источник данных схемы компоновки
04:00 – Как программно добавить в схему набор данных – объект
06:25 – Как программно добавить поля набора данных.
Хотите научиться грамотно создавать отчеты на СКД и дорабатывать отчеты в типовых конфигурациях?
Чтобы подробнее изучить возможности системы компоновки данных и уверенно применять механизм на практике, рекомендуем пройти курс Профессиональная разработка отчетов в 1С 8.3 на Системе Компоновки Данных (СКД)
1С отчет на СКД, программный отбор по списку значений
Порядок действий:
- В модуль объекта отчета добавить процедуру:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) ФильтрСКД = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); // в парамтр поля компоновки записываем наименование одного для доступных полей отбора // правое значение - это наименование фильтра // левое значение - это значение по которому будет отбор ПолеОтбора = Новый ПолеКомпоновкиДанных("Номер"); ФильтрСКД.ЛевоеЗначение = ПолеОтбора; ФильтрСКД.Использование = Истина; // Овновные варианты видов сравнения: // Больше // БольшеИлиРавно // ВСписке // Заполнено // Меньше // МеньшеИлиРавно // НеВСписке // НеЗаполнено // НеПодобно // НеРавно // НеСодержит // Подобно // Равно // Пример отбора по списку значений ФильтрСКД.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; СписокДляОтбора = Новый СписокЗначений; СписокДляОтбора.Добавить("123"); СписокДляОтбора.Добавить("456"); ФильтрСКД.ПравоеЗначение = СписокДляОтбора; // Пример отбора по одному значению ФильтрСКД.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ФильтрСКД.ПравоеЗначение = "123"; КонецПроцедуры
Связанные статьи
Публикация представляет из себя краткие примеры того, как можно заполнять параметры СКД программно так, чтобы все параметры и отборы были доступны в быстрых настройках и в обычных (типовых) настройках параметров и отборов СКД.
1. Пользовательские настройки СКД
При программном заполнении параметров отчета СКД часто возникает ситуация, когда нужно программно установить параметры отчета или добавить отборы.
Проблема возникает в том, что не всегда эти параметры или отборы отображаются на форме так, как нам бы хотелось.
В общем случае, для того, чтобы открыть отчет с заполненными параметрами используется следующая конструкция:
ПараметрыОткрытия = Новый Структура();
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыОткрытия.Вставить("Вариант", КомпоновщикНастроек.Настройки);
ПараметрыОткрытия.Вставить("ПользовательскиеНастройки", КомпоновщикНастроек.ПользовательскиеНастройки);
ОткрытьФорму("Отчет.муОтчет.Форма.ФормаОтчета", ПараметрыОткрытия, ЭтаФорма, Истина);
В данной статье описаны примеры того, как нужно заполнять параметры СКД, чтобы они отображались на форме так, как нужно, а именно Настройки и ПользовательскиеНастройки компоновщика данных.
1.1. Установка пользовательских параметров СКД
Для установки значения параметра обычно используется такая конструкция:
ПараметрКомпоновки = Новый ПараметрКомпоновкиДанных(ИмяПараметра);
ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрКомпоновки);
ПараметрСКД.Значение = Значение;
ПараметрСКД.Использование = Истина;
Данный код установит значение параметра, но при заполнении отчета переданными настройками значение параметра не отобразится на форме и реквизит будет пустым.
Для того, чтобы пользователь видел значение параметра на форме нужно добавить следующую конструкцию:
Если ЗначениеЗаполнено(ПараметрСКД.ИдентификаторПользовательскойНастройки) Тогда
ПользовательскийПараметр = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(
ПараметрСКД.ИдентификаторПользовательскойНастройки);
Если ТипЗнч(ПользовательскийПараметр) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
ПользовательскийПараметр.Значение = ПараметрСКД.Значение;
КонецЕсли;
КонецЕсли;
Данный код по значению идентификатора пользовательской настройки находит элемент этой настройки и устанавливает значение параметра еще и там.
1.2. Установка пользовательских отборов СКД
1.2.1. Пример открытия отчета с фиксированным отбором
В общем случае для того, чтобы открыть отчет с отбором можно использовать следующие конструкции
Отбор.Вставить("Номенклатура", ОтборПоНоменклатуре);
ПараметрыОткрытия = Новый Структура();
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыОткрытия.Вставить("Отбор", Отбор);
ОткрытьФорму("Отчет.муОтчет.Форма.ФормаОтчета", ПараметрыОткрытия, ЭтаФорма, Истина);
В данном случае форма откроется с отбором, но отбор не будет доступен для редактирования.
1.2.2. Пример открытия отчета с пользовательским отбором
Для того, чтобы отбор появился на форме и был доступен как в быстры отборах, так и на вкладке “отбор”, нужно использовать следующую конструкцию:
//Ищем пользовательский отбор
ПользовательскийОтбор = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(
КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);
ЭлементОтбораПользовательский = ПользовательскийОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбораПользовательский.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор();
ЭлементОтбораПользовательский.ВидСравнения = ВидСравнения;
ЭлементОтбораПользовательский.ЛевоеЗначение = ПолеКомпоновкиЭлемента;
ЭлементОтбораПользовательский.ПравоеЗначение = Значение;
ЭлементОтбораПользовательский.Использование = Истина;
В данном случае ненужно заполнять отбор обычных настроек компоновщика (так как в таком случае элементы формы будут задублированы), нужно взять из настроек идентификатор пользовательских настроек и по нему найти их.
После чего добавить отбор в пользовательские настройки. Он появится на форме, в быстрых настройках СКД, и на вкладке “Отборы”.
Если пользовательские отборы нужно объединить в группу отборов (“И”, “Или”, “Не”), тогда нужно сначала добавить группу пользовательского отбора:
ПользовательскийОтбор = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(
КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);
//Добавляем в пользовательский отбор группу
ГруппаОтбора = ПользовательскийОтбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
//Убрано для того, чтобы группа не показывалась на форме и в основных настройках, а была только на вкладке "Отбор"
//ГруппаОтбора.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор();
У группы отборов есть свойство “Элементы”, чтобы элемент отбора был подчинен данной группе (находился в этой группе) Отбор нужно добавлять именно в эту группу.
Т.е. вместо
ЭлементОтбораПользовательский = ПользовательскийОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Будет
ЭлементОтбораПользовательский = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));