При разработке сложных обработок и документов в платформе «1С:Предприятие 7.7» разработчики часто сталкиваются со штатным ограничением: при изменении размера окна автоматически масштабируется только один многострочный элемент управления (первая таблица значений или табличная часть на форме). Если на разных закладках формы размещено несколько таблиц значений, все последующие таблицы остаются фиксированного размера и не растягиваются по ширине и высоте.
Рассмотрим подробно способы решения этой проблемы, начиная от использования внешних компонент и заканчивая изменением логики работы формы без привлечения стороннего функционала.
Выясним причину такого поведения системы. Штатный механизм авто-масштабирования в 7.7 определяет единственный базовый элемент на форме (обычно первый по порядку обхода или имеющий наименьшую координату верхнего края). Именно его размеры платформа изменяет пропорционально изменению границ окна. Все остальные элементы управления (включая таблицы на скрытых закладках и слоях) сохраняют свои первоначальные размеры, заданные в режиме конфигуратора.
Проанализируем первый вариант решения с помощью популярной внешней компоненты FormEx. Суть метода заключается в том, что платформа растягивает главный элемент (например, табличную часть или первую ТЗ), а мы программно считываем его текущие координаты и применяем их к остальным таблицам при событии изменения размера окна.
Посмотрим на пример реализации с использованием объекта РасширениеФормы:
Процедура ПривязатьТзКТабДока()
Перем Лево, Верх, Ширина, Высота;
// Получаем актуальные координаты элемента, который растягивает сама платформа
РасширениеФормы.МногострочнаяЧасть.ПолучитьКоординаты(Лево, Верх, Ширина, Высота);
// Применяем полученные размеры к таблице значений на другой закладке
РасширениеФормы.ТзОстатков.УстановитьКоординаты(Лево, Верх, Ширина, Высота);
КонецПроцедуры
Процедура ПриИзмененииРазмераОкна(ТипСобытия, ШиринаФормы, ВысотаФормы)
ПривязатьТзКТабДока();
КонецПроцедуры
Обратите внимание на важную особенность: таблица значений, с которой считываются размеры, должна идти первой в порядке обхода элементов диалога. Именно она автоматически изменяется платформой, а остальные таблицы копируют её геометрию.
Другой вариант реализации через FormEx использует объект АтрибутФормы. Этот метод удобен, если на форме размещено множество таблиц на разных закладках.
Разберем пример кода, который пересчитывает координаты сразу для группы таблиц значений:
Процедура ПриИзмененииРазмераОкна(ТипСобытия)
// Проверяем, не свернуто ли окно (ТипСобытия = 1 означает минимизацию)
Если ТипСобытия = 1 Тогда
Возврат;
КонецЕсли;
АтрибутТаб = СоздатьОбъект("АтрибутФормы");
// Получаем координаты эталонной ТЗ, которую масштабирует платформа
АтрибутТаб.УстановитьАтрибут(Форма, "ТабЗаказов");
Лево = 0; Верх = 0; Ширина = 0; Высота = 0;
АтрибутТаб.ПолучитьКоординаты(Лево, Верх, Ширина, Высота);
// Применяем координаты к таблицам на других закладках
АтрибутТаб.УстановитьАтрибут(Форма, "ТабЗаказовПикПоинт");
АтрибутТаб.УстановитьКоординаты(Лево, Верх, Ширина, Высота);
АтрибутТаб.УстановитьАтрибут(Форма, "ТабЗаказовПредоплата");
АтрибутТаб.УстановитьКоординаты(Лево, Верх, Ширина, Высота);
АтрибутТаб.УстановитьАтрибут(Форма, "ТабБоксБери");
АтрибутТаб.УстановитьКоординаты(Лево, Верх, Ширина, Высота);
АтрибутТаб = 0;
КонецПроцедуры
Рассмотрим архитектурный подход, который не требует применения внешних компонент и дополнительных классов.
Вместо создания множества элементов «ТаблицаЗначений» на разных закладках на форму помещается **только одна** физическая таблица значений. При переключении закладок пользователь видит один и тот же элемент управления, но его содержимое динамически меняется.
Алгоритм работы следующего вида:
ТаблицаЗначений для каждой закладки.Выгрузить().Загрузить().Этот способ оптимален, если данные заполняются на лету или объемы таблиц небольшие.
При реализации масштабирования учтем следующие нюансы:
ПриИзмененииРазмераОкна обязательно проверяйте, не свернуто ли окно. Если размеры формы становятся нулевыми или отрицательными, вызов методов установки координат вызовет ошибку геометрии.Видимость(0), платформа перестанет передавать авто-растяжение остальным элементам. Эталонная таблица должна оставаться видимой хотя бы на одной из закладок или слоев.ТабличноеПоле из библиотеки 1С++, а также класс Общие.Форма.Привязка.