Как растянуть несколько таблиц значений на всю высоту и ширину формы в 1С 7.7?

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

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

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

Выясняем причину поведения платформы

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

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

Решение 1. Программное управление координатами через FormEx

Если вам нужно привязать размеры и координаты второй ТЗ к размерам первой ТЗ или к границам табличной части документа, самым простым и лаконичным решением будет использование внешней компоненты FormEx. Этот метод не требует подключения сложных библиотек классов и реализуется буквально в десяток строк кода.

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

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


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

Теперь нам необходимо обеспечить вызов этой процедуры при каждом изменении размеров окна пользователем. Для этого задействуем предопределенное событие внешней компоненты FormEx — ПриИзмененииРазмераОкна():


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

Важный нюанс: этот метод также необходимо вызывать при открытии формы и при переключении закладок (в процедуре ПриВыбореЗакладки()), чтобы избежать визуальных искажений интерфейса в момент инициализации экрана.

Решение 2. Использование классов привязки (FormEx и 1С++)

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

Наиболее популярными являются класс «Общие.Форма.Привязка» (автор JohnyDeath) и класс «Общие.Форма.Привязки» (автор АЛьФ / dorex).

Разберем по шагам, как настроить и использовать класс привязок в вашей форме:

  1. Зарегистрируйте класс привязок в конфигурационном файле defcls.prm вашей базы данных, указав путь к соответствующему скрипту класса.
  2. В самом модуле формы объявите глобальную переменную для хранения объекта привязок:

Перем гРФорма;

  1. В предопределенной процедуре ПриОткрытии() инициализируйте объект класса и передайте ему контекст текущей формы:

Процедура ПриОткрытии()
    // Создаем объект класса привязок
    гРФорма = СоздатьОбъект("Общие.Форма.Привязка");
    гРФорма.УстановитьФорму(Форма);
    
    // Настраиваем правила привязки для элементов формы.
    // Параметры метода Привязка: ИдентификаторЭлемента, ГраницаЭлемента, ИдентификаторРодителя, ГраницаРодителя
    // Символы означают стороны: L (Left - лево), R (Right - право), T (Top - верх), B (Bottom - низ)
    
    // Привязываем левую, правую, верхнюю и нижнюю границы таблицы "ТзОстатков" к границам самой формы
    гРФорма.Привязка("ТзОстатков", "L", "Форма", "L");
    гРФорма.Привязка("ТзОстатков", "R", "Форма", "R");
    гРФорма.Привязка("ТзОстатков", "T", "Форма", "T");
    гРФорма.Привязка("ТзОстатков", "B", "Форма", "B");
КонецПроцедуры
  1. В процедуре ПриИзмененииРазмераОкна() передайте управление объекту класса, чтобы он автоматически пересчитал координаты всех привязанных элементов по заданным правилам:

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

Обратите внимание: для корректной работы классов привязок в свойствах формы внутри Конфигуратора 1С 7.7 **настоятельно рекомендуется снять галочку "Изменять размер"**. Платформа будет считать форму статичной, а внешняя компонента перехватит управление отрисовкой окна, позволяя пользователю растягивать его без конфликтов со встроенными алгоритмами 1С.

Решение 3. Архитектурный обход без внешних компонент (Метод одной ТЗ)

Что делать, если на вашем предприятии действуют строгие политики безопасности и использование внешних компонент (таких как FormEx.dll или 1cpp.dll) категорически запрещено? Выход есть, и он заключается в изменении архитектуры построения интерфейса.

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

Проанализируем пример кода, который необходимо разместить в обработчике переключения закладок:


Процедура ПриВыбореЗакладки(НомерЗакладки, ЗначениеЗакладки)
    // Очищаем данные таблицы значений
    ТзОбщая.Очистить();
    
    // Поскольку в 1С 7.7 нет метода удаления колонок, мы полностью пересоздаем структуру ТЗ.
    // Для этого мы можем воспользоваться методом НоваяКолонка() на чистой ТЗ.
    // Примечание: Чтобы полностью сбросить колонки, можно воспользоваться приемом 
    // инициализации ТЗ через выгрузку из пустой ТЗ-шаблона или программно пересоздать объект.
    
    Если НомерЗакладки = 1 Тогда
        // Формируем структуру колонок для первой закладки (например, Складские остатки)
        ТзОбщая.НоваяКолонка("Товар", "Справочник.Номенклатура");
        ТзОбщая.НоваяКолонка("Остаток", "Число", 15, 3);
        
        // Заполняем ТЗ данными для первой закладки
        ЗаполнитьОстаткиТоваров();
        
    ИначеЕсли НомерЗакладки = 2 Тогда
        // Формируем структуру для второй закладки (например, Взаиморасчеты)
        ТзОбщая.НоваяКолонка("Контрагент", "Справочник.Контрагенты");
        ТзОбщая.НоваяКолонка("Долг", "Число", 15, 2);
        
        // Заполняем ТЗ данными для второй закладки
        ЗаполнитьВзаиморасчеты();
    КонецЕсли;
    
    // Принудительно обновляем отображение ТЗ на форме
    Форма.Обновить();
КонецПроцедуры

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

Решение 4. Использование сплиттеров (Splitters)

Иногда задача усложняется: нужно расположить несколько таблиц значений не на разных закладках, а одновременно на одном экране (например, сверху отображается список документов, а снизу — ТЗ с детальным составом выбранного документа). Просто привязать границы ТЗ к краям формы в этом случае недостаточно — при растягивании окна они начнут накладываться друг на друга.

Для решения этой проблемы используются **сплиттеры** (разделяющие линии). Сплиттер — это интерактивный элемент интерфейса (линия), который пользователь может перетаскивать мышью, меняя тем самым пропорции разделяемых областей.

Классы привязок на базе 1С++ поддерживают работу со сплиттерами. При изменении положения сплиттера класс автоматически уменьшает высоту верхней таблицы значений и увеличивает высоту нижней, не давая им перекрывать друг друга и сохраняя целостность интерфейса. Если на вашей форме планируется сложный интерфейс с тремя ТЗ, обязательно рассмотрите возможность внедрения класса привязок с поддержкой сплиттеров.

Инструменты для облегчения разработки

Ручная настройка координат и написание правил привязки для десятка элементов формы — кропотливый процесс, требующий постоянного перезапуска системы для проверки результатов. Чтобы упростить эту работу, воспользуйтесь специализированной утилитой — **«Редактор формы для 7.7 + Настройка привязок»**.

Эта внешняя обработка запускается непосредственно в режиме "1С:Предприятие" и позволяет в интерактивном визуальном режиме настраивать связи элементов мышкой. После завершения настройки утилита автоматически сгенерирует готовый программный код привязок, который вам останется лишь скопировать и вставить в процедуру ПриОткрытии() вашей формы.

← На главную