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