ОтборДинамическогоСписка (БСП)

Отбор динамического списка. Определяет отбор динамического списка в зависимости от наличия режима совместимости.
// Определяет отбор динамического списка в зависимости от наличия режима совместимости. // // Параметры: // Список - ДинамическийСписок - список, для которого надо определить отбор. // // Возвращаемое значение: // Отбор - требуемый отбор. // Функция ОтборДинамическогоСписка(Список) Экспорт Возврат Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор; КонецФункции /////////////////////////////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2019, ООО 1С-Софт // Все права защищены. Эта программа и сопроводительные материалы предоставляются // в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) // Текст лицензии доступен по ссылке: // https://creativecommons.org/licenses/by/4.0/legalcode ///////////////////////////////////////////////////////////////////////////////////////////////////////
// Определяет отбор динамического списка в зависимости от наличия режима совместимости. // // Параметры: // Список - ДинамическийСписок - список, для которого надо определить отбор. // // Возвращаемое значение: // Отбор - требуемый отбор. // Функция ОтборДинамическогоСписка(Список) Экспорт Возврат Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор; КонецФункции /////////////////////////////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2019, ООО 1С-Софт // Все права защищены. Эта программа и сопроводительные материалы предоставляются // в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) // Текст лицензии доступен по ссылке: // https://creativecommons.org/licenses/by/4.0/legalcode ///////////////////////////////////////////////////////////////////////////////////////////////////////
Отборы динамического списка
Объект динамический список содержит в себе следующие отборы:
- Список.Отбор
- Список.КомпоновщикНастроек.Настройки.Отбор
- Список.КомпоновщикНастроек.ПользовательскиеНастройки.Отбор
- Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор
- Зачем столько отборов?
- Какой надо использовать?
- Как передать значения отборов при открытии формы?
Зачем столько отборов?
Первое о чем хочется сказать, это:
Список.Отбор = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор
Т.е. если вы добавите отбор например вот так:
ЭлементОтбора = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = "Фиксированный отбор из кода";
то фактически увидите примененный отбор и в Список.Отбор.
Таким образом можно говорить о том, что управление отборами в динамическом списке выполняется только через компоновщик настроек. Далее можно рассматривать только три вида отборов:
- Настройки.Отбор
- ПользовательскиеНастройки.Отбор
- ФиксированныеНастройки.Отбор
Рассмотрим их особенности и порядок применения отборов.
ФиксированныеНастройки.Отбор
Это настройки, которые недоступны пользователю для редактирования средствами платформы.
Управление фиксированными настройками выполняется программно в соответствии с логикой прикладного решения.
Пример кода, для открытия формы с условием на «Равно» или «В списке»:
Отбор = Новый Структура; Отбор.Вставить("Наименование", "Отбор ""Равно"""); // ИЛИ СписокЗначений = Новый СписокЗначений; СписокЗначений.Добавить("Отбор ""В списке 1"""); СписокЗначений.Добавить("Отбор ""В списке 2"""); Отбор.Вставить("Наименование", СписокЗначений); // ИЛИ Массив = Новый Массив; Массив.Добавить("Отбор ""Массив 1"""); Массив.Добавить("Отбор ""Массив 2"""); Отбор.Вставить("Наименование", Массив); ПараметрыФормы = Новый Структура("Отбор", Отбор); ОткрытьФорму(ИмяФормыСписка(), ПараметрыФормы);
Произвольные фиксированные настройки можно передавать в форму списка:
НастройкиКомпоновкиДанных = Новый НастройкиКомпоновкиДанных; ЭлементОтбора = НастройкиКомпоновкиДанных.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.Использование = Истина; ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Подобно; ЭлементОтбора.ПравоеЗначение = "Произвольный фиксированный отбор"; ПараметрыФормы = Новый Структура("ФиксированныеНастройки", НастройкиКомпоновкиДанных); ОткрытьФорму(ИмяФормыСписка(), ПараметрыФормы);
Настройки.Отбор
Это настройки по умолчанию, они же доступны из конфигуратора в конструкторе формы.
Данные настройки будут применяться если пользователь нажмет «Еще — Установить стандартные настройки«.
Способа передать эти настройки в форму через параметры не нашел.
ПользовательскиеНастройки.Отбор
Это настройки, которые доступны для редактирования пользователю через «Еще — Настройки списка . » на закладке отбор.

