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