Рассмотрим распространенную проблему, с которой сталкиваются многие разработчики: форма обработки у некоторых пользователей открывается в произвольном виде — то в свернутом, то в развернутом, либо с некорректными размерами. Попробуем разобраться, почему это происходит и как программно обеспечить предсказуемое поведение окон при открытии.
Прежде чем переходить к коду, проанализируем причину сбоев. Чаще всего проблема заключается в «засорении» или некорректном сохранении настроек в системном хранилище. Когда платформа запоминает состояние окна (позицию, размер, состояние Свернуто/Развернуто), она записывает эти параметры в настройки пользователя. При следующем открытии форма пытается восстановить эти параметры.
Однако, если у пользователя сменилось разрешение экрана, или форма была закрыта в момент аварийного завершения работы системы, сохраненные параметры могут стать неактуальными или «выходить» за пределы текущей рабочей области. Из-за этого окно может отображаться некорректно.
Одним из способов борьбы с принудительным восстановлением «кривых» настроек является программное управление ключом сохранения. Если мы зададим уникальный идентификатор для формы при каждом ее открытии, платформа не будет пытаться подгрузить старые, возможно поврежденные настройки пользователя.
Давайте посмотрим, как это реализовать на практике в модуле формы:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
// Генерируем новый идентификатор при каждом открытии
ЭтаФорма.ИмяСохраненияПоложенияОкна = Новый УникальныйИдентификатор();
КонецПроцедуры
Этот метод позволяет «обнулить» историю положения окна для данной формы. Однако, будьте внимательны: при очень частом открытии форм это может привести к накоплению лишних записей в базе данных, поэтому используйте данный подход обдуманно.
Для управляемых форм более правильным и современным подходом считается использование свойства КлючСохраненияПоложенияОкна. Оно является наследником старых механизмов и лучше интегрировано в современные конфигурации. Вместо случайного идентификатора мы можем задать постоянный ключ, который будет привязывать настройки именно к текущей логике работы формы, а не к случайному состоянию.
Если наша задача — гарантировать, что форма всегда будет открываться, например, в развернутом виде, мы можем использовать свойство СостояниеОкна. Это наиболее «чистый» способ, так как он не полагается на хранилище настроек пользователя, а жестко задает поведение платформы при инициализации формы.
Рассмотрим реализацию в процедуре ПриСозданииНаСервере или ПриОткрытии:
Процедура ПриОткрытии()
// Принудительно разворачиваем окно при каждом открытии
ЭтаФорма.СостояниеОкна = СостояниеОкна.Развернутое;
КонецПроцедуры
Использование этого метода позволяет игнорировать старые пользовательские настройки и обеспечивает единообразие интерфейса для всех пользователей, независимо от их предыдущих действий или разрешения экрана.
Если проблема носит массовый характер или касается только конкретных пользователей, полезно провести очистку существующих настроек в системном хранилище:
WSH.SendKeys для имитации нажатий клавиш — этот способ крайне ненадежен, зависит от операционной системы и может привести к непредсказуемым ошибкам, так как «нажатие» может быть перехвачено другим приложением.Таким образом, мы разобрали основные методы борьбы с произвольным изменением размеров окон. Наиболее профессиональным подходом является принудительная установка свойства СостояниеОкна или использование продуманного ключа сохранения настроек через КлючСохраненияПоложенияОкна. Это позволит избежать лишних записей в базе и обеспечит стабильную работу интерфейса вашей обработки.