К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как программно создать дополнительный реквизит в 1С

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

Дополнительные реквизиты в типовых конфигурациях 1С создаются механизмом БСП (библиотека стандартных подсистем) и хранятся не в метаданных, а в справочнике «Наборы дополнительных реквизитов и сведений» вместе с планом видов характеристик «Дополнительные реквизиты и сведения». Поэтому «программно создать реквизит» означает не изменение конфигуратора, а создание правильных записей в этих объектах — через встроенный язык.

Такой подход нужен, когда реквизит требуется добавить без обновления конфигурации: например, при автоматической настройке базы после внедрения, при миграции данных из другой системы или при пакетном создании однотипных свойств для справочников и документов. Всё делается штатными средствами БСП, и результат сразу виден пользователям в интерфейсе.

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

Прежде чем писать код, важно понять структуру хранения. Каждый дополнительный реквизит — это элемент плана видов характеристик ДополнительныеРеквизитыИСведения. Там задаются заголовок, тип значения и признак «ЭтоДополнительноеСведение» (сведения не отображаются на форме объекта, а редактируются через отдельную команду).

Привязка реквизита к конкретному объекту (например, к справочнику «Номенклатура» или документу «Заказ клиента») выполняется через набор — элемент справочника НаборыДополнительныхРеквизитовИСведений. У набора есть табличная часть «ДополнительныеРеквизиты», куда добавляется ссылка на характеристику. Без этой строки реквизит существует в базе, но не показывается у объекта.

Подготовка: что проверить перед написанием кода

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

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

Создание реквизита штатными средствами БСП

Рекомендуемый способ — использовать программный интерфейс модуля УправлениеСвойствами (в старых версиях БСП — Свойства). Он сам создаёт характеристику, привязывает её к набору и корректно заполняет служебные поля. Пример для справочника «Номенклатура»:

ПараметрыСвойства = Новый Структура;

ПараметрыСвойства.Вставить("Имя", "ЦветТовара");

ПараметрыСвойства.Вставить("Представление", НСтр("ru = 'Цвет товара'"));

ПараметрыСвойства.Вставить("Тип", Новый ОписаниеТипов("СправочникСсылка.Цвета"));

ПараметрыСвойства.Вставить("ДополнительноеСведение", Ложь);

НаборОбъектов = УправлениеСвойствами.НаборСвойствПоИмени("Справочник_Номенклатура");

НовоеСвойство = УправлениеСвойствами.ДобавитьСвойствоВНабор(ПараметрыСвойства, НаборОбъектов);

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

bsl
Набор = УправлениеСвойствами.НаборСвойствПоИмени("Справочник_Номенклатура");

Ручной вариант: запись характеристики и набора напрямую

Если подходящей функции БСП нет, реквизит создают двумя записями. Сначала — элемент плана видов характеристик:

НоваяХарактеристика = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();

НоваяХарактеристика.Наименование = "Цвет товара";

НоваяХарактеристика.Заголовок = "Цвет товара";

НоваяХарактеристика.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Цвета");

НоваяХарактеристика.ЭтоДополнительноеСведение = Ложь;

НоваяХарактеристика.Записать();

Затем характеристику добавляют в табличную часть набора нужного объекта:

НаборСсылка = Справочники.НаборыДополнительныхРеквизитовИСведений.НайтиПоНаименованию("Номенклатура");

НаборОбъект = НаборСсылка.ПолучитьОбъект();

НоваяСтрока = НаборОбъект.ДополнительныеРеквизиты.Добавить();

НоваяСтрока.Свойство = НоваяХарактеристика.Ссылка;

НаборОбъект.Записать();

Поиск набора по наименованию ненадёжен — в разных конфигурациях наименования различаются. Лучше искать по предопределённому имени или через функцию получения набора из БСП.

Типичные ошибки
01
Создание характеристики без добавления её в набор — реквизит есть в базе, но не виден у объекта
02
Поиск набора по наименованию вместо предопределённого имени — код ломается после переименования
03
Не проверяется существование реквизита перед созданием — при повторном запуске появляются дубли
04
Установка типа строкой без квалификаторов длины — значения обрезаются при вводе

