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

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

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

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

Способ 1. Манипуляция с ключом сохранения положения окна

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

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


&НаСервере
Процедура СброситьРазмерыФормыНаСервере()
    // Генерируем новый уникальный ключ, чтобы форма "забыла" старые размеры
    ЭтаФорма.КлючСохраненияПоложенияОкна = Строка(Новый УникальныйИдентификатор);
КонецПроцедуры

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

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

Если нам нужно именно «сбросить» форму к заводским настройкам, можно программно удалить записи из системного хранилища. Посмотрим на алгоритм действий:

  1. Определяем путь к настройкам окна формы. Обычно он строится как "ИмяОбъекта/ИмяФормы/НастройкиОкна".
  2. Используем метод Удалить объекта ХранилищеСистемныхНастроек.
  3. Обновляем ключ сохранения положения.

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

Способ 3. Метод «Нулевой высоты» (Форсированный пересчет)

Выясним причину, по которой форма не схлопывается: платформа считает, что текущий размер пользователя приоритетнее автоматического. Один из самых эффективных «лайфхаков» — принудительно установить высоту формы в минимальное значение сразу после скрытия элементов.

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


&НаКлиенте
Процедура ИзменитьВидимостьИРазмер()
    // Скрываем ненужные элементы
    Элементы.ГруппаДополнительно.Видимость = Ложь;
    
    // Форсируем пересчет геометрии
    ЭтаФорма.Высота = 1; 
    // Аналогично можно поступить с шириной, если это необходимо
    ЭтаФорма.Ширина = 1;
КонецПроцедуры

Способ 4. Управление растягиванием элементов

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

Чтобы форма автоматически подстраивалась под контент, проверьте следующие настройки:

Способ 5. Эмуляция нажатия горячих клавиш (WScript.Shell)

В исключительных случаях, когда программные методы 1С не помогают (например, в очень старых релизах платформы 8.3), разработчики прибегают к вызову системной команды сброса настроек через COM-объект. Выясним недостатки этого метода: он работает только в тонком/толстом клиенте под Windows и может вызывать кратковременное «моргание» экрана.


&НаКлиенте
Процедура ВызватьСтандартныйСбросНастроек()
    // Эмуляция Alt + Shift + R
    Попытка
        Shell = Новый COMОбъект("Wscript.Shell");
        Shell.SendKeys("%+R");
    Исключение
        // Обработка ошибки, если COM-объект недоступен
    КонецПопытки;
КонецПроцедуры

Способ 6. Использование свертываемых групп

Вместо полного скрытия элементов через Видимость = Ложь, проанализируем использование функционала свертываемых групп (свойство ОтображениеУправленияГруппой — КнопкаСвертывания). Программное управление свойством Растянута у такой группы заставляет платформу более корректно обрабатывать изменение высоты окна, так как этот механизм штатно заложен в поведение интерфейса «Такси».

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

← На главную