Как программно сбросить пользовательские отборы и избежать их конфликта при открытии формы в 1С

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

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

Причина возникновения проблемы: механизм сохранения настроек

Рассмотрим, как платформа работает с данными формы. По умолчанию для управляемых форм включено свойство Автоматическое сохранение данных в настройках. Платформа сохраняет состояние элементов, включая пользовательские отборы в динамических списках, в системное хранилище. При повторном открытии формы система пытается восстановить эти данные. Если мы пытаемся программно наложить свои фильтры поверх сохраненных, возникает логический конфликт.

Решение 1: Использование КлючаНазначенияИспользования

Один из самых простых и эффективных способов «изолировать» наше открытие формы от предыдущих настроек пользователя — это использование параметра КлючНазначенияИспользования. Этот ключ определяет уникальную ветку в хранилище настроек. Если мы укажем новый ключ, система не найдет для него старых настроек и откроет «чистую» форму.

Проанализируем пример кода при открытии формы:


ПараметрыФормы = Новый Структура;
// Использование уникального идентификатора гарантирует абсолютно чистую форму каждый раз
ПараметрыФормы.Вставить("КлючНазначенияИспользования", Новый УникальныйИдентификатор);

ОткрытьФорму("Документ.ЗаказКлиента.ФормаВыбора", ПараметрыФормы, ЭтаФорма);

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


ПараметрыФормы = Новый Структура;
// Создаем отдельную именованную ветку настроек для конкретного бизнес-процесса
ПараметрыФормы.Вставить("КлючНазначенияИспользования", "ОтборДляСпециальнойОбработки");

ОткрытьФорму("Документ.ЗаказКлиента.ФормаВыбора", ПараметрыФормы, ЭтаФорма);

Решение 2: Устранение ошибки «Пересекаются элементы отбора»

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

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


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

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

Решение 3: Принудительный сброс к стандартным настройкам

Если нам нужно полностью игнорировать всё, что настраивал пользователь, мы можем вызвать метод сброса компоновщика. Посмотрим на реализацию в коде формы:


&НаСервере
Процедура СброситьНастройкиНаСервере()
    // Загружаем настройки, определенные разработчиком в конфигураторе
    Список.КомпоновщикНастроек.ЗагрузитьСтандартныеНастройки();
КонецПроцедуры

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

Решение 4: Программное удаление настроек из хранилища

В некоторых случаях бывает полезно полностью очистить историю настроек конкретной формы для пользователя программным путем. Для этого проанализируем возможности объекта ХранилищеСистемныхНастроек. Рассмотрим пример удаления:


ПутьКНастройкам = "Общее/НастройкиФорм/Документ.ЗаказКлиента.ФормаВыбора";
ХранилищеСистемныхНастроек.Удалить(ПутьКНастройкам, "", ИмяПользователя());

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

Рекомендации по управлению доступностью полей

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

  1. Откроем настройки динамического списка в конфигураторе.
  2. Перейдем на закладку «Настройки», далее — «Пользовательские настройки».
  3. Найдем поле, по которому мы планируем устанавливать программный отбор (например, Организация).
  4. Снимем флажок Включать в пользовательские настройки.

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

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

← На главную