При разработке сложных интерфейсов на управляемых формах 1С часто возникает задача динамического изменения состава колонок в табличной части (аналогично тому, как выполняется доработка динамических списков). Типичный пример: в зависимости от выбранного «Шаблона» в документе программно добавляются дополнительные реквизиты. Однако разработчики сталкиваются с проблемой — пользователь вручную настраивает ширину колонок, но при смене шаблона или повторном открытии настройки «слетают», перемешиваются или применяются некорректно (в том числе когда реализовано программное перемещение колонки). Рассмотрим подробно, почему это происходит и как заставить платформу 1С корректно сохранять настройки в разрезе каждого шаблона.
Разберем ситуацию: когда пользователь меняет ширину колонки мышкой в пользовательском режиме, платформа 1С сохраняет эти изменения в системное хранилище настроек. По умолчанию эти настройки привязываются к полному имени формы (например, Документ.РабочийЛист.Форма.ФормаДокумента). Если состав колонок меняется динамически, 1С пытается применить сохраненные настройки по именам элементов. Если в разных шаблонах элементы называются одинаково, настройки будут конфликтовать. Если же имена разные, платформа может просто не найти соответствия при переключении контекста.
Важно понимать, что программное изменение свойства Ширина у элемента формы часто не дает нужного результата, так как пользовательские настройки, сохраненные в хранилище, имеют приоритет над установками в коде. Более того, при изменении ширины мышкой свойство Элемент.Ширина в коде фактически не меняется — это «визуальное» состояние, которое платформа хранит отдельно.
Проанализируем самый надежный и штатный способ решения задачи. У управляемой формы есть свойство КлючНазначенияИспользования. Это строковый идентификатор, который позволяет системе разделять настройки одной и той же формы для разных ситуаций. Если мы будем менять этот ключ в зависимости от выбранного шаблона, 1С будет хранить отдельный набор пользовательских настроек (ширину колонок, видимость, положение и условное оформление) для каждого уникального ключа.
Рассмотрим пример реализации в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Определяем уникальный ключ на основании выбранного шаблона
Если ЗначениеЗаполнено(Объект.Шаблон) Тогда
// Используем УИД шаблона или его наименование для уникальности
ЭтаФорма.КлючНазначенияИспользования = Строка(Объект.Шаблон.Ссылка.УникальныйИдентификатор());
КонецЕсли;
// Далее следует ваш код по генерации динамических колонок
КолонкиШаблона();
КонецПроцедуры
Важный нюанс: Ключ необходимо устанавливать именно в момент создания формы. Если шаблон меняется пользователем уже в открытой форме, простое изменение свойства КлючНазначенияИспользования не приведет к мгновенной перезагрузке настроек из хранилища. В этом случае потребуется программное переоткрытие этой же формы с передачей нового ключа в параметрах.
Выясним причину, по которой настройки могут «затирать» друг друга. Если вы создаете элементы управления программно, используя метод Элементы.Добавить(), крайне важно давать им уникальные имена, включающие идентификатор шаблона. Рассмотрим, как модифицировать стандартный код добавления реквизитов:
// Вместо простого имени используем префикс шаблона
ИмяЭлемента = "ТЧ_" + СокрЛП(Объект.Шаблон.Код) + "_" + СтрПок.Код;
Элт = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ГруппаФормы);
Элт.Вид = ВидПоляФормы.ПолеВвода;
Элт.ПутьКДанным = "Объект.ТЧ." + СтрПок.Код;
При таком подходе даже без использования ключей настройки ширины для Элемент_Шаблон1_Поле1 и Элемент_Шаблон2_Поле1 будут храниться независимо, так как для платформы это два разных элемента. Однако использование КлючаНазначенияИспользования (Решение №1) является более «чистым» с точки зрения архитектуры 1С.
Посмотрим на дополнительное свойство — КлючСохраненияПоложенияОкна. Оно работает аналогично ключу назначения использования, но отвечает именно за геометрические параметры самого окна (размер, координаты на экране). Если ваши шаблоны подразумевают сильно разное количество колонок (в одном шаблоне 2 колонки, в другом — 20), пользователю будет удобно, если программа запомнит еще и разный размер самого окна документа для каждого случая.
ЭтаФорма.КлючСохраненияПоложенияОкна = "Окно_" + Объект.Шаблон.Наименование;
Проанализируем ситуацию, описанную в сообщениях темы, где автор пытался вручную сохранять и загружать настройки через ХранилищеСистемныхНастроек.Сохранить(). Этот метод трудно применим для управления шириной колонок напрямую по следующим причинам:
Элемент.Ширина, доступном из кода, поэтому вам просто «нечего» сохранять в хранилище вручную стандартными средствами получения свойств.Для реализации корректного сохранения ширины колонок в динамических формах рекомендуем придерживаться следующего алгоритма:
РастягиватьПоГоризонтали = Ложь для создаваемых колонок, если вы хотите, чтобы пользовательская ширина фиксировалась более жестко.Применяя эти методы, вы обеспечите комфортную работу пользователей с гибкими интерфейсами, сохраняя все индивидуальные настройки отображения данных.