В процессе разработки на платформе 1С:Предприятие 7.7 часто возникает задача улучшить читаемость форм для пользователя, например, увеличив размер шрифта для ключевых полей ввода. Однако это простое, на первый взгляд, действие может привести к неожиданной проблеме: при открытии в модальном режиме форма оказывается "обрезанной", и часть элементов управления становится не видна. Разберем, почему так происходит и какие существуют способы решения этой проблемы.
Суть проблемы кроется в особенностях отрисовки окон платформой 1С 7.7, которая была создана в эпоху других стандартов для экранов и интерфейсов. Проанализируем ситуацию по шагам:
ОткрытьФормуМодально()), платформа пытается автоматически рассчитать ее размеры.Сервис -> Параметры -> Интерфейс -> Формы). В результате рассчитанный размер окна оказывается меньше, чем требуется для корректного отображения всех элементов, и форма "обрезается".Важный момент, который подтверждает эту теорию: если ту же самую форму открыть немодально (методом ОткрытьФорму()), она, скорее всего, отобразится корректно. Это связано с тем, что отрисовкой и управлением размерами немодальных окон в большей степени занимается сама операционная система, которая лучше справляется с этой задачей.
Теперь, когда причина ясна, рассмотрим варианты решения, от самого простого к наиболее правильному и гибкому.
Это самый быстрый и очевидный способ, который не требует использования дополнительных инструментов. Его суть заключается в принудительном увеличении размеров самой формы в режиме Конфигуратора.
Порядок действий:
Плюсы и минусы этого подхода:
(+) Простота. Не требует написания кода и подключения внешних компонент.
(-) Непредсказуемость. Этот метод работает по принципу "научного тыка". Вам придется несколько раз подбирать размер, так как увеличение формы в Конфигураторе нелинейно сказывается на ее размере в режиме Предприятия. Форма, увеличенная вдвое в Конфигураторе, в реальности может стать лишь немного больше.
(-) Отсутствие гибкости. Решение жестко привязано к конкретным настройкам одного компьютера: разрешению экрана, системным шрифтам и настройкам масштабирования Windows (DPI). На другом компьютере с иными параметрами проблема может вернуться. Этот способ подходит только для нетиражных решений, где вы полностью контролируете рабочее окружение пользователя.
Наиболее профессиональным и надежным решением является использование внешней компоненты FormEx. Она значительно расширяет возможности управления интерфейсом в 1С 7.7 и позволяет программно задавать точные размеры окна формы после ее открытия, игнорируя неверные расчеты платформы.
Для начала убедитесь, что компонента FormEx.dll зарегистрирована в системе, а в конфигурации она подключается в процедуре ПриНачалеРаботыСистемы() глобального модуля:
Процедура ПриНачалеРаботыСистемы()
// ... прочий код
Попытка
ЗагрузитьВнешнююКомпоненту("FormEx.dll");
Исключение
Сообщить("Не удалось загрузить FormEx.dll!", "!");
КонецПопытки;
// ... прочий код
КонецПроцедуры
После этого мы можем управлять формой из ее модуля. Рассмотрим два варианта: установка фиксированного размера и динамический расчет.
Этот способ подходит, если вы точно знаете, какой размер в пикселях должен быть у формы. Код размещается в процедуре ПриОткрытии() модуля формы.
Для этого создадим объект РасширениеФормы и установим его свойства Ширина и Высота.
Процедура ПриОткрытии()
// Создаем объект для управления формой
Расширение = СоздатьОбъект("РасширениеФормы");
Расширение.УстановитьФорму(Форма);
// Устанавливаем новые размеры окна в пикселях
// Подберите значения экспериментально
НоваяШирина = 450;
НоваяВысота = 300;
Расширение.Ширина(НоваяШирина);
Расширение.Высота(НоваяВысота);
КонецПроцедуры
Этот метод уже гораздо лучше ручного растягивания, так как он более точен и не зависит от того, как форма выглядит в Конфигураторе. Однако он все еще может некорректно работать при разных настройках DPI.
Это самый правильный подход. Его идея — не задавать размеры жестко, а вычислить их на основе реального расположения элементов на форме. Так форма всегда будет иметь минимально необходимый размер для отображения всего содержимого, независимо от настроек экрана.
Алгоритм действий:
Посмотрим на пример реализации в процедуре ПриОткрытии():
Процедура ПриОткрытии()
Перем Расширение, ЭлементФормы;
Перем МаксПраво, МаксНиз;
Перем Отступ;
Расширение = СоздатьОбъект("РасширениеФормы");
Расширение.УстановитьФорму(Форма);
// Инициализируем начальные значения
МаксПраво = 0;
МаксНиз = 0;
Отступ = 20; // Отступ от крайнего элемента до границы окна в пикселях
// Перебираем все элементы формы, чтобы найти крайние точки
Для Сч = 1 По Форма.КоличествоЭлементов() Цикл
ЭлементФормы = Форма.Элемент(Сч);
// Проверяем, что элемент видимый, чтобы не учитывать скрытые
Если ЭлементФормы.Видимость() = 0 Тогда
Продолжить;
КонецЕсли;
// Ищем максимальную правую координату
Если ЭлементФормы.Право() > МаксПраво Тогда
МаксПраво = ЭлементФормы.Право();
КонецЕсли;
// Ищем максимальную нижнюю координату
Если ЭлементФормы.Низ() > МаксНиз Тогда
МаксНиз = ЭлементФормы.Низ();
КонецЕсли;
КонецЦикла;
// Устанавливаем вычисленные размеры с учетом отступов
Если (МаксПраво > 0) И (МаксНиз > 0) Тогда
Расширение.Ширина(МаксПраво + Отступ);
Расширение.Высота(МаксНиз + Отступ);
КонецЕсли;
КонецПроцедуры
Этот подход решает проблему полностью. Форма будет автоматически адаптироваться под свое содержимое, и вам больше не придется беспокоиться об "обрезанных" элементах при переносе решения на другие компьютеры.
Стоит помнить, что на отображение интерфейса 1С 7.7 сильно влияет системная настройка масштабирования (DPI) в Windows. На современных мониторах с высоким разрешением пользователи часто устанавливают масштаб 125% или 150% для комфортной работы. Платформа 1С 7.7 плохо адаптирована к таким режимам, что может вызывать "размытие" шрифтов и искажение форм. Для разработки и беспроблемной работы в 1С 7.7 рекомендуется использовать стандартный масштаб 100% (96 DPI).
В заключение отметим, что хотя для быстрой "заплатки" в нетиражном решении можно обойтись ручным растягиванием формы в Конфигураторе, для создания надежных и универсальных решений использование внешней компоненты FormEx и динамического расчета размеров является практически безальтернативным и единственно верным вариантом.