--- title: Подключение к подсистеме Свойства slug: общие-подключение-объектов-к-бсп/подключение-к-подсистеме-свойства --- # Дополнительные реквизиты, сведения, метки ## 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)