Как отловить событие изменения размеров формы в 1С:Предприятии?

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

В 1С:Предприятии, особенно в управляемых формах, отсутствует прямое событие, которое срабатывает при изменении размеров формы, аналогичное событию Resize в других средах разработки. Это создает определенные сложности, когда нам необходимо динамически адаптировать элементы интерфейса под новые габариты формы. Однако существуют эффективные обходные пути и механизмы, позволяющие реагировать на такие изменения. Мы рассмотрим несколько подходов к решению этой задачи, которые помогут нам динамически подстраивать элементы формы, например, размер шрифта кнопок, под текущие габариты.

Зачем нам нужно отлавливать изменение размеров формы?

Прежде всего, давайте разберем, почему такая функциональность может быть востребована. Одним из наиболее распространенных сценариев является адаптация пользовательского интерфейса. Например, при разработке интерфейса кассира (как упоминалось в нашей теме), мы можем столкнуться с необходимостью изменять размер шрифта текста кнопок в зависимости от текущих размеров формы или разрешения экрана. Это позволяет сохранять читаемость и удобство использования интерфейса независимо от условий отображения. Цель — создать динамический и отзывчивый дизайн, который автоматически подстраивается под окружение пользователя, обеспечивая наилучший пользовательский опыт при работе с приложением.

Метод 1: Отслеживание размеров формы с помощью обработчика ожидания

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

  1. Инициализация переменных и подключение обработчика. Нам потребуется две переменные для хранения предыдущих значений ширины и высоты формы. Эти переменные инициализируются при открытии формы, и именно в этот момент мы подключаем наш обработчик ожидания.

    
    Перем мШирина;
    Перем мВысота;
    
    Процедура ПриОткрытии()
        мШирина = ЭтаФорма.Ширина;
        мВысота = ЭтаФорма.Высота;
        ПодключитьОбработчикОжидания("ПроверитьРазмерФормы", 1, Ложь); // Проверяем каждую секунду
    КонецПроцедуры
    

    Здесь "ПроверитьРазмерФормы" — это имя процедуры, которую мы хотим вызывать, 1 — интервал в секундах, через который будет вызываться процедура, и Ложь означает, что обработчик не является монопольным (не блокирует другие действия) и может выполняться параллельно с другими операциями пользователя.

  2. Процедура проверки размеров. Создадим процедуру ПроверитьРазмерФормы, которая будет выполнять основную логику. В этой процедуре мы сравниваем сохраненные значения ширины и высоты формы (мШирина, мВысота) с текущими значениями ЭтаФорма.Ширина и ЭтаФорма.Высота, доступными через объект ЭтаФорма.

    
    Процедура ПроверитьРазмерФормы()
        лпРазмерИзменился = Ложь;
    
        Если мШирина <> ЭтаФорма.Ширина Тогда
            Сообщить("Изменилась ширина! " + Символы.ПС + "старое значение: " + мШирина + " новое: " + ЭтаФорма.Ширина);
            лпРазмерИзменился = Истина;
        КонецЕсли;
    
        Если мВысота <> ЭтаФорма.Высота Тогда
            Сообщить("Изменилась высота! " + Символы.ПС + "старое значение: " + мВысота + " новое: " + ЭтаФорма.Высота);
            лпРазмерИзменился = Истина;
        КонецЕсли;
    
        Если лпРазмерИзменился Тогда
            // Здесь выполняем необходимые действия при изменении размера
            // Например, пересчет размеров шрифтов, перерисовка элементов.
            // Не забудьте обновить сохраненные размеры
            мШирина = ЭтаФорма.Ширина;
            мВысота = ЭтаФорма.Высота;
            // Пример действия: адаптация шрифта кнопки
            // Если Элементы.ИмяКнопки.Шрифт.Размер <> НовоеЗначениеРазмера Тогда
            //    Элементы.ИмяКнопки.Шрифт.Размер = НовоеЗначениеРазмера;
            // КонецЕсли;
        КонецЕсли;
    КонецПроцедуры
    

    Внутри блока Если лпРазмерИзменился Тогда ... КонецЕсли; мы можем разместить любую логику по адаптации элементов формы. Важно помнить, что после выполнения действий необходимо обновить значения мШирина и мВысота, чтобы они соответствовали новым размерам формы, иначе наше событие будет срабатывать повторно при следующей проверке, даже если форма больше не менялась.

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

    
    Процедура ПриЗакрытии()
        ОтключитьОбработчикОжидания("ПроверитьРазмерФормы");
    КонецПроцедуры
    

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

Метод 2: Использование события ПриПолученииДанных табличного поля

