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