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

08.08.22

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Бесплатно
Отборы динамического списка:
.epf 13,47Kb
609
609 Скачать бесплатно

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Отбор = Новый Структура;
	
Отбор.Вставить("Наименование", "Отбор ""Равно""");
// ИЛИ
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить("Отбор ""В списке 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)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7479    bayselonarrend    20    

154

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

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

13.03.2024    5952    dsdred    16    

80

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

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

24.01.2024    17738    YA_418728146    26    

71

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

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

11.12.2023    11241    dsdred    44    

130

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

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

06.10.2023    23772    SeiOkami    48    

135

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

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

14.09.2023    18849    human_new    27    

80

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

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

28.08.2023    14758    YA_418728146    7    

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

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

На практике удобно воспользоваться передачей пользовательских настроек с ГУИДом указанным выше.
Это позволяет использовать открываемую форму выбора без изменений.
5. Дмитрий74Чел 239 16.11.22 11:20 Сейчас в теме
ГУИД в данном случае является магическим числом без которого не работает и которого нет в документации.
Прикрепленные файлы:
SagittariusA; DrAku1a; fatman78; G_116449793522595596167; +4 Ответить
3. quazare 3801 03.04.22 19:23 Сейчас в теме
интересная статья! спасибо за материал!
4. user1675974 22.06.22 15:36 Сейчас в теме
При возникновении ошибки "Невозможно применить фиксированные настройки" можно еще очищать перед отбором пользовательские значения:
ПользовательскийОтбор = Форма.СписокДокументыПоступления.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Форма.СписокДокументыПоступления.КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);
    ПользовательскийОтбор.Элементы.Очистить();
Goggy; UnsavedSoul; krestyaninov; +3 Ответить
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 Сейчас в теме
Настройки.Отбор

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

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


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

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

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



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

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