Как программно работать с элементами формы, созданными пользователем через настройки?

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

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

Поиск элементов в коллекции «Элементы»

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

Когда пользователь добавляет новую группу, система генерирует для нее внутреннее имя. Оно может выглядеть как Группа1, Группа2 или иметь более сложный идентификатор. Проанализируем ситуацию: искать элемент по точному имени, которое вы привыкли задавать в конфигураторе, здесь не получится. Нам нужно использовать перебор коллекции. Проанализируем пример кода, который позволяет найти пользовательскую группу по её заголовку:


Для Каждого Элемент Из ЭтаФорма.Элементы Цикл
    Если ТипЗнч(Элемент) = Тип("ГруппаФормы") Тогда
        // Проверяем заголовок, который пользователь ввел вручную
        Если Элемент.Заголовок = "Моя Пользовательская Группа" Тогда
            // Мы нашли нужный элемент, теперь можем с ним взаимодействовать
            Элемент.Видимость = Ложь; 
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Важно помнить, что поиск по заголовку — метод не самый надежный, так как пользователь может в любой момент его изменить. Однако, если группа создается для определенных целей и её заголовок регламентирован, такой подход вполне работоспособен.

Использование методов «ПолучитьНастройки» и «УстановитьНастройки»

Если прямой перебор коллекции Элементы не приносит результата (например, на определенных этапах инициализации формы), мы можем обратиться к более глубокому уровню — объекту настроек формы. У управляемой формы существуют специализированные методы для работы со своей структурой. Рассмотрим их подробнее.

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


Настройки = ЭтаФорма.ПолучитьНастройки();
// Объект 'Настройки' содержит структуру пользовательских изменений.
// Мы можем анализировать его, чтобы понять, какие группы были добавлены.

Этот способ позволяет увидеть структуру формы «глазами системы», еще до того, как элементы будут окончательно отрисованы или если они по какой-то причине скрыты системными механизмами. Также существует метод ЭтаФорма.УстановитьНастройки(), который позволяет принудительно применить определенный набор визуальных параметров из кода.

Работа с Хранилищем системных настроек

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

Путь к настройкам обычно выглядит как Общее/НастройкиФорм/ИмяФормы. Посмотрим на пример того, как можно программно обратиться к этим данным:


КлючОбъекта = "Общее/НастройкиФорм/Справочник.Номенклатура.ФормаОбъекта";
Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;

Настройки = ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта, , , Пользователь);

Если Настройки <> Неопределено Тогда
    // Здесь можно проанализировать двоичные данные или структуру настроек
КонецЕсли;

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

Особенности жизненного цикла формы и обработчиков

В обсуждении на форуме упоминается точка останова в обработчике ПередЗакрытием. Разберем по шагам, почему выбор обработчика критически важен для работы с элементами:

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

Важное замечание: Если пользователь создал группу, но не поместил в нее ни одного видимого элемента (или все элементы внутри группы скрыты), платформа может оптимизировать отрисовку, и группа станет невидимой. Однако в коллекции Элементы она все равно будет присутствовать как объект ГруппаФормы.

Ограничения программного взаимодействия

Проанализируем ограничения, с которыми мы сталкиваемся при работе с пользовательскими элементами. Важно понимать разницу между объектами, созданными в конфигураторе, и объектами, добавленными «на лету» пользователем:

Резюме для решения задачи

Для гарантированного взаимодействия с группой, созданной пользователем, мы рекомендуем следующий алгоритм действий:

  1. Убедитесь, что вы обращаетесь к коллекции элементов на сервере или клиенте в событиях после ПриСозданииНаСервере.
  2. Используйте цикл Для Каждого по коллекции Элементы.
  3. Идентифицируйте группу по косвенным признакам: типу ГруппаФормы, заголовку или составу подчиненных элементов (свойство ПодчиненныеЭлементы).
  4. Если требуется глобальный контроль, используйте методы ПолучитьНастройки() или прямое чтение из ХранилищаСистемныхНастроек.

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

← На главную