Как в 1С 8.3 открыть новую форму списка, игнорируя старые фильтры пользователя

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

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

Управление уникальностью открываемой формы

Проанализируем работу функции ОткрытьФорму. Чтобы система не пыталась найти и активировать уже существующее окно, а всегда создавала новый экземпляр формы, необходимо обратить внимание на четвертый параметр этой функции — Уникальность. Рассмотрим пример кода, который гарантирует открытие нового окна:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Новый Структура("ПометкаУдаления", Ложь));

// Используем Новый УникальныйИдентификатор во втором вызове
ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаСписка", 
             ПараметрыФормы, 
             ЭтаФорма, 
             Новый УникальныйИдентификатор);

Если в четвертом параметре передать Истина или фиксированную строку, платформа будет искать окно с таким ключом уникальности. Использование Новый УникальныйИдентификатор гарантирует, что каждый вызов будет порождать абсолютно новую форму, независимую от ранее открытых.

Игнорирование сохраненных настроек пользователя

Даже если мы открыли новое окно, 1С по умолчанию пытается восстановить настройки, которые пользователь использовал в прошлый раз (ширину колонок, активные отборы, сортировку). Выясним причину: это происходит благодаря механизму сохранения настроек данных формы. Чтобы обойти это поведение, мы можем воспользоваться несколькими способами.

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


ПараметрыФормы.Вставить("КлючСохраненияПоложенийОкна", "УникальныйКлюч_" + Строка(Новый УникальныйИдентификатор));
ПараметрыФормы.Вставить("КлючНастроекДанныхФормы", "УникальныйКлючНастроек");

Программная установка отбора в динамическом списке

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

  1. Передаем массив ссылок в параметрах формы.
  2. В модуле открываемой формы перехватываем эти параметры.
  3. Очищаем существующие отборы и устанавливаем свои.

В коде вызова это выглядит так:


МассивДокументов = Новый Массив;
// ... заполнение массива ссылками ...
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("СписокДокументов", МассивДокументов);
ОткрытьФорму("Документ.Название.ФормаСписка", ПараметрыФормы, , Новый УникальныйИдентификатор);

Теперь проанализируем обработчик ПриСозданииНаСервере в модуле формы списка:


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

Использование Фиксированных настроек для надежности

Если мы хотим, чтобы наш программный отбор работал «железно» и не смешивался с тем, что пользователь настраивает через кнопку «Настроить список», лучше использовать ФиксированныеНастройки. Отборы, установленные там, не отображаются в стандартном окне настроек и действуют всегда. Посмотрим, как изменить код:


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

Рекомендации при использовании БСП

Если ваша конфигурация построена на базе БСП (Библиотека стандартных подсистем), мы крайне рекомендуем использовать готовые методы общего назначения. Это сокращает объем кода и делает его более устойчивым к обновлениям платформы. Например, процедура УстановитьЭлементОтбораДинамическогоСписка из состава БСП позволяет быстро добавить или заменить фильтр.

Основные преимущества использования БСП в данном контексте:

Подведем итог: для полного контроля над открываемой формой всегда используйте Новый УникальныйИдентификатор в параметрах открытия и программно управляйте настройками динамического списка в серверных обработчиках формы. Это обеспечит предсказуемое поведение интерфейса и корректное отображение данных вашим пользователям.

← На главную