При разработке на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда форма выбора или форма списка «запоминает» последние настройки пользователя. Это удобная функция для конечного потребителя, но она может стать проблемой, если нам нужно открыть форму из программного кода с жестко заданными фильтрами. Разберем подробно, почему это происходит и как правильно управлять этим механизмом, чтобы избежать типичных ошибок, таких как «Пересекаются элементы отбора».
Рассмотрим, как платформа работает с данными формы. По умолчанию для управляемых форм включено свойство Автоматическое сохранение данных в настройках. Платформа сохраняет состояние элементов, включая пользовательские отборы в динамических списках, в системное хранилище. При повторном открытии формы система пытается восстановить эти данные. Если мы пытаемся программно наложить свои фильтры поверх сохраненных, возникает логический конфликт.
Один из самых простых и эффективных способов «изолировать» наше открытие формы от предыдущих настроек пользователя — это использование параметра КлючНазначенияИспользования. Этот ключ определяет уникальную ветку в хранилище настроек. Если мы укажем новый ключ, система не найдет для него старых настроек и откроет «чистую» форму.
Проанализируем пример кода при открытии формы:
ПараметрыФормы = Новый Структура;
// Использование уникального идентификатора гарантирует абсолютно чистую форму каждый раз
ПараметрыФормы.Вставить("КлючНазначенияИспользования", Новый УникальныйИдентификатор);
ОткрытьФорму("Документ.ЗаказКлиента.ФормаВыбора", ПараметрыФормы, ЭтаФорма);
Важный нюанс: Использование Новый УникальныйИдентификатор при каждом открытии может привести к чрезмерному росту записей в системных таблицах базы данных. Поэтому профессиональнее использовать фиксированную строку, специфичную для вашей задачи. Выясним, как это реализовать:
ПараметрыФормы = Новый Структура;
// Создаем отдельную именованную ветку настроек для конкретного бизнес-процесса
ПараметрыФормы.Вставить("КлючНазначенияИспользования", "ОтборДляСпециальнойОбработки");
ОткрытьФорму("Документ.ЗаказКлиента.ФормаВыбора", ПараметрыФормы, ЭтаФорма);
Часто программисты пытаются установить отбор через структуру Отбор в параметрах формы или напрямую через Список.Отбор. Если пользователь ранее уже установил фильтр по тому же полю (например, по организации), платформа выдает ошибку о пересечении элементов. Это происходит из-за того, что в динамическом списке существует два слоя настроек: Фиксированные настройки (программные) и Пользовательские настройки.
Чтобы решить эту проблему, нам нужно программно изменять именно пользовательские настройки. Разберем, как это сделать в обработчике ПриСозданииНаСервере открываемой формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Ищем существующий элемент отбора в пользовательских настройках
Для Каждого Элемент Из Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
Если ТипЗнч(Элемент) = Тип("ОтборКомпоновкиДанных") Тогда
// Проходим по всем элементам отбора внутри коллекции
Для Каждого ЭлементОтбора Из Элемент.Элементы Цикл
Если Строка(ЭлементОтбора.ЛевоеЗначение) = "Организация" Тогда
// Если нашли - меняем значение и включаем использование
ЭлементОтбора.ПравоеЗначение = Параметры.НужнаяОрганизация;
ЭлементОтбора.Использование = Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Такой подход позволяет избежать конфликта, так как мы не создаем второй «параллельный» отбор, а модифицируем тот, который видит и использует сам пользователь.
Если нам нужно полностью игнорировать всё, что настраивал пользователь, мы можем вызвать метод сброса компоновщика. Посмотрим на реализацию в коде формы:
&НаСервере
Процедура СброситьНастройкиНаСервере()
// Загружаем настройки, определенные разработчиком в конфигураторе
Список.КомпоновщикНастроек.ЗагрузитьСтандартныеНастройки();
КонецПроцедуры
Этот метод полностью очищает все пользовательские фильтры, сортировки и группировки, возвращая список в первозданный вид. Это радикальный, но очень надежный способ гарантировать предсказуемое поведение интерфейса.
В некоторых случаях бывает полезно полностью очистить историю настроек конкретной формы для пользователя программным путем. Для этого проанализируем возможности объекта ХранилищеСистемныхНастроек. Рассмотрим пример удаления:
ПутьКНастройкам = "Общее/НастройкиФорм/Документ.ЗаказКлиента.ФормаВыбора";
ХранилищеСистемныхНастроек.Удалить(ПутьКНастройкам, "", ИмяПользователя());
Этот код следует выполнять перед открытием формы. Он физически удаляет запись из базы данных, и при следующем открытии форма будет вести себя так, будто пользователь открыл ее впервые. Для интерактивного управления такими записями подойдёт обработка для просмотра, восстановления и очистки хранилища настроек пользователей.
Чтобы в будущем предотвратить конфликты, мы можем ограничить права пользователя на изменение определенных фильтров. Проанализируем настройки Схемы компоновки данных (СКД), на которой базируется динамический список:
Организация).Включать в пользовательские настройки.Результат: пользователь больше не сможет вручную добавить это поле в отбор через интерфейс «Настроить список», что полностью исключит вероятность возникновения ошибки «Пересекаются элементы отбора» при программной установке фильтра в Список.Отбор (фиксированные настройки).
Подводя итог, выбор метода зависит от конкретной задачи: если нужно просто «чистое» открытие — используем КлючНазначенияИспользования. Если нужно управлять конкретными полями — работаем напрямую с ПользовательскиеНастройки компоновщика.