Для обычных форм существует "неочевидный" способ отслеживания изменения размеров формы, который основан на особенностях поведения табличных полей. Событие ПриПолученииДанных табличного поля может срабатывать при перерисовке формы, вызванной изменением ее размеров. Мы можем воспользоваться этим, добавив на форму специальное, невидимое для пользователя табличное поле, которое будет служить "датчиком" изменения размеров.

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

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

    Например, создайте табличное поле с именем ТПСлужебное и настройте его оформление соответствующим образом.

  2. Программное добавление строки. Чтобы событие ПриПолученииДанных гарантированно срабатывало, табличное поле должно содержать хотя бы одну строку данных. Мы можем добавить ее программно при открытии формы.

    
    Процедура ПриОткрытии()
        // Предполагаем, что "ТПСлужебное" - это имя нашего табличного поля на форме
        ТПСлужебное.Добавить();
        // Другие инициализационные действия, если есть
    КонецПроцедуры
    

    Добавление одной пустой строки достаточно для того, чтобы табличное поле было "активным" и его события срабатывали.

  3. Обработчик события ПриПолученииДанных. Теперь мы можем использовать это событие для отслеживания размеров. При каждом вызове события мы будем иметь доступ к текущим значениям ширины и высоты формы.

    
    Процедура ТПСлужебноеПриПолученииДанных(Элемент, ОформленияСтрок)
        // Здесь "ЭтаФорма.Высота" и "ЭтаФорма.Ширина" - свойства самой формы
        Сообщить("Высота формы: " + ЭтаФорма.Высота + "; Ширина формы: " + ЭтаФорма.Ширина);
        // Далее выполняем логику по адаптации интерфейса
        // Например, корректировка размеров шрифтов или других элементов
        // ...
    КонецПроцедуры
    

    Этот подход может быть более производительным в некоторых случаях, поскольку событие вызывается только при необходимости перерисовки (например, когда платформа обнаруживает изменение размеров), а не через фиксированные интервалы. Однако его "поведение" может быть менее предсказуемым и сильно зависеть от конкретной реализации формы и версии платформы. Важно тщательно тестировать этот метод, чтобы убедиться в его стабильности и адекватной реакции на изменение размеров.

Дополнительные рекомендации и альтернативы для адаптации интерфейса

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

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

    • Пропорциональное изменение размеров элементов.
    • Фиксацию элементов к определенным сторонам формы (левой, правой, верхней, нижней).
    • Центрирование элементов относительно формы или группы.

    Привязки часто являются лучшим решением для базовой адаптации элементов управления, так как они работают автоматически на стороне клиента, не требуют написания кода и обеспечивают высокую производительность. Мы всегда должны сначала рассмотреть возможность использования привязок перед тем, как переходить к более сложным программным методам.

  2. Оптимизация изменения свойств и условное оформление. Если наша цель — изменить только шрифт или другие оформительские свойства (например, для кнопок, как в примере интерфейса кассира), то следует учитывать производительность. Прямое изменение таких свойств на клиенте может потребовать пересчета расположения полей и, в старых версиях платформы, даже обращения к серверу, что может привести к заметным задержкам.

    Начиная с версии 8.3.7, платформа 1С:Предприятие реализовала новый механизм расстановки элементов, и изменение большинства оформительских свойств на клиенте не требует обращения к серверу. Однако для изменения шрифтов рекомендуется использовать условное оформление. Этот механизм является более эффективным способом, так как он не влияет на размер элемента и не вызывает обращения к серверу. Условное оформление позволяет нам задавать различные параметры отображения (цвет, шрифт, видимость) в зависимости от определенных условий без необходимости переписывать код при каждом изменении размеров.

  3. Масштабирование элементов. Для адаптации интерфейса к различным разрешениям экрана и размерам мониторов мы можем использовать не только программное отслеживание, но и:

    • Стандартные настройки масштаба операционной системы, которые влияют на размер всех элементов интерфейса.
    • Встроенные возможности платформы 1С для изменения масштаба отображения форм и шрифтов, которые могут быть настроены пользователем или администратором через параметры системы или параметры пользователя.

    Эти методы являются системными и могут быть полезны для общей адаптации, но не всегда дают гибкость для конкретных элементов формы.

  4. Программное изменение размеров формы. Мы можем программно влиять на размеры формы, используя свойства ЭтаФорма.Высота и ЭтаФорма.Ширина. Однако, как правило, это делается для установки формы в определенное состояние (например, открытие в полноэкранном режиме или с фиксированными размерами), а не для отслеживания пользовательского изменения. Установка значения 0 для этих свойств позволяет форме автоматически определять свою высоту, что может быть полезно для адаптивного дизайна.

  5. Установка действий для событий. Хотя прямого события ПриИзмененииРазмера нет, мы можем устанавливать, изменять или отключать обработчики других событий формы или элемента формы программно с помощью процедуры УстановитьДействие(). Это дает нам гибкость в управлении логикой формы и позволяет динамически реагировать на различные события, но не решает проблему отсутствия самого события изменения размера напрямую. Обработчик события при этом должен располагаться в модуле самой формы.

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

← На главную