Отборы динамического списка

08.08.22

Разработка - Механизмы платформы 1С

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

Скачать исходный код

Наименование Файл Версия Размер
Отборы динамического списка:
.epf 13,47Kb
503
.epf 13,47Kb 503 Скачать бесплатно

Объект динамический список содержит в себе следующие отборы:

  • Список.Отбор
  • Список.КомпоновщикНастроек.Настройки.Отбор
  • Список.КомпоновщикНастроек.ПользовательскиеНастройки.Отбор
  • Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор

Возникают вопросы:

  • Зачем столько отборов?
  • Какой надо использовать?
  • Как передать значения отборов при открытии формы?

Пробуем разобраться.

Зачем столько отборов?

Первое о чем хочется сказать, это:
Список.Отбор = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор

Т.е. если вы добавите отбор например вот так:

ЭлементОтбора = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = "Фиксированный отбор из кода";

то фактически увидите примененный отбор и в Список.Отбор.

Таким образом можно говорить о том, что управление отборами в динамическом списке выполняется только через компоновщик настроек. Далее можно рассматривать только три вида отборов:

  • Настройки.Отбор
  • ПользовательскиеНастройки.Отбор
  • ФиксированныеНастройки.Отбор

Рассмотрим их особенности и порядок применения отборов.

ФиксированныеНастройки.Отбор

Это настройки, которые недоступны пользователю для редактирования средствами платформы.
Управление фиксированными настройками выполняется программно в соответствии с логикой прикладного решения.

Пример кода, для открытия формы с условием на "Равно" или "В списке":

Отбор = Новый Структура;
	
Отбор.Вставить("Наименование", "Отбор ""Равно""");
// ИЛИ
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить("Отбор ""В списке 1""");
СписокЗначений.Добавить("Отбор ""В списке 2""");
Отбор.Вставить("Наименование", СписокЗначений);
// ИЛИ
Массив = Новый Массив;
Массив.Добавить("Отбор ""Массив 1""");
Массив.Добавить("Отбор ""Массив 2""");
Отбор.Вставить("Наименование", Массив);

ПараметрыФормы = Новый Структура("Отбор", Отбор);
ОткрытьФорму(ИмяФормыСписка(), ПараметрыФормы);

Произвольные фиксированные настройки можно передавать в форму списка:

НастройкиКомпоновкиДанных = Новый НастройкиКомпоновкиДанных;
 
ЭлементОтбора = НастройкиКомпоновкиДанных.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Подобно;
ЭлементОтбора.ПравоеЗначение = "Произвольный фиксированный отбор";
    
ПараметрыФормы = Новый Структура("ФиксированныеНастройки", НастройкиКомпоновкиДанных);
ОткрытьФорму(ИмяФормыСписка(), ПараметрыФормы);

Настройки.Отбор

Это настройки по умолчанию, они же доступны из конфигуратора в конструкторе формы.
Данные настройки будут применяться если пользователь нажмет "Еще - Установить стандартные настройки".

Способа передать эти настройки в форму через параметры не нашел.

ПользовательскиеНастройки.Отбор

 Это настройки,  которые доступны для редактирования пользователю через "Еще - Настройки списка ..." на закладке отбор.

Передавать эти настройки в общем случае нельзя, но если очень хочется то можно:

ПользовательскиеНастройкиКомпоновкиДанных = Новый ПользовательскиеНастройкиКомпоновкиДанных;
ОтборКомпоновкиДанных = ПользовательскиеНастройкиКомпоновкиДанных.Элементы.Добавить(Тип("ОтборКомпоновкиДанных"));
ОтборКомпоновкиДанных.ИдентификаторПользовательскойНастройки = "dfcece9d-5077-440b-b6b3-45a5cb4538eb";

ЭлементОтбора = ОтборКомпоновкиДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Подобно;
ЭлементОтбора.ПравоеЗначение = "Произвольный отбор";
    
ПараметрыФормы = Новый Структура("ПользовательскиеНастройки", ПользовательскиеНастройкиКомпоновкиДанных);
ОткрытьФорму(ИмяФормыСписка(), ПараметрыФормы);

Примечание: ГУИД в данном случае является магическим числом без которого не работает и которого нет в документации.

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

Список.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Список.КомпоновщикНастроек.ПользовательскиеНастройки);

Причем срабатывает это только "После открытия формы". Поэтому приходится дополнительно использовать "ПодключитьОбработчикОжидания"

Какие есть особенности в использовании отборов?

"Особенности", как известно - это место где дьявол скрывается в мелочах.

1. Пользовательские и фиксированные установки нельзя устанавливать на одно и то же поле.

Причина этого ограничения мне не понятна, возможно было бы меньше проблем если бы отборы фиксированных и пользовательских настроек объединялись через "И", но имеем что имеем:

Если пользователь установил отбор по тому же реквизиту, который используется в фиксированных настройках, то будет отображена ошибка:

 

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

Возможные решения:

  1. Передавать фиксированный отбор вместе с пустым отбором в пользовательских настройках с ГУИДом  "dfcece9d-5077-440b-b6b3-45a5cb4538eb".
  2. Научить пользователя отключать лишние отборы в случае появления данной ошибки.

2. Элементы пользовательского отбора имеют настройки.

Данные настройки определяют на какой закладке будет отображаться элемент пользовательской настройки.

Режим редактирования "Быстрый доступ" включает отображение данного отбора в группе пользовательских настроек.
Пользователь это видит вот так:

а в конфигураторе вот так:

3. Отбор пользовательских настроек это элемент коллекции "ПользовательскиеНастройки.Элементы".

