Как программно установить стандартные настройки управляемой формы?

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

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

Анализ механизмов хранения настроек

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

  1. Настройки формы: Это состав элементов, их видимость, заголовок и положение относительно друг друга. Хранятся с суффиксом /НастройкиФормы.
  2. Настройки окна: Геометрия окна (ширина, высота) и положение на экране. Хранятся с суффиксом /НастройкиОкна или /НастройкиОкнаТонкогоКлиента.
  3. Данные формы: Сохраненные значения реквизитов, если у них включено свойство «Автоматическое сохранение».

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

Способ 1. Очистка хранилища системных настроек

Самый надежный метод — принудительное удаление записей из системного хранилища. Это заставит платформу при следующем открытии формы прочитать настройки из метаданных (конфигурации). Разберем пример кода, который следует выполнять на сервере:


&НаСервере
Процедура СброситьНастройкиФормыНаСервере(ИмяФормы, ИмяПользователя)
    
    // Формируем базовый путь к настройкам
    КлючОбъекта = ИмяФормы + "/НастройкиФормы";
    ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, "", ИмяПользователя);
    
    // Для интерфейса "Такси" и тонкого клиента ключи могут отличаться
    КлючОкна = ИмяФормы + "/НастройкиОкнаТонкогоКлиента";
    ХранилищеСистемныхНастроек.Удалить(КлючОкна, "", ИмяПользователя);
    
    КлючОкнаТакси = ИмяФормы + "/Такси/НастройкиОкнаТонкогоКлиента";
    ХранилищеСистемныхНастроек.Удалить(КлючОкнаТакси, "", ИмяПользователя);
    
КонецПроцедуры

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

Способ 2. Управление ключом сохранения положения окна

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

Рассмотрим пример реализации в процедуре ПриСозданииНаСервере:


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

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

Способ 3. Массовая очистка настроек (циклом)

Иногда мы не знаем точного имени ключа, особенно если форма находится в расширении или используется сложная вложенность. В таком случае проанализируем метод Выбрать() хранилища настроек. Мы можем перебрать все настройки пользователя и удалить те, которые содержат имя нашей формы.


&НаСервере
Процедура ПолнаяОчисткаВсехНастроекФормы(ПолноеИмяФормы)
    
    ИмяПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
    Отбор = Новый Структура("Пользователь", ИмяПользователя);
    Выборка = ХранилищеСистемныхНастроек.Выбрать(Отбор);
    
    МассивДляУдаления = Новый Массив;
    
    Пока Выборка.Следующий() Цикл
        // Проверяем, относится ли ключ к нашей форме
        Если СтрНайти(Выборка.КлючОбъекта, ПолноеИмяФормы) > 0 Тогда
            МассивДляУдаления.Добавить(Выборка.КлючОбъекта);
        КонецЕсли;
    КонецЦикла;
    
    Для Каждого Ключ Из МассивДляУдаления Цикл
        ХранилищеСистемныхНастроек.Удалить(Ключ, "", ИмяПользователя);
    КонецЦикла;
    
КонецПроцедуры

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

Рекомендации по работе с «пустым пространством»

Если ваша цель — избавиться от пустого места, которое остается после скрытия групп элементов (Элементы.Группа.Видимость = Ложь), программного сброса настроек может быть недостаточно. Рассмотрим дополнительные шаги:

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

Подводя итог, наиболее правильным и современным подходом является сочетание очистки ХранилищеСистемныхНастроек по ключам /НастройкиФормы и /НастройкиОкна вместе с управлением свойством КлючСохраненияПоложенияОкна. Это обеспечит пользователю предсказуемый интерфейс, соответствующий задумке разработчика.

← На главную