Как добавить новый реквизит в документ 1С: дополнительные реквизиты БСП, расширение или основная конфигурация?

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

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

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

---

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

Этот инструмент является частью стандартной подсистемы БСП (Библиотека стандартных подсистем) и доступен пользователям непосредственно в режиме «1С:Предприятие» без необходимости изменения метаданных в конфигураторе.

Технические особенности реализации:

Дополнительные реквизиты физически хранятся не в основной таблице документа СУБД, а в скрытой табличной части ДополнительныеРеквизиты конкретного объекта. С технической точки зрения эта табличная часть связывает документ с Планом видов характеристик ДополнительныеРеквизитыИСведения и справочником ЗначенияСвойствОбъектов.

Рассмотрим детально преимущества данного подхода:

  1. Абсолютная безопасность при обновлениях. Конфигурация остается на полной поддержке поставщика. Автоматическое обновление базы данных происходит без участия программиста и без риска конфликтов в метаданных.
  2. Простота настройки. Добавить новое поле может администратор системы или подготовленный пользователь прямо в пользовательском интерфейсе. Для этого не требуется монопольный доступ к базе данных и запуск конфигуратора.
  3. Гибкость видимости и доступности. Настройки БСП позволяют задавать условия отображения реквизита на форме в зависимости от различных условий (например, от организации или вида документа) без написания программного кода.

Разберем существенные недостатки и ограничения использования дополнительных реквизитов БСП:

---

Способ 2. Добавление реквизита внутри расширения конфигурации

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

Технические особенности реализации:

При добавлении реквизита в расширение платформа физически создает в СУБД отдельную «таблицу-спутник» (satellite table), которая связана с основной таблицей документа отношением «один к одному» по внутреннему уникальному идентификатору (GUID). При обращении к реквизиту расширения в запросе платформа неявно соединяет эти таблицы.

Рассмотрим преимущества использования расширений:

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

Проанализируем критические недостатки и риски добавления реквизитов через расширения:

---

Способ 3. Гибридный метод (Реквизит в основной конфигурации + логика в расширении)

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

Технические особенности реализации:

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

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

  1. Гарантированная безопасность данных. Ваши данные никогда не пропадут. Даже если все расширения в базе данных по какой-то причине будут отключены или удалены, колонка в таблице СУБД никуда не исчезнет, и информация останется в целости и сохранности.
  2. Максимальная производительность СУБД. Новый реквизит добавляется как реальная физическая колонка непосредственно в основную таблицу документа. СУБД не нужно выполнять никаких скрытых или явных соединений (JOIN) таблиц при чтении или записи данных. По такому полю легко построить индекс для мгновенного поиска.
  3. Простота обновлений. Поскольку реквизит имеет уникальный префикс, обновление от фирмы «1С» никогда не сотрет его и не вступит с ним в конфликт. Ваша основная конфигурация остается чистой от кастомного программного кода, так как вся логика вынесена в расширение.

---

Разберем по шагам: как правильно вывести новый реквизит на форму?

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

Если фирма «1С» в очередном релизе изменит интерфейс, состав элементов или структуру этой формы, ваша заимствованная форма в расширении вступит в конфликт с новой типовой формой. В лучшем случае у пользователя поплывет дизайн, в худшем — документ вообще откажется открываться.

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

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


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

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

---

Резюме: правила выбора оптимального решения

Чтобы быстро и безошибочно принять решение при проектировании архитектуры базы данных, ориентируйтесь на следующую логическую схему:

← На главную