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

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

Как устроены дополнительные реквизиты и сведения

ЭлементОбъект метаданныхЧто хранит
Включение функциональностиКонстанта ИспользоватьДополнительныеРеквизитыИСведенияОбщий выключатель подсистемы
Набор свойствСправочник НаборыДополнительныхРеквизитовИСведенийКакие свойства есть у вида объекта (или группы видов)
СвойствоПВХ ДополнительныеРеквизитыИСведенияЗаголовок, тип значения, имя, обязательность, зависимости
Значения-спискиСправочник ЗначенияСвойствОбъектов (и иерархический вариант)Варианты выбора для свойств типа «список значений»
Значение доп. реквизитаТабличная часть ДополнительныеРеквизиты объектаКолонки Свойство, Значение, ТекстоваяСтрока
Значение доп. сведенияРегистр сведений ДополнительныеСведенияИзмерения Объект, Свойство, ресурс Значение
Дополнительные реквизиты хранятся внутри объекта, дополнительные сведения — во внешнем регистре
Дополнительные реквизиты хранятся внутри объекта, дополнительные сведения — во внешнем регистре

Реквизит или сведение: что выбрать

КритерийДополнительный реквизитДополнительное сведение
Где хранитсяВ объектеВ регистре сведений
ИзменениеТолько с записью объектаОтдельно, без перезаписи объекта
ПраваКак на объектОтдельно настраиваются
Попадает в версионирование и обмен вместе с объектомДаОтдельной записью регистра
Подходит дляСвойств, которые являются частью данных: цвет, размер, категорияПометок «сбоку»: рейтинг клиента, статус проверки, комментарий службы безопасности

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

Как подсистема знает о наборах

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

1С
// См. УправлениеСвойствамиПереопределяемый.ПриПолученииПредопределенныхНаборовСвойств.
Процедура ПриПолученииПредопределенныхНаборовСвойств(Наборы) Экспорт

	Набор = Наборы.Строки.Добавить();
	Набор.Имя = "Справочник_ДоговорыАренды";
	// Идентификатор генерируется один раз и больше не меняется
	Набор.Идентификатор = Новый УникальныйИдентификатор("3f1c7a52-6d0b-4b8e-9a1e-2c5d7e8f9a10");

КонецПроцедуры

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

Подключение дополнительных реквизитов к своему объекту

Порядок для собственного справочника или документа в конфигурации с БСП:

  1. Добавьте объекту табличную часть ДополнительныеРеквизиты с реквизитами Свойство (ссылка на ПВХ ДополнительныеРеквизитыИСведения), Значение (тип — характеристика из того же ПВХ), ТекстоваяСтрока (строка неограниченной длины). Проще всего скопировать её у типового объекта.
  2. Включите тип объекта в определяемые типы и составные типы, которые использует подсистема (владельцы свойств и объект регистра ДополнительныеСведения) — перечень указан в описании внедрения подсистемы.
  3. Зарегистрируйте предопределённый набор, как показано выше.
  4. Добавьте вызовы подсистемы в форму объекта.

Обработчики формы

1С
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	// СтандартныеПодсистемы.Свойства
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("Объект", Объект);
	ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "ГруппаДополнительныеРеквизиты");
	УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
	// Конец СтандартныеПодсистемы.Свойства

КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)

	УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);

КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

	УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);

КонецПроцедуры

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)

	УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);

КонецПроцедуры

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

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

Программная работа со свойствами

Поиск свойства

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

1С
// Возвращает свойство по имени или пустую ссылку, если свойство не найдено.
Функция СвойствоПоИмени(ИмяСвойства)

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

КонецФункции

Искать по наименованию (заголовку) не стоит: пользователь его поменяет, и интеграция сломается.

Чтение значений

1С
Свойство = СвойствоПоИмени("СрокДоговораМесяцев");

// Одно значение
СрокДоговора = УправлениеСвойствами.ЗначениеСвойства(ДоговорСсылка, Свойство);

// Все дополнительные реквизиты и сведения объекта — таблица со свойствами и значениями
ВсеЗначения = УправлениеСвойствами.ЗначенияСвойств(ДоговорСсылка);

Функции подсистемы учитывают и реквизиты, и сведения, поэтому вызывающему коду не нужно знать, где именно хранится значение.

Запись значений

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

1С
ТаблицаСвойств = Новый ТаблицаЗначений;
ТаблицаСвойств.Колонки.Добавить("Свойство");
ТаблицаСвойств.Колонки.Добавить("Значение");

НоваяСтрока = ТаблицаСвойств.Добавить();
НоваяСтрока.Свойство = СвойствоПоИмени("СрокДоговораМесяцев");
НоваяСтрока.Значение = 12;

УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ДоговорСсылка, ТаблицаСвойств);

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

Дополнительные реквизиты в запросах и отчётах

Прямой запрос

