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