Разберем одну из самых старых и специфических проблем платформы 1С:Предприятие 7.7, связанную с визуальным проектированием интерфейсов. Программисты часто сталкиваются с ситуацией, когда при открытии формы документа или справочника в полноэкранном режиме часть реквизитов (поля ввода, надписи, кнопки) внезапно перемещается в нижнюю часть экрана, оставляя огромную «дыру» посередине или перекрывая другие элементы. Проанализируем, почему это происходит и как заставить форму вести себя предсказуемо.
Для начала проанализируем, как платформа 1С 7.7 управляет элементами при изменении размеров окна. В отличие от современных версий (8.3), здесь нет системы Привязок (Anchors) или Группировок. Логика масштабирования жестко зашита в движок отрисовки 1cv7.exe. Ключевым объектом, на который ориентируется платформа, является Табличная часть (многострочная часть документа или справочника). Она считается «резиновым» элементом, который должен занимать все свободное пространство.
Платформа мысленно проводит невидимую горизонтальную линию по нижней границе табличной части в режиме конфигуратора. Все элементы, которые находятся выше этой линии, считаются «привязанными» к верхнему краю. Все элементы, которые хотя бы на один пиксель оказываются ниже этой границы, платформа считает «подвальными» и приклеивает их к нижнему краю окна при растягивании.
Рассмотрим основной способ решения, найденный опытным путем. Чтобы реквизиты основного слоя не «съезжали» вниз при максимизации окна, необходимо соблюдать строгое правило взаимного расположения элементов в редакторе форм.
Многострочная часть (Табличная часть).Выясним причину, по которой это иногда не срабатывает на сложных формах. Если на форме присутствуют Слои (закладки), платформа анализирует положение табличной части на всех слоях одновременно. Если на одном слое ТЧ короткая, а на другом вы расположили реквизиты ниже этой границы, они будут прыгать вниз даже на тех слоях, где ТЧ вообще не видна.
Посмотрим на ситуацию под другим углом. В некоторых случаях на поведение отрисовки влияет Порядок обхода. Платформа иногда использует индекс объекта в списке диалога для определения приоритета отрисовки. Попробуем выполнить следующие действия:
Диалог — Порядок обхода.Проанализируем современный аспект этой проблемы. На ОС Windows 10 и 11 часто включено масштабирование шрифтов (125%, 150%). Поскольку 1С 7.7 — приложение старое, оно некорректно рассчитывает пиксельные координаты при некратном масштабировании. Из-за этого граница Табличной части может «наползти» на реквизит в процессе отрисовки, и платформа решит, что реквизит находится ниже границы.
Для решения этой проблемы без изменения формы можно настроить свойства ярлыка запуска 1С:
Свойства.Совместимость.Изменить параметры высокого DPI.Переопределите режим масштабирования высокого разрешения и выберем значение Приложение.Если штатные средства не помогают добиться нужного дизайна, рассмотрим профессиональное решение — использование внешней компоненты FormEx. Она позволяет программно управлять привязками элементов, игнорируя стандартную логику платформы.
С помощью метода УстановитьПривязку мы можем жестко закрепить положение любого реквизита. Рассмотрим пример кода, который можно разместить в процедуре ПриОткрытии:
// Пример использования FormEx для фиксации элемента
Сервис = СоздатьОбъект("Сервис");
// Привязываем кнопку "ОК" к правому нижнему углу
Сервис.УстановитьПривязку("КнопкаОК", 3, 3, 3, 3);
// Привязываем текстовое поле к верхнему краю (запрещаем улетать вниз)
Сервис.УстановитьПривязку("НадписьШапки", 1, 1, 1, 1);
Параметры метода УстановитьПривязку определяют поведение каждой стороны элемента (лево, верх, право, низ). Значение 1 означает привязку к верхнему/левому краю, 3 — к нижнему/правому. Это позволяет создавать действительно «резиновые» формы, которые не ломаются при раскрытии на весь экран.
Разберем еще один старый прием от разработчиков. Если нам нужно визуально сгруппировать элементы, чтобы они не разлетались, можно использовать обычный объект Рамка (Группа). Если поместить реквизиты внутрь рамки, и нижний край этой рамки будет находиться выше границы табличной части, платформа будет воспринимать всю группу как единый блок, привязанный к верху. Это помогает избежать ситуации, когда одно поле из группы «улетает», а остальные остаются.
Важный совет: всегда проверяйте форму на разных разрешениях экрана. То, что идеально выглядит на мониторе разработчика, может «поплыть» у пользователя с другим соотношением сторон экрана именно из-за вышеописанных правил работы с табличной частью.