Как добавить реквизиты из расширения на форму номенклатуры в 1С без заимствования формы?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При активном развитии и кастомизации современных конфигураций на платформе «1С:Предприятие 8.3» (таких как «Управление торговлей 11», «Комплексная автоматизация 2» или «ERP Управление предприятием») разработчики регулярно сталкиваются с необходимостью добавления новых реквизитов в справочник Номенклатура. Однако внесение изменений в саму форму элемента может превратить последующие обновления конфигурации в настоящий кошмар.

В этой статье мы подробно разберем, как вывести новые реквизиты из расширения на форму элемента номенклатуры, не заимствуя саму форму в расширение, и почему такой подход является наиболее профессиональным и безопасным.

Почему заимствование формы элемента — это плохой путь?

Рассмотрим стандартную ошибку начинающих разработчиков: заимствование формы элемента справочника в расширение с последующим визуальным перетаскиванием реквизита на форму. Проанализируем последствия такого решения:

  1. Раздувание метаданных («мусор» в расширении). Чтобы связать новое поле формы с реквизитом расширения, платформа потребует заимствовать основной реквизит формы — Объект. Это автоматически потянет за собой десятки связанных типов данных, перегружая расширение лишней информацией.
  2. Проблемы при обновлениях конфигурации. Фирма «1С» регулярно обновляет интерфейс и логику работы карточки номенклатуры. Если форма элемента заимствована в расширение, то при обновлении базы все новые стандартные элементы, добавленные вендором, просто не появятся у пользователей, так как форма из расширения полностью перекроет форму основной конфигурации. Это может приводить к критическим ошибкам работы интерфейса.

Почему реквизит расширения не виден через настройку «Изменить форму»?

Выясним причину, по которой пользователь не может самостоятельно вывести реквизит расширения на форму элемента через стандартное меню «Изменить форму», в то время как в форме списка это делается без проблем:

Решение: Программный вывод реквизита на форму элемента

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

Рассмотрим пошагово, как реализовать этот механизм через расширение:

Шаг 1. Добавление реквизита в объект справочника

Для начала заимствуем справочник Номенклатура в наше расширение (только сам справочник, без его форм) и добавим в него необходимый реквизит. Например, назовем его Префикс_ДополнительноеОписание с типом данных Строка.

Шаг 2. Перехват события создания формы

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

Рассмотрим пример кода при использовании перехвата события в модуле формы элемента справочника Номенклатура:


&После("ПриСозданииНаСервере")
Процедура Префикс_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Определяем родительскую группу на форме, куда хотим поместить новое поле.
    // В типовых решениях УТ 11 / КА 2 на форме элемента есть стандартные группы, 
    // например, "ГруппаКолонкаЛевая" или "ГруппаШапка".
    РодительскаяГруппа = Элементы.Найти("ГруппаКолонкаЛевая");
    
    Если РодительскаяГруппа <> Неопределено Тогда
        
        // Добавляем новый элемент управления на форму программно
        НовоеПоле = Элементы.Добавить(
            "Префикс_ПолеДополнительноеОписание", 
            Тип("ПолеФормы"), 
            РодительскаяГруппа
        );
        
        // Указываем тип элемента управления (Поле ввода)
        НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
        НовоеПоле.Заголовок = "Дополнительное описание (расширение)";
        
        // Связываем поле формы с реквизитом нашего объекта в базе данных
        НовоеПоле.ПутьКДанным = "Объект.Префикс_ДополнительноеОписание";
        
    КонецЕсли;
    
КонецПроцедуры

Альтернативная реализация через общий переопределяемый модуль БСП

Если вы хотите сделать код еще более универсальным и не привязываться к модулям конкретных форм, отличным решением будет использование общего модуля МодификацияКонфигурацииПереопределяемый. Этот модуль специально предназначен для перехвата создания любых форм в системе.

Посмотрим на пример реализации логики в процедуре ПриСозданииНаСервере данного модуля в расширении:


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

Альтернатива без программирования: Дополнительные реквизиты БСП

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

Проанализируем плюсы и минусы использования механизма дополнительных реквизитов БСП по сравнению с реквизитами из расширения:

Дополнительные реквизиты БСП:

Реквизиты из расширения:

Резюме

Для полей справочного характера, которые не участвуют в тяжелых интеграционных обменах и сложных расчетах, смело используйте типовой механизм Дополнительных реквизитов БСП.

Если же поле критично для производительности системы, создавайте его как полноценный реквизит в расширении, но выводите его на форму исключительно программным способом через обработчик ПриСозданииНаСервере. Это гарантирует стабильную работу вашей конфигурации и легкий процесс обновлений на новые релизы от компании «1С».

← На главную