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

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

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

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

Способ 1. Профессиональное решение через внешнюю компоненту 1С++ (Рекомендуется)

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

Объект ТабличноеПоле предоставляет разработчику полный контроль над поведением колонок и строк. В частности, у него есть специализированное свойство ИзменениеРазмера для управления интерактивным изменением ширины.

Рассмотрим пошагово, как реализовать этот метод в коде модуля формы:

  1. Создадим на форме элемент управления типа «ТабличноеПоле» (через класс ТабличноеПоле компоненты 1С++).
  2. В модуле формы при открытии настроим параметры колонок и запретим их изменение.

Пример программного кода для инициализации таблицы и запрета изменения ширины конкретной колонки:


// Создаем объект ТабличноеПоле на форме
ТаблПоле = СоздатьОбъект("ТабличноеПоле");

// Добавляем колонку и сразу отключаем возможность изменения ее размера
КолонкаНоменклатура = ТаблПоле.Колонки.Добавить("Номенклатура");
КолонкаНоменклатура.Ширина = 150;
КолонкаНоменклатура.ИзменениеРазмера = 0; // 0 - запрещено, 1 - разрешено

КолонкаКоличество = ТаблПоле.Колонки.Добавить("Количество");
КолонкаКоличество.Ширина = 80;
КолонкаКоличество.ИзменениеРазмера = 0; // Блокируем изменение ширины

Если нам необходимо запретить пользователю любые манипуляции со структурой колонок (не только изменение ширины, но и их перетаскивание, скрытие и т.д.) сразу для всей таблицы, мы можем применить глобальное свойство объекта:


// Полный запрет интерактивной настройки колонок пользователем
ТабличноеПоле.ИзменятьНастройкуКолонок = 0;

Этот способ является наиболее надежным, так как он работает на уровне системных событий Windows-виджетов и предотвращает само появление курсора изменения размера на границе колонок.

Способ 2. Штатный обходной путь через формулу текстового поля («Костыль»)

Что делать, если использование внешних компонент в вашей организации категорически запрещено политикой безопасности или техническими регламентами? Нам придется прибегнуть к классической хитрости разработчиков 1С 7.7 — динамическому восстановлению параметров колонок «на лету».

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

Выполним следующие шаги для реализации этого метода:

  1. Откройте форму в Конфигураторе и добавьте новый элемент управления «Текст».
  2. Разместите его в незаметном месте формы, уменьшите его размер до минимума (например, 1х1 пиксель) и снимите флажок «Рамка», чтобы он визуально сливался с фоном формы.
  3. В свойствах этого текстового поля на вкладке «Дополнительно» в поле «Формула» впишите вызов нашей будущей функции: глВосстановитьШирину().
  4. В модуле формы опишите данную функцию. Она должна программно восстанавливать размеры колонок вашей таблицы значений (в примере ТЗ называется ТаблицаТоваров):

Функция глВосстановитьШирину()
    // Принудительно устанавливаем ширину для каждой колонки ТЗ
    // Параметры метода: Идентификатор, Тип, Заголовок, Ширина, Формат, Скрипт
    ТаблицаТоваров.УстановитьПараметрыКолонки("Товар", , , 35);
    ТаблицаТоваров.УстановитьПараметрыКолонки("Цена", , , 12);
    ТаблицаТоваров.УстановитьПараметрыКолонки("Количество", , , 10);
    
    // Функция обязательно должна возвращать пустую строку,
    // чтобы на форме в невидимом текстовом поле ничего не отображалось
    Возврат ""; 
КонецФункции

Как это работает на практике: Когда пользователь пытается потянуть мышкой за границу колонки Товар, чтобы сделать ее шире, операционная система фиксирует перемещение курсора, платформа 1С мгновенно перерисовывает форму и вычисляет формулу нашего текстового поля. Функция глВосстановитьШирину() отрабатывает за доли секунды и возвращает колонку к жестко заданному размеру в 35 единиц. Визуально это выглядит так, будто колонка «прибита гвоздями» и не поддается растягиванию.

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

Способ 3. Блокировка всей таблицы через свойство «Доступность»

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

Для этого достаточно установить свойство недоступности элемента формы:


// Полная блокировка интерактивных действий с таблицей значений
Форма.ТаблицаТоваров.Доступность(0);

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

Способ 4. Тонкая настройка свойств формы и борьбы с растягиванием колонок

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

Для борьбы с этим поведением мы рекомендуем проверить настройки самой многострочной части (или ТЗ) непосредственно в Конфигураторе:

  1. Откройте свойства таблицы значений на форме в Конфигураторе.
  2. Перейдите на вкладку «Общие».
  3. Найдите флажок «Автонастройка ширины колонок».
  4. Снимите этот флажок.

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

Дополнительно, используя внешнюю компоненту FormEx, мы можем полностью запретить пользователю максимизировать данную форму, убрав системную кнопку «Развернуть» в заголовке окна. Окно всегда будет оставаться фиксированного размера, что полностью решит проблему нежелательного масштабирования интерфейса.

Резюме

Мы рассмотрели различные подходы к ограничению интерактивного изменения ширины колонок в 1С 7.7. Выбор конкретного метода зависит от архитектуры вашей информационной базы:

← На главную