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