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

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

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

Метод 1. Использование встроенных пользовательских настроек (без кода)

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

  1. Откроем конфигуратор и перейдем в свойства формы списка документа РеализацияТоваровУслуг.
  2. Найдем основной реквизит формы с типом ДинамическийСписок (обычно он называется Список).
  3. Нажмем на ссылку «Настройка списка» в окне свойств.
  4. Перейдем на вкладку «Отбор». Выберем поле Контрагент и перенесем его в правую часть окна.
  5. Самый важный шаг: для поля Контрагент в колонке «Режим отображения» установим значение «Быстрый доступ».

Результат: Платформа автоматически создаст над списком документов поле ввода. Оно связано напрямую с механизмом компоновки данных. При выборе значения список будет перестраиваться автоматически без лишних строк кода, а интерфейс будет соответствовать стандартам мобильной платформы.

Метод 2. Программное управление отбором через событие при изменении

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

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

Для начала создадим на форме реквизит (например, ОтборКонтрагент) с типом СправочникСсылка.Контрагенты и вынесем его на форму. Далее создадим обработчик события ПриИзменении для этого поля.


&НаКлиенте
Процедура ОтборКонтрагентПриИзменении(Элемент)
    УстановитьПрограммныйОтбор();
КонецПроцедуры

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

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

Анализ типичных ошибок при программной установке отбора

Рассмотрим ситуацию, описанную автором в сообщении №15, где список становился пустым. Выясним причину этой проблемы. Автор использовал ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе. В системе компоновки данных это означает отрицание всех условий внутри группы. То есть вместо «Показать документы по этому контрагенту», система выполняла команду «Скрыть документы по этому контрагенту».

Важные моменты при работе с группами отбора:

Если вам нужно просто отфильтровать список по одному полю, использовать группы (ГруппаЭлементовОтбораКомпоновкиДанных) излишне. Достаточно простого элемента ЭлементОтбораКомпоновкиДанных, как показано в примере выше.

Метод 3. Работа с пользовательскими настройками через идентификаторы

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

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


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

Оптимизация для планшетов

При разработке под планшеты рекомендуется обратить внимание на следующие настройки элементов формы:

  1. Режим выбора из списка: Если контрагентов немного, установите свойство РежимВыбораИзСписка в Истина. Это откроет удобное полноэкранное меню выбора вместо стандартного маленького списка.
  2. Кнопка очистки: Обязательно включите свойство КнопкаОчистки у поля ввода контрагента. На сенсорных экранах это гораздо удобнее, чем стирать текст виртуальной клавиатурой.
  3. Автозаполнение: Включите АвтоВыборНезаполненного, чтобы при открытии формы фокус сразу стоял на поле фильтра, если это основной сценарий работы пользователя.

Подводя итог, можно сказать, что наиболее стабильным решением является использование штатного «Быстрого доступа» в настройках динамического списка. Если же требуется сложная логика, используйте прямое управление элементами Список.Отбор.Элементы, обязательно проверяя типы сравнения и корректность очистки предыдущих значений отбора, чтобы избежать пустых списков или дублирования условий.

← На главную