Как вывести дополнительный реквизит в произвольное место на форме элемента справочника

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

При работе с типовыми конфигурациями 1С, построенными на базе Библиотеки стандартных подсистем (БСП), разработчики часто сталкиваются с необходимостью кастомизации интерфейса. Одна из самых распространенных задач — вынос конкретного дополнительного реквизита из общей стандартной вкладки "Дополнительные реквизиты" в шапку формы или на другую специфическую вкладку. Это позволяет сделать интерфейс более эргономичным и акцентировать внимание пользователя на важных данных.

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

Постановка задачи и анализ механизмов БСП

Рассмотрим ситуацию: у нас есть справочник (например, "Номенклатура"), в который через пользовательский режим добавлен дополнительный реквизит. По умолчанию он отображается в автоматически создаваемой группе ГруппаДополнительныеРеквизиты. Наша задача — "вырвать" его оттуда и поместить, скажем, в основную группу формы или в специально созданную нами панель.

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

Способ 1. Программное перемещение через метод Переместить()

Это самый надежный и "чистый" способ с точки зрения программирования. Он позволяет избежать дублирования элементов и сохраняет всю привязку данных, которую БСП уже настроила. Рассмотрим реализацию по шагам.

Во-первых, нам необходимо определить внутреннее имя элемента формы, которое БСП присвоила нашему дополнительному реквизиту. Обычно оно формируется как ДополнительныйРеквизит_ + GUID_свойства_без_дефисов. Однако, чтобы не вычислять GUID вручную, лучше воспользоваться программными методами поиска.

Разберем пример кода, который следует разместить в конце процедуры ПриСозданииНаСервере (или в расширении в методе ПослеПриСозданииНаСервере):


&НаСервере
Процедура ПереместитьДопРеквизитНаФорме()
    
    // 1. Находим описание нужного нам реквизита в коллекции БСП
    // Обычно коллекция хранится в реквизите формы "ПараметрыУправленияСвойствами" 
    // или "Свойства_ОписаниеДополнительныхРеквизитов" (в зависимости от версии БСП)
    
    ИмяЭлементаДляПоиска = "";
    Для Каждого СтрокаОписание Из ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов Цикл
        Если СтрокаОписание.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("НужноеМнеСвойство") Тогда
            ИмяЭлементаДляПоиска = СтрокаОписание.ИмяРеквизитаЗначение;
            Прервать;
        КонецЕсли;
    КонецЦикла;

    // 2. Если элемент найден, перемещаем его в нужную группу
    Если ЗначениеЗаполнено(ИмяЭлементаДляПоиска) Тогда
        ЭлементФормы = Элементы.Найти(ИмяЭлементаДляПоиска);
        Если ЭлементФормы <> Неопределено Тогда
            // Указываем: Куда переместить и Перед каким элементом (необязательно)
            Элементы.Переместить(ЭлементФормы, Элементы.ГруппаОсновнаяШапка);
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

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

Способ 2. Интерактивное изменение формы (пользовательский метод)

Как справедливо заметили в обсуждении, если задача разовая и не требует жесткого закрепления в коде конфигурации, можно воспользоваться стандартным функционалом платформы "Изменить форму".

  1. Откройте форму элемента справочника в режиме "1С:Предприятие".
  2. Нажмите Ещё — Изменить форму.
  3. В дереве элементов найдите группу дополнительных реквизитов. Обратите внимание, что программно созданные элементы будут видны в списке.
  4. Просто перетащите нужный реквизит мышкой в ту группу, где вы хотите его видеть.
  5. Нажмите "ОК".

Проанализируем ситуацию с сохранением настроек. В современных версиях платформы 8.3 программно созданные элементы (если у них заданы стабильные уникальные имена) корректно запоминают свое положение в пользовательских настройках. Однако, если вы измените состав дополнительных реквизитов или обновите конфигурацию с существенным изменением логики БСП, эти настройки могут "слететь". Поэтому для тиражных решений рекомендуется именно программный способ.

Способ 3. Использование переопределяемых модулей БСП

В продвинутых версиях БСП существует возможность влиять на расположение реквизитов еще на этапе их генерации. Рассмотрим работу с общим модулем УправлениеСвойствамиПереопределяемый.

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

Тонкости и подводные камни

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

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

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Сначала вызываем стандартный обработчик БСП
    // Здесь создаются элементы "ДополнительныйРеквизит_..."
    УправлениеСвойствами.ПриСозданииНаСервере(ЭтаФорма, Объект, "ГруппаДополнительныеРеквизиты");
    
    // Только ПОСЛЕ этого выполняем перемещение
    ПереместитьДопРеквизитНаФорме();
    
КонецПроцедуры

Также стоит помнить о видимости. Если вы переместили реквизит в шапку, но в настройках самого дополнительного реквизита (в режиме Предприятие) стоит условие видимости, которое не выполняется, элемент будет скрыт. Программное перемещение не отменяет логику работы функциональных опций и условий видимости, заложенных в БСП.

Резюме

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

← На главную