В процессе разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с особенностью поведения управляемых форм: платформа запоминает последние размеры окна, установленные пользователем или рассчитанные автоматически при первом открытии. Если в процессе работы формы мы программно скрываем часть элементов (группы, поля), форма часто «замирает» в старых размерах, оставляя пустые области. Стандартное действие «Установить стандартные настройки» (обычно вызываемое сочетанием клавиш Alt+Shift+R) решает эту проблему, но пользователю неудобно делать это вручную.
Разберем подробно, как можно программно добиться эффекта сброса настроек и заставить форму адаптировать свой размер под изменившийся состав элементов.
Платформа связывает настройки формы (размер, положение, видимость колонок) с определенным идентификатором. Если мы изменим этот идентификатор, система будет считать, что форму открывают впервые, и рассчитает её геометрию заново. Проанализируем, как это реализовать программно.
Для этого используется свойство формы КлючСохраненияПоложенияОкна. Рассмотрим пример кода, который можно вызвать после изменения видимости элементов:
&НаСервере
Процедура СброситьРазмерыФормыНаСервере()
// Генерируем новый уникальный ключ, чтобы форма "забыла" старые размеры
ЭтаФорма.КлючСохраненияПоложенияОкна = Строка(Новый УникальныйИдентификатор);
КонецПроцедуры
Важное примечание: Использование Новый УникальныйИдентификатор при каждом изменении может привести к засорению системных таблиц настроек в базе данных. Профессиональнее использовать фиксированные наборы ключей, например: "Режим_Краткий" и "Режим_Полный".
Если нам нужно именно «сбросить» форму к заводским настройкам, можно программно удалить записи из системного хранилища. Посмотрим на алгоритм действий:
"ИмяОбъекта/ИмяФормы/НастройкиОкна".Удалить объекта ХранилищеСистемныхНастроек.
&НаСервере
Процедура ПолныйСбросНастроекОкна()
КлючОбъекта = "Справочник.Контрагенты.Форма.ФормаЭлемента/НастройкиОкна";
ИмяПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, "", ИмяПользователя);
// Чтобы изменения вступили в силу немедленно
ЭтаФорма.КлючСохраненияПоложенияОкна = "СтандартныйКлюч_" + Строка(ТекущаяДатаСеанса());
КонецПроцедуры
Выясним причину, по которой форма не схлопывается: платформа считает, что текущий размер пользователя приоритетнее автоматического. Один из самых эффективных «лайфхаков» — принудительно установить высоту формы в минимальное значение сразу после скрытия элементов.
Рассмотрим, как это работает: если мы установим ЭтаФорма.Высота = 1;, платформа попытается сжать форму до 1 пикселя. Так как она физически не может стать меньше, чем сумма высот всех видимых элементов, форма «упрется» в границы этих элементов и примет максимально компактный вид.
&НаКлиенте
Процедура ИзменитьВидимостьИРазмер()
// Скрываем ненужные элементы
Элементы.ГруппаДополнительно.Видимость = Ложь;
// Форсируем пересчет геометрии
ЭтаФорма.Высота = 1;
// Аналогично можно поступить с шириной, если это необходимо
ЭтаФорма.Ширина = 1;
КонецПроцедуры
Часто форма не уменьшается по высоте, потому что внутри остался элемент, у которого установлено свойство РастягиватьПоВертикали = Истина. Проанализируем ситуацию: если в форме есть динамический список или многострочное текстовое поле, они будут «давить» на границы окна, заставляя его сохранять большой размер.
Чтобы форма автоматически подстраивалась под контент, проверьте следующие настройки:
Ложь (или Авто, если контейнер не растягивается).ОбновитьИнтерфейс() для принудительной перерисовки командных панелей.В исключительных случаях, когда программные методы 1С не помогают (например, в очень старых релизах платформы 8.3), разработчики прибегают к вызову системной команды сброса настроек через COM-объект. Выясним недостатки этого метода: он работает только в тонком/толстом клиенте под Windows и может вызывать кратковременное «моргание» экрана.
&НаКлиенте
Процедура ВызватьСтандартныйСбросНастроек()
// Эмуляция Alt + Shift + R
Попытка
Shell = Новый COMОбъект("Wscript.Shell");
Shell.SendKeys("%+R");
Исключение
// Обработка ошибки, если COM-объект недоступен
КонецПопытки;
КонецПроцедуры
Вместо полного скрытия элементов через Видимость = Ложь, проанализируем использование функционала свертываемых групп (свойство ОтображениеУправленияГруппой — КнопкаСвертывания). Программное управление свойством Растянута у такой группы заставляет платформу более корректно обрабатывать изменение высоты окна, так как этот механизм штатно заложен в поведение интерфейса «Такси».
Резюме: Для наиболее чистого решения рекомендуется комбинировать Способ 1 (смена ключа) и Способ 3 (установка минимальной высоты). Это обеспечит предсказуемое поведение интерфейса без использования внешних библиотек и сложных манипуляций с базой данных.