Как программно установить отбор в динамическом списке 1С: полный разбор методов

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

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

Постановка задачи

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

Разберем три основных способа реализации:

  1. Передача отбора при открытии формы (самый простой способ).
  2. Прямая работа с Компоновщиком Настроек (гибкий способ).
  3. Использование функций Библиотеки Стандартных Подсистем (БСП).

Способ 1: Передача отбора через параметры формы

Если наша задача — открыть форму и сразу установить фильтр, самым эффективным и быстрым способом является использование стандартного параметра формы Отбор. Платформа 1С автоматически обрабатывает структуру, переданную в этот параметр, и накладывает фильтр на основной реквизит формы (обычно это динамический список Список).

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


// Создаем структуру для отбора
// Ключ структуры - имя поля отбора (как в запросе динамического списка)
// Значение структуры - значение, по которому фильтруем
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ВидНоменклатуры", Справочники.ВидыНоменклатуры.Товар);
ПараметрыОтбора.Вставить("ЭтоГруппа", Ложь);

// Формируем параметры открытия формы
ПараметрыФормы = Новый Структура("Отбор", ПараметрыОтбора);

// Открываем форму
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаСписка", ПараметрыФормы);

Важные нюансы этого метода:

Способ 2: Программная работа с Компоновщиком Настроек

Иногда нам нужно установить отбор уже после открытия формы (например, по нажатию кнопки) или нам требуется сложное условие (например, вид сравнения "Больше", "Содержит" или группировка условий "ИЛИ"). В этом случае простой структурой не обойтись. Нам придется работать с объектом КомпоновщикНастроек динамического списка. Помимо вывода данных, в списках можно реализовать и визуальные элементы управления, например, индикатор прогресса в ячейке динамического списка.

Проанализируем структуру работы. Динамический список использует СКД. У него есть настройки, а в настройках есть коллекция элементов отбора. Наша задача — добавить туда новый элемент.

Рассмотрим универсальный алгоритм добавления отбора:


// Процедура для установки отбора на клиенте или сервере
// Список - реквизит формы типа ДинамическийСписок
// Поле - Строка, имя поля отбора
// Значение - Значение отбора
// ВидСравнения - (Необязательно) ВидСравненияКомпоновкиДанных

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

Вызов этой процедуры будет выглядеть так:


// Установить отбор по цене больше 1000
УстановитьОтборВДинамическомСписке(Список, "Цена", 1000, ВидСравненияКомпоновкиДанных.Больше);

Способ 3: Использование БСП (Библиотека Стандартных Подсистем)

В большинстве современных конфигураций (1С:ERP, Управление Торговлей 11, Бухгалтерия 3.0 и др.) внедрена Библиотека Стандартных Подсистем. Она содержит готовые модули, которые значительно упрощают написание кода. Если вы активно используете этот механизм, рекомендуем изучить подробный справочник по методам БСП с примерами использования, чтобы не изобретать велосипед.

Используйте модуль ОбщегоНазначенияКлиентСервер (для работы и на клиенте, и на сервере).

Рассмотрим пример использования функции БСП:


// Синтаксис:
// ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
//     ДинамическийСписок, 
//     ИмяПоля, 
//     ПравоеЗначение, 
//     ВидСравнения, 
//     Представление, 
//     Использование, 
//     РежимОтображения, 
//     ИдентификаторПользовательскойНастройки
// );

// Пример вызова:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
    Список, 
    "Контрагент", 
    Объект.Контрагент, 
    ВидСравненияКомпоновкиДанных.Равно,
    "Отбор по контрагенту",
    Истина
);

Этот метод сам проверит, существует ли уже отбор по этому полю, обновит его или создаст новый. Это самый безопасный и рекомендуемый метод для типовых конфигураций.

Особенности работы с Пользовательскими настройками

Один из самых сложных моментов при программной работе с отборами в управляемых формах 8.3 — это разделение настроек на Основные и Пользовательские.

Если форма открыта, и вы меняете Список.КомпоновщикНастроек.Настройки.Отбор, пользователь может не увидеть изменений на форме, если этот отбор вынесен в "Быстрые настройки" (над списком). Быстрые настройки хранятся в Список.КомпоновщикНастроек.ПользовательскиеНастройки.

Чтобы гарантированно установить отбор, который сработает, часто приходится дублировать логику или искать соответствие идентификаторов. Методы БСП (описанные в Способе 3) обычно берут эту сложную работу на себя, корректно обрабатывая идентификаторы пользовательских настроек.

Подводные камни и рекомендации

  1. Имена полей: Всегда проверяйте точное имя поля в запросе динамического списка. Если в запросе поле называется Ссылка.ПометкаУдаления, а вы пишете просто ПометкаУдаления, может возникнуть ошибка, если такого псевдонима нет.
  2. Типы значений: Убедитесь, что тип Правого Значения совпадает с типом поля. Попытка сравнить Поле типа "СправочникСсылка" со Строкой не вызовет ошибку компиляции, но отбор просто не сработает (пустой список).
  3. Производительность: Не устанавливайте отборы по неиндексированным полям (строкам неограниченной длины, полям составного типа без индекса) на больших таблицах — это приведет к медленной работе списка.

Используя эти методы, вы сможете гибко управлять отображением данных в формах 1С, делая интерфейс удобным и отзывчивым для пользователя.

← На главную