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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда программно установленный отбор в динамическом списке успешно фильтрует данные, но совершенно не отображается в пользовательском интерфейсе. Пользователь открывает окно «Все действия — Настроить список», но не видит там примененного фильтра. Это создает путаницу: данные обрезаны, а причин в настройках не видно.

В этой статье мы разберем, почему так происходит, проанализируем различные механизмы компоновки данных и научимся правильно выводить программные отборы «на свет».

Почему отбор работает, но его не видно?

Для начала выясним причину «невидимости». В динамическом списке существует несколько уровней (коллекций) отборов. Рассмотрим их подробнее:

  1. Фиксированные настройки (Список.Отбор): Когда мы обращаемся напрямую к Список.Отбор, мы работаем с так называемыми жесткими фильтрами. Платформа задумывала их как средство ограничения данных, которое пользователь не должен менять (например, фильтрация по организации в рамках прав доступа). Такие отборы никогда не отображаются в стандартном окне настроек.
  2. Основные настройки (Список.КомпоновщикНастроек.Настройки): Это «скелет» отбора. Здесь описываются правила, которые 1С предлагает использовать по умолчанию.
  3. Пользовательские настройки: Это именно то, что видит пользователь в экранных формах. Если настройка из основного состава не связана специальным идентификатором с пользовательской настройкой, она останется «за кулисами».

Решение 1: Правильное использование Компоновщика настроек

Чтобы отбор стал видимым, мы должны добавлять его не в коллекцию Список.Отбор, а непосредственно в настройки компоновщика. Но и этого недостаточно. Ключевым моментом является ИдентификаторПользовательскойНастройки. Рассмотрим по шагам, как это реализовать.

Проанализируем пример кода, который позволит добавить отбор и сделать его доступным для изменения пользователем:


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

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

    // 3. САМЫЙ ВАЖНЫЙ ШАГ: Привязка к пользовательским настройкам
    // Без установки этого идентификатора отбор не появится в окне "Настроить список"
    НовыйЭлемент.ИдентификаторПользовательскойНастройки = Список.КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки;

КонецПроцедуры

В данном примере мы используем Список.КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки. Это стандартный идентификатор всей группы отборов. Присваивая его конкретному элементу, мы говорим системе: «Этот элемент входит в состав тех настроек, которые редактирует пользователь».

Решение 2: Работа напрямую с Пользовательскими настройками

Иногда система ведет себя капризно, и изменения в Настройках не сразу синхронизируются с экранной формой. В таких случаях можно попробовать найти элемент непосредственно в коллекции пользовательских настроек. Рассмотрим этот вариант подробнее.

Выясним, как программно добраться до значений, которые пользователь видит «здесь и сейчас»:


&НаСервере
Процедура УстановитьОтборВПользовательскихНастройках()

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

КонецПроцедуры

Важный нюанс: при таком подходе нужно быть осторожным. Если пользователь уже настроил свои фильтры, программная очистка коллекции ПользовательскиеОтборы.Элементы.Очистить() удалит все его ручные настройки. Правильнее будет сначала искать существующий элемент по полю компоновки и обновлять его значение.

Анализ режимов отображения

В коде часто встречается свойство РежимОтображения. Давайте разберем, на что оно влияет, так как это напрямую связано с видимостью отбора:

Типичные ошибки при реализации

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

  1. Неверное имя поля: Если в схеме (запросе) динамического списка поле называется ДатаДокумента, а в ПолеКомпоновкиДанных вы передаете "Дата", 1С не выдаст ошибку, но отбор не применится или не отобразится, так как поле не будет найдено в доступных полях компоновки.
  2. Конфликт с фиксированными настройками: Если вы установили отбор и в Список.Отбор (фиксированный), и в пользовательские настройки, то сработают оба. В итоге пользователь может увидеть в интерфейсе «Исполнитель = Иванов», но если в фиксированных настройках стоит «Исполнитель = Петров», список будет пуст, и пользователь не поймет почему. Рекомендация: используйте либо одно, либо другое.
  3. Отсутствие обновления: После программного изменения настроек на клиенте иногда требуется вызвать метод Обновить() для таблицы формы, хотя обычно динамический список обновляется автоматически при изменении компоновщика.

Итоговый алгоритм действий

Подведем итог. Чтобы ваш отбор гарантированно появился в «Настроить список», следуйте этому алгоритму:

1. Работайте с Список.КомпоновщикНастроек.Настройки.Отбор.

2. Обязательно заполняйте ЛевоеЗначение через объект Новый ПолеКомпоновкиДанных("ИмяПоля").

3. Устанавливайте ИдентификаторПользовательскойНастройки, копируя его из общих настроек отбора компоновщика.

4. Выбирайте подходящий РежимОтображения (Обычный или БыстрыйДоступ).

Использование этого подхода сделает ваши интерфейсы прозрачными и понятными для пользователей, исключая вопросы о «пропавших» документах или записях в списках.

← На главную