Передавать эти настройки в общем случае нельзя, но если очень хочется то можно:
ПользовательскиеНастройкиКомпоновкиДанных = Новый ПользовательскиеНастройкиКомпоновкиДанных; ОтборКомпоновкиДанных = ПользовательскиеНастройкиКомпоновкиДанных.Элементы.Добавить(Тип("ОтборКомпоновкиДанных")); ОтборКомпоновкиДанных.ИдентификаторПользовательскойНастройки = "dfcece9d-5077-440b-b6b3-45a5cb4538eb"; ЭлементОтбора = ОтборКомпоновкиДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.Использование = Истина; ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Подобно; ЭлементОтбора.ПравоеЗначение = "Произвольный отбор"; ПараметрыФормы = Новый Структура("ПользовательскиеНастройки", ПользовательскиеНастройкиКомпоновкиДанных); ОткрытьФорму(ИмяФормыСписка(), ПараметрыФормы);
Примечание: ГУИД в данном случае является магическим числом без которого не работает и которого нет в документации.
При использовании данного подхода выяснилась еще одна особенность: при открытии формы, переданные таким образом настройки не отображаются в группе пользовательских настроек. Для обновления содержимого группы при открытии формы приходится выполнять:
Список.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Список.КомпоновщикНастроек.ПользовательскиеНастройки);
Причем срабатывает это только «После открытия формы». Поэтому приходится дополнительно использовать «ПодключитьОбработчикОжидания»
Какие есть особенности в использовании отборов?
«Особенности», как известно — это место где дьявол скрывается в мелочах.
1. Пользовательские и фиксированные установки нельзя устанавливать на одно и то же поле.
Причина этого ограничения мне не понятна, возможно было бы меньше проблем если бы отборы фиксированных и пользовательских настроек объединялись через «И», но имеем что имеем:
Если пользователь установил отбор по тому же реквизиту, который используется в фиксированных настройках, то будет отображена ошибка:

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

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


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

