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