Проверка существования и защита от дублей

Перед созданием реквизита всегда проверяйте, нет ли его уже в базе. Простейший способ — поиск по заголовку в плане видов характеристик:

Существующий = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения

.НайтиПоНаименованию("Цвет товара", Истина);

Если Существующий.Пустая() Тогда

// создаём новый реквизит

КонецЕсли;

Для пакетных сценариев (миграция, первоначальная настройка) удобно завести служебный идентификатор: заполнять у характеристики поле «Имя» уникальным значением и искать по нему. Тогда переименование заголовка пользователем не сломает логику.

Контрольные точки

Как проверить результат

Реквизит на форме объекта
Норма

Поле видно в карточке объекта, значение вводится и сохраняется

Тревожный признак

Поле отсутствует или недоступно — реквизит не добавлен в набор

Запись в плане характеристик
Норма

Элемент есть в списке дополнительных реквизитов, тип задан верно

Тревожный признак

Дубли элементов с одинаковым наименованием

Значения в отчётах
Норма

Реквизит доступен в отборах и выводится в отчётах по объекту

Тревожный признак

Реквизит не предлагается в настройках отчёта

Запись значений созданного реквизита

После создания реквизита значения записываются в табличную часть «ДополнительныеРеквизиты» самого объекта (для реквизитов) или в регистр сведений «ДополнительныеСведения» (для сведений). Пример для объекта:

ОбъектНоменклатуры = СсылкаНоменклатура.ПолучитьОбъект();

СтрокаРеквизита = ОбъектНоменклатуры.ДополнительныеРеквизиты.Найти(СвойствоСсылка, "Свойство");

Если СтрокаРеквизита = Неопределено Тогда

СтрокаРеквизита = ОбъектНоменклатуры.ДополнительныеРеквизиты.Добавить();

СтрокаРеквизита.Свойство = СвойствоСсылка;

КонецЕсли;

СтрокаРеквизита.Значение = ЗначениеЦвета;

ОбъектНоменклатуры.Записать();

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

Альтернативы: расширение конфигурации и изменение метаданных

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

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

Сравнение вариантов

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

Быстро, без изменения конфигурации; ограничение — медленнее в запросах и не индексируется

Расширение конфигурации

Полноценное поле объекта; требует прав разработчика и сопровождения при обновлениях

Изменение конфигурации

Максимальная гибкость; усложняет обновление типовой конфигурации

Частые вопросы

Можно ли создать дополнительный реквизит без БСП?

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

Почему созданный реквизит не виден на форме объекта?

Чаще всего характеристика создана, но не добавлена в табличную часть набора этого объекта. Проверьте набор в разделе «Администрирование — Дополнительные реквизиты» и убедитесь, что свойство там присутствует. Также проверьте, что реквизит не помечен как дополнительное сведение — сведения открываются отдельной командой.

Как создать реквизит с типом «список значений»?

Задайте характеристике тип «СправочникСсылка.ЗначенияСвойствОбъектов» — тогда пользователи смогут выбирать значение из списка, который заполняется прямо в карточке свойства. Программно список заполняется созданием элементов этого справочника с владельцем — вашей характеристикой.

Чем дополнительный реквизит отличается от дополнительного сведения?

Реквизит выводится на форму объекта и хранится в его табличной части, сведение — в отдельном регистре и редактируется через команду «Ещё — Дополнительные сведения». Сведения удобны для редко используемых свойств, чтобы не перегружать форму.

Безопасно ли запускать такой код в рабочей базе?

Само создание реквизита не разрушает данные, но любой код записи объектов стоит сначала выполнить на копии. Особенно осторожно обрабатывайте повторные запуски: без проверки существования вы создадите дубли свойств, которые потом придётся разбирать и объединять вручную.

Итог

Что важно запомнить

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