Как сохранить индивидуальные настройки ширины колонок для разных шаблонов в управляемой форме 1С

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

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

В чем причина проблемы

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

Важно понимать, что программное изменение свойства Ширина у элемента формы часто не дает нужного результата, так как пользовательские настройки, сохраненные в хранилище, имеют приоритет над установками в коде. Более того, при изменении ширины мышкой свойство Элемент.Ширина в коде фактически не меняется — это «визуальное» состояние, которое платформа хранит отдельно.

Решение №1: Использование Ключа назначения использования

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

Рассмотрим пример реализации в процедуре ПриСозданииНаСервере:


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

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

Решение №2: Уникальность имен программных элементов

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


// Вместо простого имени используем префикс шаблона
ИмяЭлемента = "ТЧ_" + СокрЛП(Объект.Шаблон.Код) + "_" + СтрПок.Код;
Элт = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ГруппаФормы);
Элт.Вид = ВидПоляФормы.ПолеВвода;
Элт.ПутьКДанным = "Объект.ТЧ." + СтрПок.Код;

При таком подходе даже без использования ключей настройки ширины для Элемент_Шаблон1_Поле1 и Элемент_Шаблон2_Поле1 будут храниться независимо, так как для платформы это два разных элемента. Однако использование КлючаНазначенияИспользования (Решение №1) является более «чистым» с точки зрения архитектуры 1С.

Решение №3: Работа с Ключом сохранения положения окна

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


ЭтаФорма.КлючСохраненияПоложенияОкна = "Окно_" + Объект.Шаблон.Наименование;

Почему ручная работа с ХранилищемСистемныхНастроек сложна

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

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

Итоги и рекомендации

Для реализации корректного сохранения ширины колонок в динамических формах рекомендуем придерживаться следующего алгоритма:

  1. Используйте КлючНазначенияИспользования для разделения контекстов хранения настроек. Это самый эффективный способ.
  2. Убедитесь, что динамически создаваемые колонки имеют стабильные и уникальные имена в рамках одного контекста.
  3. Установите свойство РастягиватьПоГоризонтали = Ложь для создаваемых колонок, если вы хотите, чтобы пользовательская ширина фиксировалась более жестко.
  4. Если пользователь меняет шаблон в процессе работы с документом, рассмотрите вариант оповещения о необходимости переоткрытия формы или программного переоткрытия с новым ключом, чтобы интерфейс мгновенно подстроился под сохраненные ранее предпочтения пользователя для этого шаблона.

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

← На главную