Как программно сохранить и восстановить ширину колонок динамически создаваемой таблицы

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Почему автоматическое сохранение не работает для динамических колонок?

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

Выбор подходящего события для сохранения настроек

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

Оптимальные варианты решения:

  1. Использование события ПриЗакрытии на клиенте с последующим вызовом серверной процедуры (если форма закрывается не при выходе из системы).
  2. Создание явной кнопки «Сохранить настройки» в командной панели таблицы.
  3. Использование фоновой записи настроек через ПодключитьОбработчикОжидания, если критически важно сохранять состояние «на лету».

Реализация механизма сохранения через ХранилищеОбщихНастроек

Для реализации задачи нам потребуется обойти коллекцию колонок таблицы, собрать их текущую ширину и упаковать в структуру. Рассмотрим пример кода для сохранения настроек:


&НаСервере
Процедура СохранитьНастройкиКолонокНаСервере()
    
    НастройкиКолонок = Новый Структура;
    ТаблицаФормы = Элементы.ДинамическаяТаблица;
    
    Для Каждого Колонка Из ТаблицаФормы.ПодчиненныеЭлементы Цикл
        // Сохраняем ширину только для колонок
        Если ТипЗнч(Колонка) = Тип("ПолеФормы") Тогда
            НастройкиКолонок.Вставить(Колонка.Имя, Колонка.Ширина);
        КонецЕсли;
    КонецЦикла;
    
    // КлючОбъекта - уникальный идентификатор обработки/формы
    // КлючНастроек - идентификатор конкретной таблицы
    ХранилищеОбщихНастроек.Сохранить("НастройкиШириныТаблиц", "МояДинамическаяТаблица", НастройкиКолонок);
    
КонецПроцедуры

В данном примере мы используем ХранилищеОбщихНастроек. Это системный механизм, который позволяет хранить произвольные данные (структуры, соответствия) в разрезе пользователей. Ключевым моментом здесь является обход коллекции ПодчиненныеЭлементы конкретной таблицы.

Восстановление настроек при открытии формы

После того как данные сохранены, нам нужно их применить. Это следует делать сразу после программного создания колонок в процедуре ПриСозданииНаСервере. Проанализируем алгоритм:

  1. Программно создаем реквизиты и элементы формы (колонки).
  2. Считываем структуру из хранилища настроек.
  3. Проверяем наличие каждой колонки в структуре и устанавливаем свойство Ширина.

&НаСервере
Процедура ВосстановитьНастройкиКолонокНаСервере()
    
    Настройки = ХранилищеОбщихНастроек.Загрузить("НастройкиШириныТаблиц", "МояДинамическаяТаблица");
    
    Если Настройки <> Неопределено Тогда
        Для Каждого Настройка Из Настройки Цикл
            ЭлементКолонка = Элементы.Найти(Настройка.Ключ);
            Если ЭлементКолонка <> Неопределено Тогда
                ЭлементКолонка.Ширина = Настройка.Значение;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры

Проблема «сжимающихся» колонок и как её решить

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

Основные правила настройки визуализации:

Использование технических «заглушек»

Рассмотрим интересный прием, который часто используют опытные разработчики для борьбы с непредсказуемым поведением компоновки. Если вам нужно, чтобы все колонки имели жестко заданную ширину, но при этом не оставалось пустого «серого» пространства справа, добавьте в самый конец таблицы пустую колонку-заглушку. Для этой технической колонки установите РастягиватьПоГоризонтали = Истина, а для всех значимых колонок зафиксируйте ширину. В этом случае все «лишнее» пространство будет поглощено невидимой колонкой, а важные данные останутся в том виде, в котором их настроил пользователь.

Заключение

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

← На главную