Как программно изменить ширину колонки табличной части документа в 1С 7.7?

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

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

Ограничения штатного механизма платформы 1С 7.7

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

В штатном визуальном редакторе платформы элемент диалога «Многострочная часть» не предоставляет объектной модели для управления своими колонками. Встроенный язык не позволяет программно считывать или изменять ширину, видимость и порядок следования колонок. Дополнительно накладывается механизм сохранения пользовательских настроек: как только пользователь вручную сдвигает границу столбца мышью, платформа сохраняет эти координаты в реестре Windows индивидуально для конкретного пользователя. В результате при открытии документа сохраненные параметры берут приоритет над эталонными значениями формы, что часто приводит к нарушению читаемости интерфейса на экранах с другим разрешением.

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

Решение с использованием компоненты FormEx

Наиболее прямолинейный и проверенный способ управления штатными элементами диалога — использование внешней компоненты FormEx. В объекте РасширениеФормы реализован специальный метод УстановитьШиринуКолонки().

Синтаксис метода:

УстановитьШиринуКолонки(ИмяЭлемента, НомерКолонки, Ширина)

Разберем параметры подробнее:

  1. ИмяЭлемента — строковый идентификатор элемента. Для обращения к стандартной табличной части документа передается значение "МногострочнаяЧасть". Если управление требуется для таблицы значений на форме, указывается её идентификатор в диалоге.
  2. НомерКолонки — целочисленный индекс колонки, нумерация начинается с нуля.
  3. Ширина — числовое положительное значение новой ширины колонки в экранных единицах. При передаче значения 0 колонка визуально скрывается (схлопывается).

Критически важная особенность: метод УстановитьШиринуКолонки() работает только с существующим дескриптором окна Windows. Это означает, что его нельзя вызывать в стандартной процедуре формы ПриОткрытии(), так как в этот момент визуальные элементы управления в системе еще не созданы.

Посмотрим на пример правильной инициализации и установки ширины колонок через отложенный вызов или внешнее событие:


// Пример управления колонками в модуле формы документа
Перем глФормаРасширение;

Процедура ПослеОткрытияФормы()
    // Метод вызывается после полной прорисовки элементов Windows
    Если ПустоеЗначение(глФормаРасширение) = 0 Тогда
        // Устанавливаем ширину первой колонки (номер 0, например, НомерСтроки)
        глФормаРасширение.УстановитьШиринуКолонки("МногострочнаяЧасть", 0, 30);
        
        // Расширяем колонку наименования номенклатуры (номер 1)
        глФормаРасширение.УстановитьШиринуКолонки("МногострочнаяЧасть", 1, 250);
        
        // Скрываем ненужную для роли служебную колонку (номер 2)
        глФормаРасширение.УстановитьШиринуКолонки("МногострочнаяЧасть", 2, 0);
    КонецЕсли;
КонецПроцедуры

Процедура ПриОткрытии()
    // Создаем объект расширения формы из FormEx
    Попытка
        глФормаРасширение = СоздатьОбъект("РасширениеФормы");
    Исключение
        глФормаРасширение = "";
    КонецПопытки;
    
    // Если FormEx не генерирует событие ПослеОткрытия, 
    // можно задействовать штатную обработку ожидания на 1 секунду
    ОбработкаОжидания("ПослеОткрытияФормы", 1);
КонецПроцедуры

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

Динамическое масштабирование и пропорции

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

  1. Метод ПолучитьШиринуКолонки("МногострочнаяЧасть", НомерКолонки) — позволяет зафиксировать исходные пропорции до начала масштабирования.
  2. Событие формы ПриИзмененииРазмераОкна(Контекст, ТипСобытия, Ширина, Высота) — срабатывает в момент изменения габаритов окна пользователем.

Разберем по шагам логику расчета: при изменении ширины окна мы получаем новое значение общей доступной ширины формы, вычисляем коэффициент масштабирования относительно базового разрешения и последовательно применяем УстановитьШиринуКолонки() к целевым колонкам таблицы.

Альтернатива: ТабличноеПоле из состава 1С++

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

Преимущества данного подхода:

  1. Полноценная объектная модель: каждая колонка табличного поля является отдельным объектом с доступными на чтение и запись свойствами Ширина, Видимость, Положение.
  2. Автоматическое масштабирование: контрол поддерживает штатные привязки к границам окна, а также режим автоподбора ширины колонок.
  3. Независимость от оконных дескрипторов: свойства можно задавать штатно на этапе инициализации формы без необходимости отложенных вызовов через оконные таймеры.

Вопросы надежности и эксплуатации в высоконагруженных базах

При внедрении низкоуровневых компонент в системы с непрерывным режимом работы 24/7 и количеством пользователей от 1000+ закономерно встает вопрос стабильности. Опыт промышленной эксплуатации FormEx и 1С++ показывает следующие результаты:

  1. Стабильность ядра: компоненты FormEx и 1С++ развивались параллельно на протяжении десятилетий. При корректном обращении к объектам (проверка на создание через Попытка ... Исключение, вызов методов строго после инициализации оконных элементов) компоненты работают стабильно годами без утечек памяти и аварийных завершений сеансов.
  2. Разделение библиотек: исторически FormEx входил в поставку 1С++, однако затем выделился в самостоятельную внешнюю библиотеку. Они не конфликтуют между собой и штатно загружаются совместно в глобальном модуле при старте системы.
  3. Совместимость с ОС: для исключения сбоев в современных версиях Windows и на терминальных серверах необходимо использовать последние стабильные сборки FormEx, где устранены исторические проблемы перерисовки оконных контекстов.

Таким образом, для типовой табличной части оптимальным и наименее трудоемким решением является связка FormEx и метода УстановитьШиринуКолонки(), а при масштабной переработке интерфейса — переход на ТабличноеПоле от 1С++.

← На главную