Почему обрезается модальная форма в 1С 7.7 с большим шрифтом и как это исправить?

Программист 1С v7.7
← На главную

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

Анализ проблемы: выясним причину

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

  1. Установка нестандартного шрифта. Вы открываете форму в Конфигураторе и для одного или нескольких элементов управления (например, полей ввода суммы или телефона) устанавливаете увеличенный размер шрифта, скажем, 18 вместо стандартного 10. В режиме конфигуратора все выглядит отлично.
  2. Открытие формы в модальном режиме. Когда форма открывается из кода модально (через метод ОткрытьФормуМодально()), платформа пытается автоматически рассчитать ее размеры.
  3. Ошибка в расчетах. И вот здесь происходит сбой. Платформа 1С 7.7 при расчете размеров модального окна ориентируется не на реальные размеры элементов с их новыми, увеличенными шрифтами, а на глобальные настройки интерфейса (меню Сервис -> Параметры -> Интерфейс -> Формы). В результате рассчитанный размер окна оказывается меньше, чем требуется для корректного отображения всех элементов, и форма "обрезается".

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

Теперь, когда причина ясна, рассмотрим варианты решения, от самого простого к наиболее правильному и гибкому.

Решение 1: Ручное изменение размера формы в Конфигураторе

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

Порядок действий:

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

Плюсы и минусы этого подхода:

(+) Простота. Не требует написания кода и подключения внешних компонент.

(-) Непредсказуемость. Этот метод работает по принципу "научного тыка". Вам придется несколько раз подбирать размер, так как увеличение формы в Конфигураторе нелинейно сказывается на ее размере в режиме Предприятия. Форма, увеличенная вдвое в Конфигураторе, в реальности может стать лишь немного больше.

(-) Отсутствие гибкости. Решение жестко привязано к конкретным настройкам одного компьютера: разрешению экрана, системным шрифтам и настройкам масштабирования Windows (DPI). На другом компьютере с иными параметрами проблема может вернуться. Этот способ подходит только для нетиражных решений, где вы полностью контролируете рабочее окружение пользователя.

Решение 2: Программное управление размерами через FormEx

Наиболее профессиональным и надежным решением является использование внешней компоненты FormEx. Она значительно расширяет возможности управления интерфейсом в 1С 7.7 и позволяет программно задавать точные размеры окна формы после ее открытия, игнорируя неверные расчеты платформы.

Для начала убедитесь, что компонента FormEx.dll зарегистрирована в системе, а в конфигурации она подключается в процедуре ПриНачалеРаботыСистемы() глобального модуля:


Процедура ПриНачалеРаботыСистемы()
    // ... прочий код
    Попытка
        ЗагрузитьВнешнююКомпоненту("FormEx.dll");
    Исключение
        Сообщить("Не удалось загрузить FormEx.dll!", "!");
    КонецПопытки;
    // ... прочий код
КонецПроцедуры

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

Вариант 2.1: Установка фиксированных размеров

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

Для этого создадим объект РасширениеФормы и установим его свойства Ширина и Высота.


Процедура ПриОткрытии()
    // Создаем объект для управления формой
    Расширение = СоздатьОбъект("РасширениеФормы");
    Расширение.УстановитьФорму(Форма);
    
    // Устанавливаем новые размеры окна в пикселях
    // Подберите значения экспериментально
    НоваяШирина = 450;
    НоваяВысота = 300;
    
    Расширение.Ширина(НоваяШирина);
    Расширение.Высота(НоваяВысота);
КонецПроцедуры

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

Вариант 2.2: Динамический расчет размеров (наиболее универсальный)

Это самый правильный подход. Его идея — не задавать размеры жестко, а вычислить их на основе реального расположения элементов на форме. Так форма всегда будет иметь минимально необходимый размер для отображения всего содержимого, независимо от настроек экрана.

Алгоритм действий:

  1. При открытии формы получаем доступ ко всем ее элементам.
  2. В цикле перебираем все элементы и находим максимальные правую и нижнюю координаты.
  3. К найденным максимальным значениям добавляем небольшие отступы для красоты.
  4. Устанавливаем вычисленные ширину и высоту для окна формы.

Посмотрим на пример реализации в процедуре ПриОткрытии():


Процедура ПриОткрытии()
    Перем Расширение, ЭлементФормы;
    Перем МаксПраво, МаксНиз;
    Перем Отступ;
    
    Расширение = СоздатьОбъект("РасширениеФормы");
    Расширение.УстановитьФорму(Форма);

    // Инициализируем начальные значения
    МаксПраво = 0;
    МаксНиз = 0;
    Отступ = 20; // Отступ от крайнего элемента до границы окна в пикселях

    // Перебираем все элементы формы, чтобы найти крайние точки
    Для Сч = 1 По Форма.КоличествоЭлементов() Цикл
        ЭлементФормы = Форма.Элемент(Сч);
        
        // Проверяем, что элемент видимый, чтобы не учитывать скрытые
        Если ЭлементФормы.Видимость() = 0 Тогда
            Продолжить;
        КонецЕсли;

        // Ищем максимальную правую координату
        Если ЭлементФормы.Право() > МаксПраво Тогда
            МаксПраво = ЭлементФормы.Право();
        КонецЕсли;
        
        // Ищем максимальную нижнюю координату
        Если ЭлементФормы.Низ() > МаксНиз Тогда
            МаксНиз = ЭлементФормы.Низ();
        КонецЕсли;
    КонецЦикла;

    // Устанавливаем вычисленные размеры с учетом отступов
    Если (МаксПраво > 0) И (МаксНиз > 0) Тогда
        Расширение.Ширина(МаксПраво + Отступ);
        Расширение.Высота(МаксНиз + Отступ);
    КонецЕсли;
КонецПроцедуры

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

Дополнительные рекомендации: влияние настроек Windows (DPI)

Стоит помнить, что на отображение интерфейса 1С 7.7 сильно влияет системная настройка масштабирования (DPI) в Windows. На современных мониторах с высоким разрешением пользователи часто устанавливают масштаб 125% или 150% для комфортной работы. Платформа 1С 7.7 плохо адаптирована к таким режимам, что может вызывать "размытие" шрифтов и искажение форм. Для разработки и беспроблемной работы в 1С 7.7 рекомендуется использовать стандартный масштаб 100% (96 DPI).

В заключение отметим, что хотя для быстрой "заплатки" в нетиражном решении можно обойтись ручным растягиванием формы в Конфигураторе, для создания надежных и универсальных решений использование внешней компоненты FormEx и динамического расчета размеров является практически безальтернативным и единственно верным вариантом.

← На главную