Как растягивать несколько таблиц значений по ширине формы в 1С v7.7

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

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

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

Причина ограничения платформы «1С:Предприятие 7.7»

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

Способ 1. Синхронизация координат с помощью объекта «РасширениеФормы» (FormEx)

Проанализируем первый вариант решения с помощью популярной внешней компоненты FormEx. Суть метода заключается в том, что платформа растягивает главный элемент (например, табличную часть или первую ТЗ), а мы программно считываем его текущие координаты и применяем их к остальным таблицам при событии изменения размера окна.

Посмотрим на пример реализации с использованием объекта РасширениеФормы:


Процедура ПривязатьТзКТабДока()
    Перем Лево, Верх, Ширина, Высота;
    
    // Получаем актуальные координаты элемента, который растягивает сама платформа
    РасширениеФормы.МногострочнаяЧасть.ПолучитьКоординаты(Лево, Верх, Ширина, Высота);
    
    // Применяем полученные размеры к таблице значений на другой закладке
    РасширениеФормы.ТзОстатков.УстановитьКоординаты(Лево, Верх, Ширина, Высота);    
КонецПроцедуры

Процедура ПриИзмененииРазмераОкна(ТипСобытия, ШиринаФормы, ВысотаФормы)
    ПривязатьТзКТабДока();
КонецПроцедуры

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

Способ 2. Использование объекта «АтрибутФормы» (FormEx)

Другой вариант реализации через FormEx использует объект АтрибутФормы. Этот метод удобен, если на форме размещено множество таблиц на разных закладках.

Разберем пример кода, который пересчитывает координаты сразу для группы таблиц значений:


Процедура ПриИзмененииРазмераОкна(ТипСобытия)
    // Проверяем, не свернуто ли окно (ТипСобытия = 1 означает минимизацию)
    Если ТипСобытия = 1 Тогда
        Возврат;
    КонецЕсли;
    
    АтрибутТаб = СоздатьОбъект("АтрибутФормы");
    
    // Получаем координаты эталонной ТЗ, которую масштабирует платформа
    АтрибутТаб.УстановитьАтрибут(Форма, "ТабЗаказов");
    
    Лево = 0; Верх = 0; Ширина = 0; Высота = 0;
    АтрибутТаб.ПолучитьКоординаты(Лево, Верх, Ширина, Высота);
    
    // Применяем координаты к таблицам на других закладках
    АтрибутТаб.УстановитьАтрибут(Форма, "ТабЗаказовПикПоинт");
    АтрибутТаб.УстановитьКоординаты(Лево, Верх, Ширина, Высота);
    
    АтрибутТаб.УстановитьАтрибут(Форма, "ТабЗаказовПредоплата");
    АтрибутТаб.УстановитьКоординаты(Лево, Верх, Ширина, Высота);
    
    АтрибутТаб.УстановитьАтрибут(Форма, "ТабБоксБери");
    АтрибутТаб.УстановитьКоординаты(Лево, Верх, Ширина, Высота);
    
    АтрибутТаб = 0;
КонецПроцедуры

Способ 3. Использование одной физической ТЗ на форме

Рассмотрим архитектурный подход, который не требует применения внешних компонент и дополнительных классов.

Вместо создания множества элементов «ТаблицаЗначений» на разных закладках на форму помещается **только одна** физическая таблица значений. При переключении закладок пользователь видит один и тот же элемент управления, но его содержимое динамически меняется.

Алгоритм работы следующего вида:

  1. На форме размещается одна таблица значений, которая штатно масштабируется платформой.
  2. В модуле формы создаются служебные (виртуальные) объекты ТаблицаЗначений для каждой закладки.
  3. В обработчике выбора закладки текущие данные из визуальной таблицы копируются в соответствующий виртуальный объект методом Выгрузить().
  4. Затем из служебной ТЗ нужной закладки данные загружаются обратно в визуальную таблицу методом Загрузить().

Этот способ оптимален, если данные заполняются на лету или объемы таблиц небольшие.

Важные технические рекомендации

При реализации масштабирования учтем следующие нюансы:

← На главную