3. Отбор пользовательских настроек это элемент коллекции «ПользовательскиеНастройки.Элементы».
В результате вывести на форму отбор пользовательских настроек можно только если на форме уже есть таблица «ПользовательскиеНастройки». Редактировать отбор можно только если элемент «ПользовательскиеНастроки» имеет включенную видимость и текущей строкой в нем является отбор. Возможным решением задачи «предоставить возможность редактирования пользовательских отборов прямо на форме списка» может быть:
- Создать на форме страницы без заголовка (так что бы пользователь не мог переключаться между страницами)
- Вывести на первую страницу таблицу с отборами.
- Вывести на вторую страницу таблицу с пользовательскими настроками.
- Программно установить в таблице пользовательских настроек в качестве текущей строки строку с отборами.
Вот вроде бы и все. Во вложении обработка в которой выведены на форму все отборы.
Обработка и приведенных выше код проверялись на платформе версии 8.3.20, но должны работать и на более младших версиях.
См. также
Планы обмена VS История данных
Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?
11.12.2023 3857 dsdred 23
84 23 3857
1С-ная магия
Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?».
06.10.2023 15837 SeiOkami 46
114 46 15837
Дефрагментация и реиндексация после перехода на платформу 8.3.22
Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.
14.09.2023 9763 human_new 27
69 27 9763
Валидация JSON через XDTO (включая массивы)
При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.
28.08.2023 6504 YA_418728146 6
124 6 6504
Внешние компоненты Native API на языке Rust — Просто!
Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust — от безопасности и кроссплатформенности до удобного менеджера библиотек.
20.08.2023 5447 sebekerga 54
90 54 5447
Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)
Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать
27.06.2023 12337 SeiOkami 24
93 24 12337
Методы работы с универсальным отчетом в подсистеме «Варианты отчетов» на БСП
В данной статье рассмотрим типовую подсистему «Варианты отчетов» БСП на примере применения в универсальном отчете любой современной конфигурации.
30.05.2023 4372 quazare 4
Расширение глобального поиска 1С, или Глобальный поиск «на максималках»
Мало кто знает, что поле «Глобального поиска» в 1С можно доработать. Добавить свои варианты поиска, кнопочки в результатах и даже целые пользовательские меню.
27.03.2023 6305 SeiOkami 10
133 10 6305
Посмотреть ещё
Комментарии
- Дата
- Дата
- Рейтинг всех уровней
- Рейтинг 1-го уровня
- Древо развёрнутое
- Древо свернутое
Свернуть все
1. Torin57 7 02.04.22 21:56 Сейчас в теме
ОтборКомпоновкиДанных.ИдентификаторПользовательскойНастройки = "dfcece9d-5077-440b-b6b3-45a5cb4538eb"
Нужно использовать именно это гуид или это может быть любой другой?
2. Gladkov_Anton 317 03.04.22 13:08 Сейчас в теме
(1) С любым другим — не работает.
Думаю, что параметр «ПользовательскиеНастройки» предназначен для передачи пользовательских настроек, которые ранее были созданы пользователем. В этом случае ГУИД там уже установлен.
При необходимости передать в форму начальные настройки, которые далее пользователь сможет менять надо использовать свои параметры формы (пример: создать свой параметр «Отбор»).
На практике удобно воспользоваться передачей пользовательских настроек с ГУИДом указанным выше.
Это позволяет использовать открываемую форму выбора без изменений.
5. Дмитрий74Чел 233 16.11.22 11:20 Сейчас в теме
ГУИД в данном случае является магическим числом без которого не работает и которого нет в документации.
Прикрепленные файлы:
fatman78; G_116449793522595596167; + 2 – Ответить
3. quazare 3529 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 Сейчас в теме
а не работает вообще ! отбор устанавливается, а динамический список остается пустым
8. Embustero 20.06.23 18:51 Сейчас в теме
Это настройки по умолчанию, они же доступны из конфигуратора в конструкторе формы.
Данные настройки будут применяться если пользователь нажмет «Еще — Установить стандартные настройки».
Способа передать эти настройки в форму через параметры не нашел.
Чтобы настройки применялись в пользовательском режиме (точнее были полностью заполнены) необходимо указывать ИдентификаторПользовательскойНастройки в самом конце.
Пример из типовой:
Элемент = ОбластьДобавления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля); Элемент.ВидСравнения = ВидСравнения; Если РежимОтображения = Неопределено Тогда Элемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; Иначе Элемент.РежимОтображения = РежимОтображения; КонецЕсли; Если ПравоеЗначение <> Неопределено Тогда Элемент.ПравоеЗначение = ПравоеЗначение; КонецЕсли; Если Представление <> Неопределено Тогда Элемент.Представление = Представление; КонецЕсли; Если Использование <> Неопределено Тогда Элемент.Использование = Использование; КонецЕсли; // Важно: установка идентификатора должна выполняться // в конце настройки элемента, иначе он будет скопирован // в пользовательские настройки частично заполненным. Если ИдентификаторПользовательскойНастройки <> Неопределено Тогда Элемент.ИдентификаторПользовательскойНастройки = ИдентификаторПользовательскойНастройки; ИначеЕсли Элемент.РежимОтображения <> РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный Тогда Элемент.ИдентификаторПользовательскойНастройки = ИмяПоля; КонецЕсли;
Например если нужно отбор из параметров, который устанавливается в фиксированный отбор, перенести в пользовательские настройки
Для каждого Элемент Из Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы Цикл ЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ВидСравнения = Элемент.ВидСравнения; ЭлементОтбора.ЛевоеЗначение = Элемент.ЛевоеЗначение; ЭлементОтбора.ПравоеЗначение = Элемент.ПравоеЗначение; ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; ЭлементОтбора.Использование = Истина; ЭлементОтбора.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор(); КонецЦикла; Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Очистить();
Отслеживание изменения отбора в динамическом списке
В табличном поле не предусмотрено специальных событий, позволяющих отследить установку, изменение или отключение отбора в динамическом списке. Однако, в некоторых случаях может потребоваться контролировать изменение отбора в связанном с табличным полем динамическом списке. Для решения данной задачи предназначен метод ПодключитьОбработчикИзмененияДанных формы. Данный метод имеет три параметра: ИмяДанных , ИмяПроцедуры и ОтслеживатьПодчиненныеДанные .
Параметр ИмяДанных указывает строку — путь к данным, изменение которых необходимо отслеживать. Для отслеживания любых изменений отбора данный параметр должен содержать строку, указывающую путь к свойству Отбор связанного с табличным полем динамического списка. Если требуется отслеживать изменение только определенного элемента отбора, то данный параметр должен содержать путь к требуемому элементу отбора.
Параметр ИмяПроцедуры указывает имя процедуры, подключаемой в качестве обработчика изменения данных. Важно отметить, что данная процедура должна иметь один параметр — путь к данным, в который при вызове обработчика будет передана строка — путь к измененным данным.
Параметр ОтслеживатьПодчиненныеДанные указывает на необходимость вызова процедуры — обработчика при изменении данных, подчиненных заданным в параметре ИмяДанных . Для отслеживания любых изменений отбора данный параметр должен иметь значение Истина . Если требуется отслеживать только изменение определенного элемента отбора, то данный параметр должен иметь значение Ложь .
Поясним использование данного метода на следующем примере. Пусть существует форма списка расходных накладных. В форме расположено табличное поле, отображающее список расходных накладных. Требуется отображать в нижней части формы установленный в текущий момент отбор.
Для отображения установленного отбора используем элемент управления типа Надпись . В форме списка документов данный элемент управления имеет имя СтрокаОтбора .
Для отслеживания изменения отбора в списке расходных накладных подключим обработчик изменения данных. Для этого используем событие ПриОткрытии() формы :
ПодключитьОбработчикИзмененияДанныхВ процедуре - обработчике изменения отбора сформируем строку, представляющую установленный в текущий момент отбор.
СтрокаОтбора СтрокаОтбора
1с как установить отбор в динамическом списке
Как сделать отбор в динамическом списке?
ДобОтбор = ИерархияНоменклатуры.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ДобОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ДобОтбор.ПравоеЗначение = Справочники.Номенклатура.НайтиПоНаименованию("Продукция");
ДобОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
ДобОтбор.Использование = Истина;
ДобОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ДобОтбор.ПравоеЗначение = Справочники.Номенклатура.НайтиПоНаименованию("Продукция");
ДобОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
ДобОтбор.Использование = Истина;
Эти способы не работают, и если не программно, а через формы устанавливать отбор тоже не работает, конфигурация ERP, форма списка номенклатуры
для БСП есть одна строчка ОтборыСписковКлиентСервер.УстановитьЭлементОтбораСписка()
(1) нет такой строчки
вот ее код.
// Устанавливает элемент отбор динамического списка
//
// Параметры:
// Список - обрабатываемый динамический список,
// ИмяПоля - имя поля компоновки, отбор по которому нужно установить,
// ВидСравнения - вид сравнения отбора, по умолчанию - Равно,
// ПравоеЗначение - значение отбора
//
Процедура УстановитьЭлементОтбораСписка(Список, ИмяПоля, ПравоеЗначение, ВидСравнения = Неопределено, Представление = "") Экспорт
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
ЭлементОтбора.ВидСравнения = ?(ВидСравнения = Неопределено, ВидСравненияКомпоновкиДанных.Равно, ВидСравнения);
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = ПравоеЗначение;
ЭлементОтбора.Представление = Представление;
(1) в БСП оно переехало в ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ЭлементОформления.Отбор, "Непрочитана", ВидСравненияКомпоновкиДанных.Равно, Истина);
очень давно. и рядом еще функции полезные.





