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