Дополнительные реквизиты в БСП: получить, добавить и подключить к форме
Чтобы получить дополнительные реквизиты объекта в БСП, вызовите
УправлениеСвойствами.ЗначенияСвойств(Объект) — вернётся таблица значений с колонками
Свойство, ИмяСвойства, Значение, Представление,
ВладелецСвойств. Для одного свойства короче:
УправлениеСвойствами.ЗначениеСвойства(Объект, "ИмяСвойства").
Новое свойство создаётся функцией ДобавитьСвойство(Владелец, Параметры, ВидСвойства),
структура параметров — ПараметрыДобавленияСвойства(). Допустимое значение для реквизита
ссылочного типа добавляет ДобавитьЗначениеСвойства(). К форме объекта механизм
подключается четырьмя вызовами: ПриСозданииНаСервере, ПриЧтенииНаСервере,
ПередЗаписьюНаСервере, ОбработкаПроверкиЗаполнения.
Дополнительные реквизиты и дополнительные сведения: в чём разница
Оба вида свойств описываются одним планом видов характеристик
ДополнительныеРеквизитыИСведения и различаются реквизитом
ЭтоДополнительноеСведение (плюс ВидСвойства —
Перечисления.ВидыСвойств.ДополнительныеРеквизиты,
ДополнительныеСведения, Метки). Практическая разница — в хранении и правах:
-
Дополнительный реквизит — часть самого объекта. Значение лежит в табличной части
ДополнительныеРеквизитысправочника или документа, пишется вместе с объектом, попадает в его историю изменений и версионирование. -
Дополнительное сведение — данные об объекте, но не сам объект. Значение
хранится в независимом регистре сведений
ДополнительныеСведенияс измерениямиОбъектиСвойство. Его можно менять без записи объекта и закрывать отдельными правами.
Отсюда следуют ограничения БСП, зашитые в код: УстановитьСвойстваУОбъекта() работает только
с дополнительными реквизитами и при попытке передать сведение выбрасывает исключение
КатегорияОшибки.ОшибкаКонфигурации. А доступность самих видов проверяют функции
ИспользоватьДопРеквизиты() (у метаданных владельца есть табличная часть
ДополнительныеРеквизиты) и ИспользоватьДопСведения() (тип владельца входит
в параметр общей команды ДополнительныеСведенияКоманднаяПанель).
Где хранятся дополнительные реквизиты и их значения
Полная карта объектов метаданных подсистемы «Свойства» — четыре сущности:
-
ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения— описание свойства: имя, заголовок,ТипЗначения,ИдентификаторДляФормул,НаборСвойств. -
Справочник.НаборыДополнительныхРеквизитовИСведений— наборы; их табличные частиДополнительныеРеквизитыиДополнительныеСведенияопределяют, какие свойства доступны объекту. Предопределённые элементы именуются по полному имени метаданных с заменой точки на подчёркивание:Справочник_Номенклатура. -
<Объект>.ДополнительныеРеквизиты— табличная часть со значениями (колонкиСвойство,Значение,ТекстоваяСтрока) иРегистрСведений.ДополнительныеСведения— значения сведений. -
Справочник.ЗначенияСвойствОбъектовиСправочник.ЗначенияСвойствОбъектовИерархия— списки допустимых значений для свойств со ссылочным типом; владелец элемента — само свойство.
Колонка ТекстоваяСтрока — не декоративная: БСП кладёт туда строковое значение длиннее
1024 символов, а в Значение остаётся усечённая версия. Читая табличную часть напрямую
запросом, длинные строки вы получите обрезанными — ЗначенияСвойств() подменяет их
содержимым ТекстоваяСтрока автоматически.
Как программно получить дополнительные реквизиты объекта
Основная функция чтения — ЗначенияСвойств(). Принимает ссылку или массив ссылок
одного типа, умеет фильтровать по видам свойств и по списку конкретных свойств
(ссылками или именами):
// Все дополнительные реквизиты и сведения одного объекта
Значения = УправлениеСвойствами.ЗначенияСвойств(НоменклатураСсылка);
Для Каждого Строка Из Значения Цикл
Сообщить(Строка.ИмяСвойства + ": " + Строка.Представление);
КонецЦикла;
// Только дополнительные реквизиты и только нужные свойства — по именам
ИменаСвойств = Новый Массив;
ИменаСвойств.Добавить("СрокГодностиДней");
ИменаСвойств.Добавить("СтранаПроисхождения");
Значения = УправлениеСвойствами.ЗначенияСвойств(
МассивНоменклатуры, Истина, Ложь, ИменаСвойств);
Когда нужно ровно одно значение, используйте ЗначениеСвойства() — обёртку над
ЗначенияСвойств(). Если заполнен КодЯзыка, вернётся не значение, а его
представление на этом языке:
СрокГодности = УправлениеСвойствами.ЗначениеСвойства(НоменклатураСсылка, "СрокГодностиДней");
// По ссылке на свойство и с представлением на английском
Представление = УправлениеСвойствами.ЗначениеСвойства(НоменклатураСсылка, СвойствоСсылка, "en");
// Список свойств, доступных объекту, и проверка наличия конкретного
МассивСвойств = УправлениеСвойствами.СвойстваОбъекта(НоменклатураСсылка, Истина, Ложь);
Если УправлениеСвойствами.ПроверитьСвойствоУОбъекта(НоменклатураСсылка, СвойствоСсылка) Тогда
// ...
КонецЕсли;
Важная деталь ЗначенияСвойств(): дополнительные сведения читаются только при праве
«Чтение» на регистр ДополнительныеСведения, а вся функция возвращает пустую таблицу, если
СвойстваДоступны() = Ложь (нет права чтения справочника наборов). Пустой результат у
пользователя с ограниченными правами — это не баг, а RLS.
ЗначенияСвойств() с фильтром по именам свойств
и выполнит его на вашей базе. Это быстрее, чем вручную выяснять, какие свойства подключены к набору
конкретного справочника.
Как программно добавить дополнительный реквизит
Свойство создаётся функцией ДобавитьСвойство(). Она сама находит набор свойств, проверяет
уникальность наименования, имени и идентификатора для формул, создаёт элемент плана видов характеристик
и добавляет его в табличную часть набора — всё в одной транзакции.
Параметры = УправлениеСвойствами.ПараметрыДобавленияСвойства();
Параметры.Наименование = "Срок годности, дней";
Параметры.ТипЗначения = Новый ОписаниеТипов("Число");
Параметры.Имя = "СрокГодностиДней";
Параметры.ИдентификаторДляФормул = "СрокГодностиДней";
Параметры.Подсказка = "Количество дней хранения";
Параметры.МногострочноеПолеВвода = Ложь;
Свойство = УправлениеСвойствами.ДобавитьСвойство(
Метаданные.Справочники.Номенклатура,
Параметры,
Перечисления.ВидыСвойств.ДополнительныеРеквизиты);
Структура ПараметрыДобавленияСвойства() содержит поля: Наименование,
ТипЗначения, Имя, Комментарий,
ЗаголовокФормыЗначения, ЗаголовокФормыВыбораЗначения,
ИдентификаторДляФормул, МногострочноеПолеВвода, Подсказка,
Тип (устаревший синоним ТипЗначения) и ЦветСвойства.
Обязательны Наименование и ТипЗначения; для вида
Перечисления.ВидыСвойств.Метки обязателен ещё и ЦветСвойства — иначе
вызов упадёт с перечислением незаполненных параметров.
Если Имя не задано, БСП соберёт его из наименования (слова склеиваются с заглавной буквы,
имя, начинающееся с цифры, получает префикс _, а при коллизии — суффикс из GUID).
Третий параметр Булево оставлен для совместимости: Истина означает
дополнительное сведение, Ложь и Неопределено — дополнительный реквизит.
Владельцем можно передать не только объект метаданных, но и строку («Справочник.Номенклатура»
или имя набора «Справочник_Номенклатура»), и готовую ссылку
СправочникСсылка.НаборыДополнительныхРеквизитовИСведений. Если набор не найден, вы получите
исключение «Переданный объект не подключен к подсистеме Свойства» — значит, объект не зарегистрирован
в УправлениеСвойствамиПереопределяемый.
Как добавить значение свойства программно
Для свойств с типом СправочникСсылка.ЗначенияСвойствОбъектов или
СправочникСсылка.ЗначенияСвойствОбъектовИерархия список допустимых значений наполняется
функцией ДобавитьЗначениеСвойства(). Владельца можно передать ссылкой на свойство или его
уникальным именем — тогда БСП найдёт свойство запросом по реквизиту Имя:
ПараметрыСвойства = УправлениеСвойствами.ПараметрыДобавленияСвойства();
ПараметрыСвойства.Наименование = "Признак упаковки";
ПараметрыСвойства.Имя = "ПризнакУпаковки";
ПараметрыСвойства.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.ЗначенияСвойствОбъектов");
Свойство = УправлениеСвойствами.ДобавитьСвойство("Справочник.Номенклатура", ПараметрыСвойства);
ПараметрыЗначения = УправлениеСвойствами.ПараметрыДобавленияЗначенияСвойства();
ПараметрыЗначения.Наименование = "Хрупкий";
ПараметрыЗначения.ПолноеНаименование = "Хрупкий груз, требует маркировки";
Значение = УправлениеСвойствами.ДобавитьЗначениеСвойства("ПризнакУпаковки", ПараметрыЗначения);
Справочник значений выбирается по фактическому ТипЗначения свойства, а не по параметру
Иерархия: если тип — ЗначенияСвойствОбъектовИерархия, элемент создаётся именно
там. Флаг ЭтоГруппа в параметрах создаёт группу вместо элемента; Родитель
задаёт её место в иерархии. Для свойства с типом, не содержащим значений свойств (число, строка, ссылка
на прикладной справочник), функция выбросит исключение — добавлять значения там некуда.
Готовый список значений свойства читается функцией
ПолучитьСписокЗначенийСвойств(Свойство) — возвращает массив ссылок.
Записать значения дополнительных реквизитов объекту
Для записи есть две разные функции, и путать их не стоит. ЗаписатьСвойстваУОбъекта()
работает с уже записанным объектом: разделяет реквизиты и сведения, блокирует данные, пишет табличную
часть и делает МенеджерЗаписи.Записать(Истина) по регистру — всё в транзакции.
ТаблицаСвойств = Новый ТаблицаЗначений;
ТаблицаСвойств.Колонки.Добавить("Свойство");
ТаблицаСвойств.Колонки.Добавить("Значение");
Строка = ТаблицаСвойств.Добавить();
Строка.Свойство = СвойствоСрокГодности;
Строка.Значение = 180;
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(НоменклатураСсылка, ТаблицаСвойств);
Второй вариант — УстановитьСвойстваУОбъекта(Владелец, Свойства), где
Владелец — объект, а не ссылка, а Свойства —
Соответствие «ссылка на свойство → значение». Она только заполняет табличную часть в памяти
и ничего не записывает, поэтому подходит для нового, ещё не записанного объекта:
НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент();
НовыйТовар.Наименование = "Ваза стеклянная";
Свойства = Новый Соответствие;
Свойства.Вставить(СвойствоСрокГодности, 180);
УправлениеСвойствами.УстановитьСвойстваУОбъекта(НовыйТовар, Свойства);
НовыйТовар.Записать();
Обе функции молча пропускают свойства, которых нет в наборах владельца: перед строкой записи вызывается
СвойстваОбъекта(), и «чужие» свойства отфильтровываются. Если значение записалось, но в
таблице его нет, — свойство просто не подключено к набору этого объекта.
Как подключить дополнительные реквизиты к форме объекта
Механизм встраивается в форму четырьмя обработчиками. Порядок и сигнатуры — из общего модуля
УправлениеСвойствами:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "ГруппаДопРеквизиты");
УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
КонецПроцедуры
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
КонецПроцедуры
ПриСозданииНаСервере() создаёт реквизиты формы и элементы под каждое свойство,
ПриЧтенииНаСервере() перезаполняет их при повторном чтении объекта,
ПередЗаписьюНаСервере() переносит значения из реквизитов формы в объект, а
ОбработкаПроверкиЗаполнения() проверяет свойства с признаком «Заполнять обязательно»,
включая условную обязательность зависимых реквизитов.
Если состав свойств изменился уже после открытия формы (пользователь отредактировал состав или ваш код
вызвал ДобавитьСвойство()), элементы пересоздаются вызовом:
&НаСервере
Процедура ОбновитьСоставРеквизитовНаСервере()
УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
Для формы, которая последовательно показывает свойства разных объектов, в параметрах ставят
ПроизвольныйОбъект = Истина. Тогда после ПриСозданииНаСервере() нужно самому
вызывать ЗаполнитьДополнительныеРеквизитыВФорме(), а перед сохранением —
ПеренестиЗначенияИзРеквизитовФормыВОбъект().
Наборы свойств: как объект получает свои реквизиты
Состав дополнительных реквизитов определяется не объектом, а его набором свойств.
Ссылку на предопределённый набор возвращает НаборСвойствПоИмени():
НаборСвойств = УправлениеСвойствами.НаборСвойствПоИмени("Справочник_Пользователи");
Если НаборСвойств = Неопределено Тогда
// предопределённый набор с таким именем не зарегистрирован
КонецЕсли;
Имя набора — полное имя объекта метаданных с точкой, заменённой на подчёркивание. Наборы
регистрируются в УправлениеСвойствамиПереопределяемый.ПриПолученииПредопределенныхНаборовСвойств;
если объекта там нет, программное добавление свойства к нему завершится исключением. Когда набор зависит
от вида объекта (например, от вида номенклатуры), у владельца есть реквизит набора — по умолчанию
НаборСвойств.
Перед обращением к подсистеме полезно проверить доступность:
СвойстваДоступны() — есть ли право чтения справочника наборов,
ИспользоватьДопРеквизиты(Ссылка) и ИспользоватьДопСведения(Ссылка) — поддерживает
ли конкретный объект соответствующий вид свойств.
ДобавитьСвойство() с реальными параметрами на копии базы — агент
выполнит код и сразу покажет, какие проверки уникальности имени и идентификатора для формул не прошли.
Частые ошибки при работе с дополнительными реквизитами БСП
-
Чтение табличной части запросом вместо
ЗначенияСвойств(). Строки длиннее 1024 символов хранятся в колонкеТекстоваяСтрока, и прямой запрос вернёт обрезанное значение. -
Передача массива объектов разных типов в
ЗначенияСвойств(). Имя таблицы определяется по первому элементу массива, поэтому остальные типы просто не попадут в результат. -
Попытка записать дополнительное сведение через
УстановитьСвойстваУОбъекта(). Функция принимает только дополнительные реквизиты и выбрасывает исключениеОшибкаКонфигурации. Для сведений —ЗаписатьСвойстваУОбъекта(). -
Свойство не подключено к набору владельца. Запись молча пропускается: обе процедуры
записи фильтруют значения по
СвойстваОбъекта(). ПроверяйтеПроверитьСвойствоУОбъекта(). -
Не заполнены обязательные параметры в
ДобавитьСвойство(). БезНаименованиеиТипЗначения(или устаревшегоТип) вызов падает; для видаМеткиобязателен ещёЦветСвойства. -
Добавление значения свойству неподходящего типа.
ДобавитьЗначениеСвойства()работает только с типамиЗначенияСвойствОбъектовиЗначенияСвойствОбъектовИерархия. -
Забытый
ПередЗаписьюНаСервере()в форме. Пользователь заполняет поля, но значения остаются в реквизитах формы и в объект не переносятся — после записи реквизиты пустые. -
Пустой результат у пользователя с ограниченными правами. Без права чтения
справочника наборов
ЗначенияСвойств()возвращает пустую таблицу, а сведения отфильтровываются отдельной проверкой права на регистр.
Частые вопросы о дополнительных реквизитах в БСП
Чем дополнительные реквизиты отличаются от дополнительных сведений?
Дополнительный реквизит хранится в табличной части ДополнительныеРеквизиты самого
объекта и записывается вместе с ним. Дополнительное сведение хранится в регистре сведений
ДополнительныеСведения с измерениями Объект и Свойство, его
можно изменять без записи объекта и разграничивать правами отдельно. Оба вида описываются одним
планом видов характеристик и различаются реквизитом ЭтоДополнительноеСведение.
Как получить значение дополнительного реквизита по имени свойства?
Вызовите УправлениеСвойствами.ЗначениеСвойства(Объект, "ИмяСвойства") — вторым
параметром принимается как ссылка плана видов характеристик, так и строковое имя свойства. Для
нескольких объектов или свойств сразу используйте ЗначенияСвойств(), передав массив
имён в параметре Свойства.
Как программно создать дополнительный реквизит и его значения в БСП?
Заполните структуру ПараметрыДобавленияСвойства() (обязательны
Наименование и ТипЗначения) и вызовите
ДобавитьСвойство(Владелец, Параметры, Перечисления.ВидыСвойств.ДополнительныеРеквизиты).
Если тип свойства — ЗначенияСвойствОбъектов, допустимые значения добавляются функцией
ДобавитьЗначениеСвойства() со структурой
ПараметрыДобавленияЗначенияСвойства().
ИИ Консоль кода 1С
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты
Старт
Для индивидуального использования
- До 5 конфигураций
- Встроенный агент запросов 1С
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Продвинутый
Популярный выборДля интенсивного использования или команд
- До 15 конфигураций
- Встроенный агент запросов 1С
-
≈ 300 задач Подробнее про лимиты
-
Свои подписки Codex, Claude и любые OpenAI-совместимые
-
Внешние обработки без Конфигуратора
- Приоритетная техническая поддержка