При разработке интерфейсов в 1С:Предприятие 7.7 программисты часто сталкиваются с неприятным визуальным эффектом: при развороте окна на полный экран (или при его простом растягивании) некоторые текстовые поля ввода, кнопки или другие реквизиты диалога «съезжают» к самому низу формы. В этой статье мы подробно разберем эту проблему, выясним причину такого поведения платформы и рассмотрим несколько эффективных способов решения.
Для начала разберем, почему вообще происходит смещение элементов. Многие разработчики ошибочно полагают, что проблема кроется в слоях или в неправильном порядке обхода реквизитов. Однако платформа 1С 7.7 имеет свой специфический встроенный алгоритм автомасштабирования, который работает по следующим правилам:
top, bottom, left, right).Посмотрим на пример из практики: вы разместили информационное текстовое поле на другом слое поверх или сбоку от таблицы, но его нижний край оказался чуть ниже края ТЧ. При развороте окна табличная часть удлиняется, и алгоритм 1С выталкивает наше поле вниз, чтобы оно не перекрывало новые строки таблицы. Выяснив эту особенность, рассмотрим по шагам методы борьбы с этим явлением.
Самый простой и логичный способ, не требующий сторонних библиотек — это правильное позиционирование элементов относительно табличной части. Разберем два варианта этого подхода:
Рассмотрим старый, но очень действенный недокументированный прием, который часто спасает при сложной верстке. Это использование элемента РамкаГруппы.
Разберем по шагам, как это применить:
Встроенный алгоритм платформы воспринимает такую рамку как жесткую границу. Во многих случаях система перестает хаотично сдвигать реквизиты, оказавшиеся внутри этой рамки, сохраняя первоначальный вид интерфейса.
Если вам не критично, чтобы форма растягивалась на весь экран, проблему можно решить радикально.
Зайдите в свойства формы и снимите галочку «Изменять размер». Теперь форма будет иметь жестко фиксированные габариты. Ничего уезжать не будет, но и табличная часть растягиваться перестанет. Это компромиссное решение, подходящее для небольших обработок и вспомогательных окон.
Если интерфейс перегружен слоями, отключение масштабирования недопустимо, а хочется сделать «красиво», как в современных платформах (например, в 1С 8.х), мы применим тяжелую артиллерию — внешнюю компоненту FormEx в связке с 1C++.
Компонента FormEx умеет перехватывать системные сообщения Windows об изменении размера окна и полностью отключает встроенный "топорный" алгоритм платформы 1С 7.7. С помощью специальных загружаемых классов программист получает возможность настраивать так называемые "якоря" для каждого элемента диалога.
Рассмотрим, как примерно работает класс Общие.Форма.Привязка. Вы можете программно привязать левую границу текстового поля к левой стороне формы, а правую — сделать эластичной.
// Пример логики настройки привязок (псевдокод для 1С++)
Привязка = СоздатьОбъект("Общие.Форма.Привязка");
Привязка.Установить("ПолеВвода1", "Лево", "Форма", "Лево");
Привязка.Установить("ПолеВвода1", "Верх", "Форма", "Верх");
Используя этот механизм, вы можете добиться идеального масштабирования: элементы будут растягиваться пропорционально, оставаться на своих местах и не будут хаотично «улетать» в подвал формы. Это единственный гарантированный способ сделать сложную многослойную форму в 7.7 полностью адекватной при любых разрешениях экрана пользователя.
Мы проанализировали причины смещения полей ввода в 1С 7.7. Для быстрого исправления достаточно подтянуть элементы диалога так, чтобы они не были ниже табличной части, или использовать прозрачную рамку группы. Если же вы разрабатываете сложный и современный (по меркам версии 7.7) интерфейс, смело снимайте флаг изменения размера в свойствах окна и переходите на программное управление привязками с помощью FormEx.