---
title: Подключение к подсистеме Свойства
slug: общие-бсп-подключение-к-подсистемам/подключение-к-подсистеме-свойства
---

# Полезное
[Фрагменты кода](/bsp_svoystva/fragmenty.json)
[Консоль кода](/common/konsol-koda-is.epf)

# Дополнительные реквизиты, сведения, метки

## 1. Добавляем объект в определяемые типы
- `ВладелецДополнительныхСведений` (если нужны доп.сведения)
- `ВладелецМеток` (если нужны метки)

## 2. Добавляем в объект ТЧ "ДополнительныеРеквизиты"
Копируем из типового, например справочник `Пользователи`. ТЧ нужна только если нужны доп.реквизиты

## 3. Добавляем предопределенные наборы свойств (без доп.детализации)
В общем модуле `УправлениеСвойствамиПереопределяемый` в процедуре `ПриПолученииПредопределенныхНаборовСвойств` описываем наборы:
```bsl
Процедура ПриПолученииПредопределенныхНаборовСвойств(Наборы) Экспорт

	Набор = Наборы.Строки.Добавить();
	Набор.Имя = "Справочник_Организации"; 
	Набор.Идентификатор = Новый УникальныйИдентификатор("a4632c5e-a6c9-4141-83bc-be8e77ff1690"); // генерим UUID v4
	
КонецПроцедуры
```

__Разные наборы по видам объектов описаны в конце статьи__

## 4. Запустить обновление информационной базы
`Сервис > Параметры > Запуск 1С: Предприятия > ПараметрЗапуска` установить `/ЗапуститьОбновлениеИнформационнойБазы`.

## 5. Настраиваем формы

### Форма элемента
Создаем группу `ГруппаДополнительныеРеквизиты` (имя любое), в который будут падать программно созданные подсистемой элементы формы. И `ГруппаМетки`, если нужны метки
__В модуле формы описываем__
```bsl
#Область ОбработчикиСобытийФормы

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

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

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	// СтандартныеПодсистемы.Свойства
    УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.Свойства
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	// СтандартныеПодсистемы.Свойства 
	Если УправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда
		ОбновитьЭлементыДополнительныхРеквизитов();
		УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.Свойства        
	
КонецПроцедуры

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

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

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

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

#КонецОбласти

#Область ОбработчикиКомандФормы

// СтандартныеПодсистемы.Свойства
&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
    УправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область СтандартныеПодсистемы

// СтандартныеПодсистемы.Свойства 
&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
    УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
    УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
    УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства
 
#КонецОбласти

#КонецОбласти

```

### Форма списка

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

В конфигураторе открываем карточку объекта > `Данные > Характеристики`

В характеристиках настраиваем:
| **Поле**              | **Дополнительные сведения**                                                                | **Дополнительные реквизиты**                                                                |
| --------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------- |
| **Вид характеристик** | `Справочник.НаборыДополнительныхРеквизитовИСведений.ТабличнаяЧасть.ДополнительныеСведения` | `Справочник.НаборыДополнительныхРеквизитовИСведений.ТабличнаяЧасть.ДополнительныеРеквизиты` |
| **Поле ключа**        | `Свойство`                                                                                 | `Свойство`                                                                                  |
| **Поле отбора видов** | `ИмяПредопределенногоНабора`                                                               | `ИмяПредопределенногоНабора`                                                                |
| **Значение отбора**   | `Справочник_Склады`                                                                        | `Справочник_Склады`                                                                         |
| **Источник значений** | `РегистрСведений.ДополнительныеСведения`                                                   | `Справочник.Склады.ТабличнаяЧасть.ДополнительныеРеквизиты` (ТЧ, созданная в объекте)        |
| **Поле объекта**      | `Объект`                                                                                   | `Ссылка`                                                                                    |
| **Поле вида**         | `Свойство`                                                                                 | `Свойство`                                                                                  |
| **Поле значения**     | `Значение`                                                                                 | `Значение`                                                                                  |

__ВСЕ ОСТАЛЬНЫЕ ПОЛЯ ОЧИСТИТЬ__

Далее, чтобы отображать метки, нужно дополнить запрос динамического списка полями:
```bsl
ВЫБРАТЬ
	СправочникКонтрагенты.Ссылка,
	...остальные поля...,
	0 КАК Метка1,
	0 КАК Метка2,
	0 КАК Метка3 // до 7 меток (вроде)
	
ИЗ
	Справочник.Контрагенты КАК СправочникКонтрагенты
```

Выкидываем поля на форму, устанавливаем вид "ПолеКартинки", настраиваем ширину, убираем заголовок и т.д.
Картинкой значений устанавливаем `ПиктограммыСвойств`

Далее, создаем группу `ГруппаЛегендаМетки` (имя любое), в которой будут отрисовываться доступные метки с возможностью установки отбора