Запрос 1С
ВЫБРАТЬ
	Договоры.Ссылка КАК Договор,
	ДопРеквизиты.Значение КАК СрокМесяцев,
	ДопСведения.Значение КАК СтатусПроверки
ИЗ
	Справочник.ДоговорыКонтрагентов КАК Договоры
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов.ДополнительныеРеквизиты КАК ДопРеквизиты
		ПО ДопРеквизиты.Ссылка = Договоры.Ссылка
			И ДопРеквизиты.Свойство.Имя = &ИмяСрока
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДопСведения
		ПО ДопСведения.Объект = Договоры.Ссылка
			И ДопСведения.Свойство.Имя = &ИмяСтатуса

Обратите внимание: условие по свойству стоит в ПО, а не в ГДЕ. Если перенести его в ГДЕ, левое соединение превратится во внутреннее и договоры без заполненного свойства пропадут из выборки. Для больших таблиц лучше заранее получить ссылки на свойства и передавать их параметрами, а не обращаться к Свойство.Имя через точку.

Конструкция ХАРАКТЕРИСТИКИ для СКД

Если нужно, чтобы все дополнительные реквизиты автоматически стали полями отчёта, в наборе данных СКД используют раздел ХАРАКТЕРИСТИКИ:

Запрос 1С
ВЫБРАТЬ
	Договоры.Ссылка КАК Договор
ИЗ
	Справочник.ДоговорыКонтрагентов КАК Договоры
{ХАРАКТЕРИСТИКИ
	ТИП(Справочник.ДоговорыКонтрагентов)
	ВИДЫХАРАКТЕРИСТИК (
		ВЫБРАТЬ
			Свойства.Ссылка КАК Ссылка,
			Свойства.Заголовок КАК Наименование,
			Свойства.ТипЗначения КАК ТипЗначения
		ИЗ
			ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства)
	ПОЛЕКЛЮЧА Ссылка
	ПОЛЕИМЕНИ Наименование
	ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения
	ЗНАЧЕНИЯХАРАКТЕРИСТИК Справочник.ДоговорыКонтрагентов.ДополнительныеРеквизиты
	ПОЛЕОБЪЕКТА Ссылка
	ПОЛЕВИДА Свойство
	ПОЛЕЗНАЧЕНИЯ Значение}

В запрос видов характеристик стоит добавить отбор по набору свойств, иначе в отчёт попадут свойства всех объектов. В типовых отчётах на БСП дополнительные реквизиты часто уже доступны как поля — проверьте это до того, как дорабатывать отчёт.

Особенности и ограничения

  • Имена элементов формы генерируются. На форме поле дополнительного реквизита называется по шаблону вида ДополнительныйРеквизитЗначение_<идентификаторы>. Чтобы найти нужный элемент программно, используйте таблицу формы Свойства_ОписаниеДополнительныхРеквизитов: в ней есть соответствие свойства и имени реквизита формы.
  • Множественные значения не поддерживаются «из коробки». Одно свойство — одно значение у объекта. Модифицировать служебные модули подсистемы ради множественных значений я не рекомендую: такие правки ломаются при каждом обновлении БСП. Если нужен список, заведите отдельную табличную часть в расширении или справочник-связку.
  • Свойства помечаются на удаление, а не удаляются. Старые значения остаются в данных и показываются как удалённые.
  • Обязательность и видимость — условные. В свойстве можно задать зависимости: показывать или требовать заполнение при определённых значениях других реквизитов.

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

Типичные ошибки

  • Поиск свойства по заголовку. Заголовок меняют пользователи, имя — нет. Ищите по Имя.
  • Условие по свойству в ГДЕ при левом соединении. Пропадают объекты без значения.
  • Прямая запись в табличную часть без учёта ТекстоваяСтрока. Для строк неограниченной длины подсистема хранит текст в отдельной колонке; при ручной записи значение может «потеряться» на форме.
  • Отключённая константа. Код работает, а в формах ничего не видно — проверьте ИспользоватьДополнительныеРеквизитыИСведения.
  • Доработка служебных модулей БСП. Правка УправлениеСвойствамиСлужебный превращает каждое обновление в ручное слияние.
Дополнительные реквизиты — лучший первый ответ на просьбу «добавьте поле». Код нужен только там, где на этом поле начинает строиться логика.

Итог

  • Подсистема «Свойства» хранит наборы в справочнике, свойства — в ПВХ, значения реквизитов — в табличной части объекта, сведений — в регистре.
  • Реквизит меняется вместе с объектом, сведение — независимо и со своими правами.
  • В коде ищите свойства по Имя, читайте через УправлениеСвойствами.ЗначениеСвойства и ЗначенияСвойств, записывайте процедурой подсистемы.
  • В отчётах используйте соединение с условием в ПО или раздел ХАРАКТЕРИСТИКИ в наборе СКД.
  • Не модифицируйте служебные модули БСП — нестандартные потребности решайте расширением.