Разработка и Конфигурация · 10 мин
Как программно создать дополнительный реквизит в 1С
Пошаговая инструкция по программному созданию дополнительных реквизитов в 1С через БСП: код, проверка результата, типичные ошибки и ограничения.
Дополнительные реквизиты в типовых конфигурациях 1С создаются механизмом БСП (библиотека стандартных подсистем) и хранятся не в метаданных, а в справочнике «Наборы дополнительных реквизитов и сведений» вместе с планом видов характеристик «Дополнительные реквизиты и сведения». Поэтому «программно создать реквизит» означает не изменение конфигуратора, а создание правильных записей в этих объектах — через встроенный язык.
Такой подход нужен, когда реквизит требуется добавить без обновления конфигурации: например, при автоматической настройке базы после внедрения, при миграции данных из другой системы или при пакетном создании однотипных свойств для справочников и документов. Всё делается штатными средствами БСП, и результат сразу виден пользователям в интерфейсе.
Как устроен механизм дополнительных реквизитов в БСП
Прежде чем писать код, важно понять структуру хранения. Каждый дополнительный реквизит — это элемент плана видов характеристик ДополнительныеРеквизитыИСведения. Там задаются заголовок, тип значения и признак «ЭтоДополнительноеСведение» (сведения не отображаются на форме объекта, а редактируются через отдельную команду).
Привязка реквизита к конкретному объекту (например, к справочнику «Номенклатура» или документу «Заказ клиента») выполняется через набор — элемент справочника НаборыДополнительныхРеквизитовИСведений. У набора есть табличная часть «ДополнительныеРеквизиты», куда добавляется ссылка на характеристику. Без этой строки реквизит существует в базе, но не показывается у объекта.
Подготовка: что проверить перед написанием кода
Убедитесь, что в конфигурации включена функциональная опция использования дополнительных реквизитов и сведений, иначе подсистема свойств работать не будет. В типовых конфигурациях это «Дополнительные реквизиты и сведения» в настройках общих параметров или разделе администрирования.
Также проверьте, что у целевого объекта вообще есть набор дополнительных реквизитов. Для большинства типовых справочников и документов наборы создаются автоматически при первом открытии, но при программной работе надёжнее получать набор функцией БСП, которая создаст его при отсутствии.
Создание реквизита штатными средствами БСП
Рекомендуемый способ — использовать программный интерфейс модуля УправлениеСвойствами (в старых версиях БСП — Свойства). Он сам создаёт характеристику, привязывает её к набору и корректно заполняет служебные поля. Пример для справочника «Номенклатура»:
ПараметрыСвойства = Новый Структура;
ПараметрыСвойства.Вставить("Имя", "ЦветТовара");
ПараметрыСвойства.Вставить("Представление", НСтр("ru = 'Цвет товара'"));
ПараметрыСвойства.Вставить("Тип", Новый ОписаниеТипов("СправочникСсылка.Цвета"));
ПараметрыСвойства.Вставить("ДополнительноеСведение", Ложь);
НаборОбъектов = УправлениеСвойствами.НаборСвойствПоИмени("Справочник_Номенклатура");
НовоеСвойство = УправлениеСвойствами.ДобавитьСвойствоВНабор(ПараметрыСвойства, НаборОбъектов);
Точные имена функций зависят от версии БСП: в одних релизах есть ДобавитьСвойствоВНабор, в других придётся создавать характеристику и строку табличной части набора вручную. Уточните состав экспортных процедур модуля в вашей конфигурации через конфигуратор.
Набор = УправлениеСвойствами.НаборСвойствПоИмени("Справочник_Номенклатура");Ручной вариант: запись характеристики и набора напрямую
Если подходящей функции БСП нет, реквизит создают двумя записями. Сначала — элемент плана видов характеристик:
НоваяХарактеристика = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
НоваяХарактеристика.Наименование = "Цвет товара";
НоваяХарактеристика.Заголовок = "Цвет товара";
НоваяХарактеристика.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Цвета");
НоваяХарактеристика.ЭтоДополнительноеСведение = Ложь;
НоваяХарактеристика.Записать();
Затем характеристику добавляют в табличную часть набора нужного объекта:
НаборСсылка = Справочники.НаборыДополнительныхРеквизитовИСведений.НайтиПоНаименованию("Номенклатура");
НаборОбъект = НаборСсылка.ПолучитьОбъект();
НоваяСтрока = НаборОбъект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = НоваяХарактеристика.Ссылка;
НаборОбъект.Записать();
Поиск набора по наименованию ненадёжен — в разных конфигурациях наименования различаются. Лучше искать по предопределённому имени или через функцию получения набора из БСП.
Проверка существования и защита от дублей
Перед созданием реквизита всегда проверяйте, нет ли его уже в базе. Простейший способ — поиск по заголовку в плане видов характеристик:
Существующий = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения
.НайтиПоНаименованию("Цвет товара", Истина);
Если Существующий.Пустая() Тогда
// создаём новый реквизит
КонецЕсли;
Для пакетных сценариев (миграция, первоначальная настройка) удобно завести служебный идентификатор: заполнять у характеристики поле «Имя» уникальным значением и искать по нему. Тогда переименование заголовка пользователем не сломает логику.
Как проверить результат
Поле видно в карточке объекта, значение вводится и сохраняется
Поле отсутствует или недоступно — реквизит не добавлен в набор
Элемент есть в списке дополнительных реквизитов, тип задан верно
Дубли элементов с одинаковым наименованием
Реквизит доступен в отборах и выводится в отчётах по объекту
Реквизит не предлагается в настройках отчёта
Запись значений созданного реквизита
После создания реквизита значения записываются в табличную часть «ДополнительныеРеквизиты» самого объекта (для реквизитов) или в регистр сведений «ДополнительныеСведения» (для сведений). Пример для объекта:
ОбъектНоменклатуры = СсылкаНоменклатура.ПолучитьОбъект();
СтрокаРеквизита = ОбъектНоменклатуры.ДополнительныеРеквизиты.Найти(СвойствоСсылка, "Свойство");
Если СтрокаРеквизита = Неопределено Тогда
СтрокаРеквизита = ОбъектНоменклатуры.ДополнительныеРеквизиты.Добавить();
СтрокаРеквизита.Свойство = СвойствоСсылка;
КонецЕсли;
СтрокаРеквизита.Значение = ЗначениеЦвета;
ОбъектНоменклатуры.Записать();
Тип записываемого значения должен совпадать с типом, указанным в характеристике, иначе при записи получите ошибку несоответствия типов.
Альтернативы: расширение конфигурации и изменение метаданных
Механизм дополнительных реквизитов — не единственный путь. Если свойство должно участвовать в индексировании, сложных запросах или проводках, лучше добавить реквизит через расширение конфигурации: это даёт полноценное поле в таблице без снятия конфигурации с поддержки. Минус — нужны права разработчика и обновление расширения при смене релиза.
Прямое изменение конфигурации оправдано только в собственных (нетиповых) решениях. Для типовых баз с поддержкой выбирайте между дополнительными реквизитами БСП (быстро, без разработки) и расширением (производительно, но требует сопровождения).
Сравнение вариантов
Быстро, без изменения конфигурации; ограничение — медленнее в запросах и не индексируется
Полноценное поле объекта; требует прав разработчика и сопровождения при обновлениях
Максимальная гибкость; усложняет обновление типовой конфигурации
Частые вопросы
Можно ли создать дополнительный реквизит без БСП?
Нет, штатный механизм дополнительных реквизитов и сведений — это часть БСП. Если конфигурация не содержит этой подсистемы, программно создать «мягкий» реквизит не получится: придётся добавлять реквизит в метаданные вручную или через расширение.
Почему созданный реквизит не виден на форме объекта?
Чаще всего характеристика создана, но не добавлена в табличную часть набора этого объекта. Проверьте набор в разделе «Администрирование — Дополнительные реквизиты» и убедитесь, что свойство там присутствует. Также проверьте, что реквизит не помечен как дополнительное сведение — сведения открываются отдельной командой.
Как создать реквизит с типом «список значений»?
Задайте характеристике тип «СправочникСсылка.ЗначенияСвойствОбъектов» — тогда пользователи смогут выбирать значение из списка, который заполняется прямо в карточке свойства. Программно список заполняется созданием элементов этого справочника с владельцем — вашей характеристикой.
Чем дополнительный реквизит отличается от дополнительного сведения?
Реквизит выводится на форму объекта и хранится в его табличной части, сведение — в отдельном регистре и редактируется через команду «Ещё — Дополнительные сведения». Сведения удобны для редко используемых свойств, чтобы не перегружать форму.
Безопасно ли запускать такой код в рабочей базе?
Само создание реквизита не разрушает данные, но любой код записи объектов стоит сначала выполнить на копии. Особенно осторожно обрабатывайте повторные запуски: без проверки существования вы создадите дубли свойств, которые потом придётся разбирать и объединять вручную.
Что важно запомнить
Дополнительный реквизит создаётся парой записей: характеристика в плане видов характеристик и строка в наборе объекта. Используйте функции БСП, где они есть, всегда проверяйте существование реквизита перед созданием и тестируйте код на копии базы. Для нагруженных сценариев рассмотрите расширение конфигурации вместо механизма свойств.