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