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