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

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

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

Понимание механизма создания пользовательских полей

Когда пользователь добавляет поле в таблицу через меню настройки формы, платформа динамически создает новый элемент формы. Если это поле добавлено «через точку» (разыменование ссылки), 1С выполняет следующие действия:

  1. Создает новый элемент формы типа ПолеФормы.
  2. Автоматически генерирует уникальное имя для этого элемента.
  3. Связывает его с данными через путь, содержащий точки (например, Объект.Товары.Номенклатура.Артикул).

Проанализируем алгоритм формирования имени. Платформа обычно использует шаблон: [ИмяТаблицы][ИмяРеквизита][ИмяПоля], где сегменты разделяются подчеркиванием. Например, если в табличной части Товары для реквизита Номенклатура пользователь вывел поле Артикул, имя элемента в коллекции Элементы будет выглядеть как ТоварыНоменклатураАртикул.

Программный поиск пользовательских элементов

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

Посмотрим на пример кода, который позволяет идентифицировать такие поля:


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

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

Наложение условного оформления на динамические поля

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

Проанализируем последовательность действий:

  1. Определяем имя элемента (по шаблону или через поиск в коллекции Элементы).
  2. Создаем новый элемент условного оформления.
  3. Добавляем имя динамического поля в массив ОформляемыеПоля.

Пример реализации:


// Имя элемента, которое платформа присвоила автоматически
ИмяПоля = "ТоварыНоменклатураНаименование"; 

ЭлементОформления = УсловноеОформление.Элементы.Добавить();

// Устанавливаем оформление (например, синий цвет текста)
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ПоясняющийТекст);

// Указываем поле, к которому применяется оформление
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);

// Добавляем условие (например, если Артикул пустой)
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура.Артикул");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;

Массовое управление видимостью пользовательских колонок

Если задача состоит в том, чтобы скрыть все реквизиты, добавленные пользователем «через точку», чтобы они не мешали работе, мы можем использовать следующий подход. Проанализируем ситуацию: нам нужно перебрать все колонки конкретной таблицы и отключить видимость у тех, чей ПутьКДанным указывает на реквизиты ссылок.


&НаКлиенте
Процедура СкрытьПользовательскиеПоля(ИмяТаблицы)
    Таблица = Элементы[ИмяТаблицы];
    Для Каждого Колонка Из Таблица.ПодчиненныеЭлементы Цикл
        // Проверяем путь к данным. Основные реквизиты ТЧ имеют формат "Объект.ИмяТЧ.ИмяРеквизита"
        // Пользовательские поля имеют формат "Объект.ИмяТЧ.ИмяРеквизита.ПолеСсылки"
        Если СтрЧислоВхождений(Колонка.ПутьКДанным, ".") > 2 Тогда
            Колонка.Видимость = Ложь;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

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

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

Также стоит отметить работу с ХранилищемСистемныхНастроек. Все изменения, внесенные пользователем, сохраняются именно там. Если необходимо принудительно «сбросить» форму к заводским настройкам для всех пользователей или программно удалить только конкретные колонки до открытия формы, следует работать с объектом НастройкиФормы, загружая их из хранилища и анализируя структуру Состав.

Важное замечание: При обращении к ТекущиеДанные табличной части вы не найдете там этих «виртуальных» полей. В структуре данных (строке таблицы) их нет — там только ссылка. Чтобы получить значение, которое видит пользователь в такой колонке, нужно обращаться через точку от основного реквизита: Элементы.Товары.ТекущиеДанные.Номенклатура.Артикул.

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

← На главную