В результате вывести на форму отбор пользовательских настроек можно только если на форме уже есть таблица "ПользовательскиеНастройки". Редактировать отбор можно только если элемент "ПользовательскиеНастроки" имеет включенную видимость и текущей строкой в нем является отбор. Возможным решением задачи "предоставить возможность редактирования пользовательских отборов прямо на форме списка" может быть:

  1. Создать на форме страницы без заголовка (так что бы пользователь не мог переключаться между страницами)
  2. Вывести на первую страницу таблицу с отборами.
  3. Вывести на вторую страницу таблицу с пользовательскими настроками.
  4. Программно установить в таблице пользовательских настроек в качестве текущей строки строку с отборами. 

Вот вроде бы и все. Во вложении обработка в которой выведены на форму все отборы.

Обработка и приведенных выше код проверялись на платформе версии 8.3.20, но должны работать и на более младших версиях.

Отбор динамический список

См. также

Сервисы интеграции без Шины и интеграции

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    2568    dsdred    16    

59

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    5928    dsdred    55    

83

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5878    YA_418728146    25    

68

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6981    dsdred    36    

113

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    19077    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12786    human_new    27    

76

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9411    YA_418728146    6    

143

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6531    sebekerga    54    

95
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Torin57 7 02.04.22 21:56 Сейчас в теме
ОтборКомпоновкиДанных.ИдентификаторПользовательскойНастройки = "dfcece9d-5077-440b-b6b3-45a5cb4538eb"

Нужно использовать именно это гуид или это может быть любой другой?
2. Gladkov_Anton 331 03.04.22 13:08 Сейчас в теме
(1) С любым другим - не работает.
Думаю, что параметр "ПользовательскиеНастройки" предназначен для передачи пользовательских настроек, которые ранее были созданы пользователем. В этом случае ГУИД там уже установлен.
При необходимости передать в форму начальные настройки, которые далее пользователь сможет менять надо использовать свои параметры формы (пример: создать свой параметр "Отбор").

На практике удобно воспользоваться передачей пользовательских настроек с ГУИДом указанным выше.
Это позволяет использовать открываемую форму выбора без изменений.
5. Дмитрий74Чел 234 16.11.22 11:20 Сейчас в теме
ГУИД в данном случае является магическим числом без которого не работает и которого нет в документации.
Прикрепленные файлы:
fatman78; G_116449793522595596167; +2 Ответить
3. quazare 3606 03.04.22 19:23 Сейчас в теме
интересная статья! спасибо за материал!
4. user1675974 22.06.22 15:36 Сейчас в теме
При возникновении ошибки "Невозможно применить фиксированные настройки" можно еще очищать перед отбором пользовательские значения:
ПользовательскийОтбор = Форма.СписокДокументыПоступления.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Форма.СписокДокументыПоступления.КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);
    ПользовательскийОтбор.Элементы.Очистить();
UnsavedSoul; krestyaninov; +2 Ответить
6. Crush 06.04.23 18:43 Сейчас в теме
Блин! Группа пользовательских настроек. Вот оно как решалось🙈
Спасибо!
Serg2000mr; +1 Ответить
7. user757763 13.04.23 16:57 Сейчас в теме
а не работает вообще ! отбор устанавливается, а динамический список остается пустым
asdPerepel; jollyk; +2 Ответить
8. Embustero 20.06.23 18:51 Сейчас в теме
Настройки.Отбор

Это настройки по умолчанию, они же доступны из конфигуратора в конструкторе формы.
Данные настройки будут применяться если пользователь нажмет "Еще - Установить стандартные настройки".

Способа передать эти настройки в форму через параметры не нашел.


Чтобы настройки применялись в пользовательском режиме (точнее были полностью заполнены) необходимо указывать ИдентификаторПользовательскойНастройки в самом конце.

Пример из типовой:

	Элемент = ОбластьДобавления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
	Элемент.ВидСравнения = ВидСравнения;
	
	Если РежимОтображения = Неопределено Тогда
		Элемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	Иначе
		Элемент.РежимОтображения = РежимОтображения;
	КонецЕсли;
	
	Если ПравоеЗначение <> Неопределено Тогда
		Элемент.ПравоеЗначение = ПравоеЗначение;
	КонецЕсли;
	
	Если Представление <> Неопределено Тогда
		Элемент.Представление = Представление;
	КонецЕсли;
	
	Если Использование <> Неопределено Тогда
		Элемент.Использование = Использование;
	КонецЕсли;
	
	// Важно: установка идентификатора должна выполняться
	// в конце настройки элемента, иначе он будет скопирован
	// в пользовательские настройки частично заполненным.
	Если ИдентификаторПользовательскойНастройки <> Неопределено Тогда
		Элемент.ИдентификаторПользовательскойНастройки = ИдентификаторПользовательскойНастройки;
	ИначеЕсли Элемент.РежимОтображения <> РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный Тогда
		Элемент.ИдентификаторПользовательскойНастройки = ИмяПоля;
	КонецЕсли;
Показать



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

	
	Для каждого Элемент Из Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы  Цикл
		
		ЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ЭлементОтбора.ВидСравнения = Элемент.ВидСравнения;
		ЭлементОтбора.ЛевоеЗначение = Элемент.ЛевоеЗначение;
		ЭлементОтбора.ПравоеЗначение = Элемент.ПравоеЗначение;
		ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
		ЭлементОтбора.Использование = Истина;  
		ЭлементОтбора.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор();
		
	КонецЦикла;  
	
	Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Очистить();
Показать
user1686374; user1798793; +2 Ответить
Оставьте свое сообщение