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