Затем, в модуле формы списка прописываем
```bsl

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// СтандартныеПодсистемы.Свойства
	ДополнительныеПараметры = Новый Структура;

	ПараметрыОтображенияМеток = УправлениеСвойствами.ПараметрыОтображенияМеток();	
	ПараметрыОтображенияМеток.ИмяЭлементаДляРазмещенияЛегендыМеток = "ГруппаЛегендаМетки";
	ПараметрыОтображенияМеток.ОтборМеток = Истина;
	ПараметрыОтображенияМеток.ВидОбъектов = Метаданные.Справочники.Номенклатура.ПолноеИмя();

	ДополнительныеПараметры.Вставить("ПараметрыОтображенияМеток", ПараметрыОтображенияМеток);
	ДополнительныеПараметры.Вставить("ПроизвольныйОбъект", Истина);

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

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыCписок

&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
	
	// СтандартныеПодсистемы.Свойства
	УправлениеСвойствами.ПриПолученииДанныхНаСервере(Настройки, Строки);
	// Конец СтандартныеПодсистемы.Свойства	
	
КонецПроцедуры

#КонецОбласти     

#Область СлужебныеПроцедурыИФункции

// СтандартныеПодсистемы.Свойства

&НаКлиенте
Процедура Подключаемый_УстановитьВидимостьЛегендыМеток(Команда)
    УстановитьВидимостьЛегендыМеток();
КонецПроцедуры

&НаСервере
Процедура УстановитьВидимостьЛегендыМеток()
    УправлениеСвойствами.УстановитьВидимостьЛегендыМеток(ЭтотОбъект);
КонецПроцедуры  

&НаКлиенте
Процедура Подключаемый_ОбработчикОтбораПоМеткам(Команда)
    УправлениеСвойствамиКлиент.УстановитьОтборПоМетке(ЭтотОбъект, Команда.Имя);
КонецПроцедуры

// Конец СтандартныеПодсистемы.Свойства

#КонецОбласти

```

## 6. Разные наборы свойств по видам объектов
### Создаем группу наборов свойств
Если нужно иметь разные наборы свойств в зависимости от значения какого-то реквизита - `ВидНоменклатуры` (тип - `СправочникСсылка.ВидыНоменклатуры`), например, то в `ПриПолученииПредопределенныхНаборовСвойств` описываем __группы__ а не элементы

```bsl
Процедура ПриПолученииПредопределенныхНаборовСвойств(Наборы) Экспорт
	
	Набор = Наборы.Строки.Добавить();
	Набор.Имя = "Справочник_Номенклатура"; // Обязательно в таком формате: Справочник_ИмяСправочника
	Набор.ЭтоГруппа = Истина; // важный флаг
	Набор.Идентификатор = Новый УникальныйИдентификатор("3001280c-f6ec-4fa9-bc4a-5eee8f177b60"); // генерим UUID v4
	
КонецПроцедуры
```
### Настраиваем объект
Если мы завязываемся на реквизит `ВидНоменклатуры` справочнике `Номенклатура`, то нужно в справочнике __`ВидыНоменклатуры`__ создать реквизит `НаборСвойств`, с типом `СправочникСсылка.НаборыДополнительныхРеквизитовИСведений`. То есть мы создаем реквизит в том объекте метаданных, __по которому должен осуществляться отбор наборов свойств__

__В модуле объекта метаданных, по которому отбираем наборы__ (в нашем случае __`ВидыНоменклатуры`__ )

```bsl
#Область ОбработчикиСобытий

Процедура ПередЗаписью(Отказ)
	
	Если НЕ ЭтоГруппа Тогда
		// СтандартныеПодсистемы.Свойства
		УправлениеСвойствами.ПередЗаписьюВидаОбъекта(ЭтотОбъект, "Справочник_Номенклатура");
		// Конец СтандартныеПодсистемы.Свойства   
	КонецЕсли;
	
КонецПроцедуры

Процедура ПередУдалением(Отказ)

	Если НЕ ЭтоГруппа Тогда
		// СтандартныеПодсистемы.Свойства
		УправлениеСвойствами.ПередУдалениемВидаОбъекта(ЭтотОбъект);
		// Конец СтандартныеПодсистемы.Свойства
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти
```
### Модуль формы элемента объекта-владельца
В нашем случае `Справочник_Номенклатура`. Подразумеваем, что базовый код (раздел 3) был уже добавлен 
Добавляем в обработчик события `ПриИзменении` реквизита, по которому осуществляем отбор реквизитов следующий код для перерисовки реквизитов при его изменении:

```bsl
&НаКлиенте
Процедура ВидНоменклатурыПриИзменении(Элемент)
	ОбновитьЭлементыДополнительныхРеквизитов();
КонецПроцедуры

...

// Это уже должно быть реализовано в п.3
&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()

	УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);

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

```

### Общий модуль `УправлениеСвойствамиПереопределяемый`

```bsl
Процедура ЗаполнитьНаборыСвойствОбъекта(Знач Объект, ТипСсылки, НаборыСвойств, СтандартнаяОбработка, КлючНазначения) Экспорт
	
    // Типов всегда много в подсистеме, поэтому обрабатываем точечно
	Если ТипСсылки = Тип("СправочникСсылка.Номенклатура") Тогда
		ЗаполнитьНаборСвойствПоВидуНоменклатуры(Объект, ТипСсылки, НаборыСвойств);	
	КонецЕсли;

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

Процедура ЗаполнитьНаборСвойствПоВидуНоменклатуры(Номенклатура, ТипСсылки, НаборыСвойств)

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

```

> Написано сумбурно, можно покурить демо базу БСП

## PS.Отличия доп.реквизита от доп.сведений и меток

![Доп.реквизиты](/bsp_svoystva/rekvizity.png)
![Доп.реквизиты](/bsp_svoystva/svedeniya.png)