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