Как программно получить и обработать пользовательские настройки отображения реквизитов на форме 1С

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

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

Анализ проблемы: почему элементы исчезают из коллекции?

Рассмотрим ситуацию, описанную разработчиками. При попытке перебора подчиненных элементов таблицы через Элементы.ТЧ.ПодчиненныеЭлементы в цикле, программно созданные (для которых применимы методы программного изменения форм) или стандартные колонки доступны без проблем. Однако колонки, добавленные пользователем интерактивно, могут не входить в ожидаемую иерархию элементов на определенных этапах жизненного цикла формы. Это происходит потому, что пользовательские настройки накладываются платформой поверх программной структуры формы.

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

Решение 1: Использование Хранилища системных настроек

Для того чтобы «достать» структуру формы, измененную пользователем, нам необходимо обратиться к системному хранилищу (для работы с которым можно использовать просмотр и очистку хранилища настроек пользователя). Ключ настроек формируется по определенному правилу: "ИмяОбъекта/ИмяФормы/НастройкиФормы".

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


// Определяем путь к настройкам формы
ПутьКНастройкам = "Документ.ИмяВашегоДокумента.Форма.ФормаДокумента/НастройкиФормы";

// Загружаем настройки из системного хранилища
НастройкиФормы = ХранилищеСистемныхНастроек.Загрузить(ПутьКНастройкам);

// Если настройки существуют, мы можем проанализировать их структуру
Если НастройкиФормы <> Неопределено Тогда
    // Для отладки можно преобразовать объект во внутреннюю строку
    ТекстНастроек = ЗначениеВСтрокуВнутр(НастройкиФормы);
    // Далее следует логика парсинга или анализа полученного объекта
КонецЕсли;

После получения объекта НастройкиФормы мы можем увидеть все изменения, внесенные пользователем. Однако стоит учитывать, что работа с внутренним представлением (строкой) — это крайний метод («костыль»), который требует осторожности при обновлении платформы.

Решение 2: Современный метод ПолучитьНастройкиФормы() (платформа 8.3.15+)

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


// Вызываем метод непосредственно у объекта формы
Настройки = ЭтаФорма.ПолучитьНастройкиФормы();

// Проходим по коллекции элементов в настройках
Для Каждого ЭлементНастройки Из Настройки.Элементы Цикл
    // Здесь мы можем проверить Имя элемента и его путь к данным
    Сообщить("Элемент: " + ЭлементНастройки.Имя + ", Видимость: " + ЭлементНастройки.Видимость);
КонецЦикла;

Этот метод позволяет увидеть не только стандартные элементы, но и те, которые пользователь добавил через механизм «Изменить форму». У таких элементов свойство ПутьКДанным будет указывать на реквизит, который пользователь решил отобразить.

Особенности коллекции «Элементы» и моменты выполнения кода

Выясним причину, по которой элементы могут быть недоступны в ПриСозданииНаСервере. На этом этапе платформа только начинает инициализировать форму, и пользовательские настройки могут быть еще не применены в полном объеме.

Если вам нужно гарантированно работать с финальным составом колонок, включая те, что добавил пользователь, обратите внимание на следующие события:

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

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

Практические советы по реализации «Универсального цикла»

Разберем, как объединить стандартные и пользовательские колонки в один массив для обработки (например, для установки условного оформления или программного изменения свойств):

  1. Шаг 1: Получаем список стандартных колонок через Элементы.ТЧ.ПодчиненныеЭлементы.
  2. Шаг 2: Загружаем структуру из ХранилищаСистемныхНастроек или через ПолучитьНастройкиФормы().
  3. Шаг 3: Проверяем настройки на наличие новых элементов, чей Родитель соответствует вашей таблице.
  4. Шаг 4: Объединяем полученные имена элементов в единый массив МассивДляОбработки.
  5. Шаг 5: Запускаем цикл по этому массиву, обращаясь к элементам через ЭтаФорма.Элементы[ИмяИзМассива].

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

Резюме

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

← На главную