Почему при развороте формы в 1С 7.7 «улетают» вниз диалоговые поля и как это исправить?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Проанализируем ситуацию и алгоритм изменения размеров в 1С 7.7

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

  1. Ориентация на абсолютные координаты: Система полностью игнорирует, на каком слое находятся реквизиты. При изменении размера окна платформа анализирует исключительно абсолютные координаты элементов диалога (такие как top, bottom, left, right).
  2. Правило нижней границы: Любой элемент управления, нижняя граница которого физически находится хотя бы на один пиксель ниже нижней границы растягиваемой Табличной Части (ТЧ) или Таблицы Значений (ТЗ), будет безусловно сдвигаться вниз на ту же высоту, на которую растянулась сама таблица. В 7.7 это сделано для того, чтобы подвал документа динамически освобождал место для увеличивающейся таблицы. Как говорят разработчики: это не баг, это фича.
  3. Ограничение одной таблицы: При изменении размера формы автоматически может растягиваться только одна многострочная таблица. Если на форме присутствует несколько таблиц (например, ТЧ и ТЗ), растягиваться будет только та, которая стоит первой в порядке обхода элементов диалога.

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

Способ 1: Корректировка границ элементов (Встроенный метод)

Самый простой и логичный способ, не требующий сторонних библиотек — это правильное позиционирование элементов относительно табличной части. Разберем два варианта этого подхода:

  1. Смещение выше нижней границы: Сделаем так, чтобы нижняя граница проблемного поля ввода была выше нижней границы ТЧ хотя бы на 1 пиксель. Если визуальный дизайн формы это позволяет, то элемент перестанет распознаваться как находящийся «под» таблицей и останется на своем месте.
  2. Точное выравнивание: Выровняем реквизиты так, чтобы их нижний край строго и попиксельно совпадал с нижним краем ТЧ. Если они находятся на одной линии, реквизиты не будут улетать вниз. Автор изначального вопроса решил проблему именно так: он увеличил высоту ТЧ в документе, и диалоговое поле перестало съезжать.

Способ 2: Использование «Рамки группы» (Скрытый хак)

Рассмотрим старый, но очень действенный недокументированный прием, который часто спасает при сложной верстке. Это использование элемента РамкаГруппы.

Разберем по шагам, как это применить:

  1. Добавьте на форму элемент «Рамка группы».
  2. Сделайте рамку прозрачной (пустой), убрав у нее заголовок.
  3. Поместите рамку нужного размера на форму так, чтобы визуально «запереть» внутри нее или объединить непослушные элементы.

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

Способ 3: Полное отключение изменения размеров

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

Зайдите в свойства формы и снимите галочку «Изменять размер». Теперь форма будет иметь жестко фиксированные габариты. Ничего уезжать не будет, но и табличная часть растягиваться перестанет. Это компромиссное решение, подходящее для небольших обработок и вспомогательных окон.

Способ 4: Использование компонент FormEx и 1C++ для гибких привязок

Если интерфейс перегружен слоями, отключение масштабирования недопустимо, а хочется сделать «красиво», как в современных платформах (например, в 1С 8.х), мы применим тяжелую артиллерию — внешнюю компоненту FormEx в связке с 1C++.

Компонента FormEx умеет перехватывать системные сообщения Windows об изменении размера окна и полностью отключает встроенный "топорный" алгоритм платформы 1С 7.7. С помощью специальных загружаемых классов программист получает возможность настраивать так называемые "якоря" для каждого элемента диалога.

Рассмотрим, как примерно работает класс Общие.Форма.Привязка. Вы можете программно привязать левую границу текстового поля к левой стороне формы, а правую — сделать эластичной.


// Пример логики настройки привязок (псевдокод для 1С++)
Привязка = СоздатьОбъект("Общие.Форма.Привязка");
Привязка.Установить("ПолеВвода1", "Лево", "Форма", "Лево");
Привязка.Установить("ПолеВвода1", "Верх", "Форма", "Верх");

Используя этот механизм, вы можете добиться идеального масштабирования: элементы будут растягиваться пропорционально, оставаться на своих местах и не будут хаотично «улетать» в подвал формы. Это единственный гарантированный способ сделать сложную многослойную форму в 7.7 полностью адекватной при любых разрешениях экрана пользователя.

Подводим итоги

Мы проанализировали причины смещения полей ввода в 1С 7.7. Для быстрого исправления достаточно подтянуть элементы диалога так, чтобы они не были ниже табличной части, или использовать прозрачную рамку группы. Если же вы разрабатываете сложный и современный (по меркам версии 7.7) интерфейс, смело снимайте флаг изменения размера в свойствах окна и переходите на программное управление привязками с помощью FormEx.

← На главную