1с как установить отбор в динамическом списке
Перейти к содержимому

1с как установить отбор в динамическом списке

  • автор:

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

  • Отбор динамического списка. Определяет отбор динамического списка в зависимости от наличия режима совместимости.

    // Определяет отбор динамического списка в зависимости от наличия режима совместимости. // // Параметры: // Список - ДинамическийСписок - список, для которого надо определить отбор. // // Возвращаемое значение: // Отбор - требуемый отбор. // Функция ОтборДинамическогоСписка(Список) Экспорт Возврат Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор; КонецФункции /////////////////////////////////////////////////////////////////////////////////////////////////////// // 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 ///////////////////////////////////////////////////////////////////////////////////////////////////////

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

    • image.png
    • image.png
    • image.png
    • image.png
    • image.png
    • image.png

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    См. также

    Планы обмена 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) в БСП оно переехало в ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ЭлементОформления.Отбор, "Непрочитана", ВидСравненияКомпоновкиДанных.Равно, Истина);

    очень давно. и рядом еще функции полезные.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *