Как программно найти дополнительный реквизит

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

Получить дополнительные реквизиты программно

Функция получает значение дополнительного реквизита объекта по ссылке и свойству.

  • Ссылка. Тип: Любая ссылка. Ссылка на искомый объект;
  • Свойство. Тип: План видов характеристик ДополнительныеРеквизитыИСведения. Дополнительное свойство.

Код:

Функция ПолучитьЗначениеДопРеквизита(Ссылка, Свойство) Экспорт

    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Свойство",Свойство);
    Массив = Ссылка.ДополнительныеРеквизиты.НайтиСтроки(ПараметрыОтбора);

    Если Массив.Количество() = 0 Тогда
        Возврат Неопределено;
    Иначе
        Возврат Массив[0].Значение;
    КонецЕсли;

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

Записать дополнительные реквизиты программно

Функция записывает значение доп. реквизита объекта по ссылке и свойству.

  • Ссылка. Тип: Любая ссылка. Ссылка на искомый объект;
  • Свойство. Тип: План видов характеристик ДополнительныеРеквизитыИСведения. Дополнительное свойство;
  • Значение. Тип: заданный для данного свойства.
Функция ЗаписатьЗначениеДопРеквизита(Ссылка, Свойство, Значение)
	
    Попытка
        ОбъектСсылки = Ссылка.ПолучитьОбъект();
		
	ПараметрыОтбора = Новый Структура;
	ПараметрыОтбора.Вставить("Свойство",Свойство);
	Массив = ОбъектСсылки.ДополнительныеРеквизиты.НайтиСтроки(ПараметрыОтбора);
		
	Если Массив.Количество() = 0 Тогда
            НовоеСвойство = ОбъектСсылки.ДополнительныеРеквизиты.Добавить();
	    НовоеСвойство.Свойство = Свойство;
	    НовоеСвойство.Значение = Значение;
	Иначе
	    Массив[0].Значение = Значение;
	КонецЕсли;	
	
	ОбъектСсылки.Записать();	
    Исключение
	Возврат Ложь;
    КонецПопытки
	
КонецФункции

Если вы еще не знаете, как правильно работать с механизмом дополнительных сведений в 1с 8, то прочтите об этом в статье 1С дополнительные сведения запись и получение.


Как программно добавить дополнительные реквизиты?

Я
   Vito

04.07.22 — 12:07

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

  

Партнерская программа EFSOL Oblako

   saaken

1 — 04.07.22 — 12:39

сначала вводишь руками, потом аналогично делаешь в конфинураторе

   Ryzeman

2 — 04.07.22 — 12:43

УправлениеСвойствами.ЗаписатьСвойстваУОбъекта()

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

   Vito

3 — 04.07.22 — 12:56

Реквизит уже добавлен в ручную. Как обратиться к этому реквизиту, чтобы добавить его значение?

Объект.ДополнительныеРекивзиты.<Как соcлаться на реквизит с именем «ExternalId»?>

   Vito

4 — 04.07.22 — 12:59

И где хранятся значения, доп.реквизитов? Где их можно посмотреть?

   xenos

5 — 04.07.22 — 12:59

(3) найди свойство по имени перебери все строки и найди нужное свойство

   Ryzeman

6 — 04.07.22 — 13:00

(3) я тебе уже написал.

УправлениеСвойствами.ЗаписатьСвойстваУОбъекта()

Через точку обращаться нельзя, это не реквизит. Это строка табличной части ДополнительныеРеквизиты. В запросе надо обращаться туда. Вне запросов делай через БСП

   Dmitry1c

7 — 04.07.22 — 13:01

(0) наркоманы …

   Vito

8 — 04.07.22 — 13:21

Простите чайника . Ничего не пойму. Получается, что обратиться можно только через запрос, если не использовать БСП?

(6) Как обратиться, можете пример написать? Ну вот никак не соображу как сделать, сижу часов 8 уже с этой проблемой.

(5) Как найти свойство?

   Vito

9 — 04.07.22 — 13:24

(6) Пробовал вот так но не получается:

Объект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура(«ExternalId»,»»))[0].Значение

   rudnitskij

10 — 04.07.22 — 13:34

(9) НовСтр = Объект.ДополнительныеРеквизиты.Добавить()…

и заполнять реквизиты строки таб части.

Писали же выше, что это обычная табчасть

   Ryzeman

11 — 04.07.22 — 13:35

Для начала тебе надо почитать про то, что такое вообще дополнительные реквизиты. Заодно что такое ПланыВидовХарактеристик и как с ними работать.

Затем, тебе надо понять твою задачу.

Затем, тебе надо понять как работать с БСП.

Я тебе в третий раз пишу — установить значение, задача, которую ты написал в (0) делается через УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(). Это метод БСП, который именно для этого написан. Он тебе и нужен и правильнее всего им и воспользоваться.

Что у тебя в строках табличной части ты можешь посмотреть в конфигураторе. Какие там значения — тем же запросом «ВЫБРАТЬ * ИЗ МойДокумент.ДополнительныеРеквизиты КАК МойДокумент ГДЕ МойДокумент.Ссылка = &СсылкаНаДокумент»

В БСП и так все функции задукоментированы, достаточно перейти в модуль и там всё предельно ясно описано:

// Записывает дополнительные реквизиты и сведения владельцу свойств.

// Изменения происходят в транзакции.

//

// Параметры:

//  ВладелецСвойств — Ссылка — например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя и т.д.

//  ТаблицаСвойствИЗначений — ТаблицаЗначений — с колонками:

//    * Свойство — ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения — свойство владельца.

//    * Значение — Произвольный — любое значение, допустимое для свойства (указано в элементе свойства).

//

Процедура ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений) Экспорт

Изучи всё это, попробуй, что не получится — напиши.

   Vito

12 — 04.07.22 — 14:13

БСП, к сожалению нет, нужно как-то решить задачу без БСП.

Насчет получения информации и Доп.Реквизитов, понял, что только через запрос к БД, а не к объекту конфигурации БД. Спасибо!

   Ryzeman

13 — 04.07.22 — 14:17

(12) Я прошу прощения, а откуда у тебя взялись доп реквизиты без БСП?

   Vito

14 — 04.07.22 — 14:32

(13) В ручную в карточке контрагента добавил

   Ryzeman

15 — 04.07.22 — 14:34

(14) Ты издеваешься сейчас?) Какая конфигурация? Что такое по-твоему БСП?) Ты путаешь с ИТС? Что будет если ты в конфигураторе в любом модуле напишешь УправлениеСвойствами.ЗаписатьСвойстваУОбъекта() и нажмёшь F12 на нём?)

   Vito

16 — 04.07.22 — 15:17

(15) Я не издеваюсь, я в 1С погружаю только 3-ю неделю (правда до этого были курсы 6 мес, но для аналитика). Конфигурация УНФ. Т.е. Вы хотите сказать, что БСП является частью стандартной конфигурации? Зачем тогда о ней вообще упоминать. Я думал это некая внешняя подключаемая библиотека.

Нажал F12 м попал в общий модуль, а там всякие процедуры и функции интересные лежат. Мне что теперь использовать соответствующую процедуру: ЗаполнитьДополнительныеРеквизитыВФорме ?

   Ryzeman

17 — 04.07.22 — 15:23

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

>> Зачем тогда о ней вообще упоминать

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

>>Мне что теперь использовать соответствующую процедуру

Да. Это самый правильный вариант решения задачи из (0). Не надо изобретать велосипедов, надо вдумчиво посмотреть как работает уже существующий и правильно крутануть педаль.

   Vito

18 — 04.07.22 — 19:28

(17) Спасибо! Попробовал вот такой вариант:

        МассивСтруктур = Новый Массив;

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

    S = Новый Структура(«Свойство, Значение»,Z,»123456789″);     

    МассивСтруктур.Добавить(S);

    УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(NewCounterparty,МассивСтруктур);

Но на последней строке получаю ошибку:

Ошибка при вызове метода контекста (Заблокировать)

{ОбщийМодуль.УправлениеСвойствами.Модуль(1175)}:Блокировка.Заблокировать();

по причине:

Неверный тип значения: Справочник.Контрагенты.Ссылка

Никак не пойму почему. Вроде в отладчики структура правильная…

   Ryzeman

19 — 04.07.22 — 19:52

(18) Сделай точку на останова на функции, посмотри что передаёшь в NewCounterparty.

Не совсем понял что у тебя за версия БСП, почему массив структур? В моей таблицу значений надо.

Если не поможет — попробуй остановку по ошибке (отладка — остановка по ошибке…). Там посмотри что у тебя вообще передаётся во ВладелецСвойств. И дальше через стек вызовов сможешь отследить. Чёт думается что ты пустую ссылку кидаешь или ещё что-то непотребное.

Ещё два совета — не используй короткие перменные типа Z и S даже в таких случаях. В 1с это не принято, если перебираешься к нам — избавляйся от этой привычки.

ПВХ лучше искать по полю «имя», оно уникально. В режиме предприятия это в самом низу будет. Там по умолчанию добавляется УИД, но ты сам можешь задать как тебе надо.

   Ryzeman

20 — 04.07.22 — 19:53

(19) если вдруг не знаешь как смотреть — выделяешь переменную, shift+F9. Ну вообще отладчиком пользоваться надо обязательно научиться. Это ключевой навык.

   Vito

21 — 04.07.22 — 20:18

( (19) Получилось ! Спасибо за помощь!

Как Вы и предположили передавал в NewCounterparty не ссылку, а объект.

Подскажите, как узнать используемую в конфигурации версию БСП?

   Гений 1С

22 — 04.07.22 — 20:21

Мой гений дарит вам, ггг (запоздало):

&НаСервере

Функция СоздатьДопРеквизитНаСервере(НаборСвойствСтрокой, ИдентификаторРеквизита, НаименованиеРеквизита, ТипЗначения = Неопределено, Многострочный = 0) Экспорт

    УстановитьПривилегированныйРежим(Истина);

    
    //включим константу использования

    Если Не Константы.ИспользоватьДополнительныеРеквизитыИСведения.Получить() Тогда

        Константы.ИспользоватьДополнительныеРеквизитыИСведения.Установить(Истина);

    КонецЕсли;

    
    //попробуем найти реквизит по наименованию

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

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

    Если НЕ ЗначениеЗаполнено(ДопРеквизитСсылка) Тогда

        //если не нашли реквизит — будем его создавать

        ДопРеквизитОбъект = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();

        ДопРеквизитОбъект.Заголовок = НаименованиеРеквизита;

        ДопРеквизитОбъект.НаборСвойств = Справочники.НаборыДополнительныхРеквизитовИСведений[НаборСвойствСтрокой]; //.Справочник_Контрагенты;

        Если ТипЗначения = Неопределено Тогда

            ТипЗначения = Новый ОписаниеТипов(«Строка»,,,,Новый КвалификаторыСтроки(250));

        КонецЕсли;

        ДопРеквизитОбъект.ТипЗначения = ТипЗначения; //

        ДопРеквизитОбъект.Наименование = ДопРеквизитОбъект.Заголовок + » («+ДопРеквизитОбъект.НаборСвойств+»)»;

        ДопРеквизитОбъект.Виден = Истина;

        ДопРеквизитОбъект.Доступен = Истина;

        ДопРеквизитОбъект.МногострочноеПолеВвода = Многострочный;

        ДопРеквизитОбъект.ДополнительныеЗначенияИспользуются = Истина;

        //зададим имя нового реквизита

        ДопРеквизитОбъект.Имя = ИдентификаторРеквизита; //»filap_»+СтрЗаменить(ИмяРеквизита,» «,»»);

        ДопРеквизитОбъект.Записать();

        ДопРеквизитСсылка = ДопРеквизитОбъект.Ссылка;        

    КонецЕсли;

    
    //добавим наш реквизит в набор дополнительных реквизитов контрагента

    НаборДополнительныхРеквизитовКонтрагента = Справочники.НаборыДополнительныхРеквизитовИСведений[НаборСвойствСтрокой].ПолучитьОбъект(); //Справочник_Контрагенты

    Если НаборДополнительныхРеквизитовКонтрагента.ДополнительныеРеквизиты.Найти(ДопРеквизитСсылка, «Свойство») = Неопределено Тогда

        //добавим реквизит в набор

        Стр = НаборДополнительныхРеквизитовКонтрагента.ДополнительныеРеквизиты.Добавить();

        Стр.Свойство = ДопРеквизитСсылка;

        НаборДополнительныхРеквизитовКонтрагента.Записать();

    КонецЕсли;

    
    Возврат  ДопРеквизитСсылка;

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

Примеры вызова:

&НаСервере

Функция  ДатьЗначениеДопРеквизитаНаСервере(Ссылка, ИдентификаторРеквизита, НаименованиеРеквизита, ТипЗначения = Неопределено, Многострочный = 0) Экспорт

    Если ТипЗнч(Ссылка) = Тип(«СправочникСсылка.Контрагенты») Тогда

        НаборСвойствСтрокой = «Справочник_Контрагенты»;

    ИначеЕсли ТипЗнч(Ссылка) = Тип(«СправочникСсылка.Партнеры») Тогда

        НаборСвойствСтрокой = «Справочник_Партнеры_Общие»;

    ИначеЕсли ТипЗнч(Ссылка) = Тип(«СправочникСсылка.ДоговорыКонтрагентов») Тогда

        НаборСвойствСтрокой = «Справочник_ДоговорыКонтрагентов»;

    ИначеЕсли ТипЗнч(Ссылка) = Тип(«ДокументСсылка.ЗаказКлиента») Тогда

        НаборСвойствСтрокой = «Документ_ЗаказКлиента»;

    Иначе

        Возврат Неопределено;

    КонецЕсли;

    УстановитьПривилегированныйРежим(Истина);

    Реквизит = СоздатьДопРеквизитНаСервере(НаборСвойствСтрокой, ИдентификаторРеквизита, НаименованиеРеквизита, ТипЗначения, Многострочный);

    ИскСтрока = Ссылка.ДополнительныеРеквизиты.Найти(Реквизит, «Свойство»);

    Если ИскСтрока = Неопределено Тогда

        Возврат Неопределено;

    КонецЕсли;

    Возврат ИскСтрока.Значение;

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

    ДанныеДоговора.Вставить(«ПодписантКлиентаФИО»,  ДатьЗначениеДопРеквизитаНаСервере(Договор, «Договор_ПодписантКлиентаФИО», «Подписант клиента ФИО», ТипСтрока250));

    ДанныеДоговора.Вставить(«ПодписантКлиентаДолжность»,  ДатьЗначениеДопРеквизитаНаСервере(Договор, «Договор_ПодписантКлиентаДолжность», «Подписант клиента должность», ТипСтрока250));

    ДанныеДоговора.Вставить(«ОГРН»,  ДатьЗначениеДопРеквизитаНаСервере(ДанныеДоговора.Партнер, «Партнер_ОГРН», «ОГРН», ТипСтрока250));

    ДанныеДоговора.Вставить(«ДействующийНаОсновании»,  ДатьЗначениеДопРеквизитаНаСервере(ДанныеДоговора.Партнер, «Партнер_ДействующийНаОсновании», «Действующий на основании», ТипСтрока250));

    ТипСтрока250 = Новый ОписаниеТипов(«Строка»,,,,Новый КвалификаторыСтроки(250));

    
    ДанныеДоговора.Вставить(«ПодписантКлиентаФИО»,  ДатьЗначениеДопРеквизитаНаСервере(Договор, «Договор_ПодписантКлиентаФИО», «Подписант клиента ФИО», ТипСтрока250));

    ДанныеДоговора.Вставить(«ПодписантКлиентаДолжность»,  ДатьЗначениеДопРеквизитаНаСервере(Договор, «Договор_ПодписантКлиентаДолжность», «Подписант клиента должность», ТипСтрока250));

    ДанныеДоговора.Вставить(«ОГРН»,  ДатьЗначениеДопРеквизитаНаСервере(ДанныеДоговора.Партнер, «Партнер_ОГРН», «ОГРН», ТипСтрока250));

    ДанныеДоговора.Вставить(«ДействующийНаОсновании»,  ДатьЗначениеДопРеквизитаНаСервере(ДанныеДоговора.Партнер, «Партнер_ДействующийНаОсновании», «Действующий на основании», ТипСтрока250));

   Фантазер

23 — 04.07.22 — 20:29

(21) Ну вот еще одно зачатие 1С-ника. А злые языки говорят — вырождаемся.

   Vito

24 — 04.07.22 — 20:44

(23) Зачался как 1С-ник месяцев 6 назад еще, а сейчас Спасибо всем за то, что грудями выкармливаете!

   Ryzeman

25 — 04.07.22 — 20:55

(21) Пожалуйста :)

>>Подскажите, как узнать используемую в конфигурации версию БСП?

В режиме предприятия посмотреть регистр сведений «Версии подсистем»

У меня, например, СтандартныеПодсистемы версии 3.1.5.385

(22) Кыш! Не порти нам человека своей гггениальностью))

   Garykom

26 — 04.07.22 — 21:03

(22) А если «Дополнительное значение (иерархия)» где?

  

Гений 1С

27 — 04.07.22 — 22:13

(26) допили

1.    Создание на форме дополнительных реквизитов в 1С 8.3 и их функции

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

Вывести реквизиты на форму можно динамически, при ее открытии. Если смотреть отладчиком, то видно, что после процедур ПриСозданииНаСервере и ПриОткрытии дополнительных реквизитов в 1С 8.3 еще нет. Появятся они, когда активизируется закладка «Дополнительно». При создании на форме, реквизитам присваиваются длинные, страшные, ни о чем не говорящие имена. Например:

Имена значений дополнительных реквизитов на форме

Из-за этого возникают сложности с программным обращением к дополнительным реквизитам в 1С 8.3.

Дополнительные реквизиты на форме создаются типовой процедурой УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме:


Создание дополнительных реквизитов на форме

Посмотрим отладчиком, как выглядит форма с созданными на ней дополнительными реквизитами для программного обращения:

Форма с созданными на ней дополнительными реквизитами в 1С 8.3  

2.     Установка значения дополнительного реквизита в 1С 8.3 с помощью обращения к нему по имени

Чтобы иметь возможность программного обращения к созданным дополнительным реквизитам, нужно знать их имена на форме. Помочь разработчику узнать имена дополнительных реквизитов может специальный реквизит Свойства_ОписаниеДополнительныхРеквизитов. Его автоматически создает система, когда используется механизм дополнительных реквизитов. Тип этого служебного реквизита ДанныеФормыКоллекция. Он содержит список всех дополнительных реквизитов объекта и все сведения о них. Теперь, мы сможем найти нужный дополнительный реквизит в 1С 8.3 по имени, или по соответствующему ему свойству плана видов характеристик. Итак, обращаясь по имени к доп.реквизиту можно присвоить ему нужное значение, либо, наоборот, получить его значение и, например, как-то проверить.

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

Раздел Для разработчиков в нижней части формы характеристики

Вот вариант процедуры, которая получает поле доп. реквизита по его имени:

Параметры функции: форма и имя дополнительного реквизита

Функция принимает два параметра – форма и имя дополнительного реквизита (имя для разработчиков). Сперва получим тот самый служебный реквизит, в котором содержатся данные о всех дополнительных реквизитах на форме. Затем по имени дополнительного реквизита в 1С 8.3 найдем свойство в плане видов характеристик. Теперь по этому свойству можем в списке реквизитов найти соответствующий реквизит.

Так может выглядеть код, вызывающий процедуру и устанавливающий значение дополнительному реквизиту:

Код, вызывающий процедуру и устанавливающий значение дополнительному реквизиту в 1С 8.3

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

Специалист компании «Кодерлайн»

Екатерина Редько

Contents

  • 1 Введение
  • 2 Архитектура
  • 3 Использование
  • 4 Особенности реализации
  • 5 Источники

Введение

В этой статье я хотел бы рассказать об архитектуре, использовании и особенностях реализации подсистемы «Свойства» из инструментария разработчика «1С:Библиотека стандартных подсистем» (1С БСП).

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

Архитектура

Описание работы с подсистемой «Свойства» на сайте ИТС 1С является исчерпывающим для типовых конфигураций, но в любом случае, для того, чтобы начать работать со свойствами в любой конфигурации с внедрённым 1С БСП необходимо установить установить константу «Использовать дополнительные реквизиты и сведения» в значение «Истина».  После этого мы можем открыть справочник «Наборы дополнительных реквизитов и сведений», который содержит список объектов для которых можно создавать дополнительные реквизиты и сведения. При добавлении через стандартные формы 1С БСП пользователь создаёт новый элемент «Плана видов характеристик», который добавляется в табличную часть элемента.

Дополнительные сведения отличаются от дополнительных реквизитов прежде всего расположением, дополнительные сведения содержатся в отдельном регистре с одноименным названием, а дополнительные реквизиты являются табличной частью объекта, к которому относятся. На рисунке ниже слева-направо изображены: элемент справочника «Наборы дополнительных реквизитов и свойств», элемент плана видов характеристик и список регистра сведений «Дополнительные сведения».

Следующий рисунок изображает пример дополнительного реквизита, слева-направо: элемент справочника «Наборы дополнительных реквизитов и свойств», элемент плана видов характеристик и элемент справочника, в который был добавлен дополнительный реквизит.

Также стоит учитывать, что большая часть объектов метаданных в справочнике «Наборы дополнительных реквизитов и сведений» является предопределённой:

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

// См. УправлениеСвойствамиПереопределяемый.ПриПолученииПредопределенныхНаборовСвойств.
//
// Параметры:
//   Наборы - см. УправлениеСвойствамиПереопределяемый.ПриПолученииПредопределенныхНаборовСвойств.Наборы
//
Процедура ПриПолученииПредопределенныхНаборовСвойств(Наборы) Экспорт
	Набор = Наборы.Строки.Добавить();
	Набор.Имя = "Справочник_ПапкиФайлов";
	Набор.Идентификатор = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
КонецПроцедуры

С точки зрения интеграции с объектами механизм работы с формами не сильно отличается от аналогичных у других подсистем 1С БСП: из модуля УправлениеСвойствами вызываются процедуры и функции с названиями соответствующими названиям событий для которых они вызываются, например:

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

Полный список функций и процедур находится в общем модуле УправлениеСвойствами в блоке, озаглавленным: «Процедуры и функции для стандартной обработки дополнительных реквизитов».

Использование

Каждый дополнительный реквизит или свойство содержит поле «Имя», подразумевается, что для программного использования будет использоваться этот реквизит.

Пример использования имени для получения дополнительного реквизита:

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

Результат:

Пример запроса для получения всех дополнительных свойств:

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

Результат:

Примеры получения свойств без запроса:

Рост = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.найтиПоРеквизиту("Имя", "Рост_12f49d4f164847b79effd75a758186c3");
// Получение дополнительного реквизита
Рост = УправлениеСвойствами.ЗначениеСвойства(ФизическоеЛицо.Ссылка, Рост);
// Получение всех дополнительных реквизитов и сведений объекта
ВсеСвойства = УправлениеСвойствами.ЗначенияСвойств(ФизическоеЛицо.Ссылка);

Особенности реализации

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

Чтобы найти реквизит на форме 1С БСП создаёт новые реквизиты формы Свойства_ОписаниеДополнительныхРеквизитов и Свойства_ОписаниеЗависимыхДополнительныхРеквизитов, с помощью них можно установить однозначное соответствие между элементом и значением объекта:

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

Добавим новый дополнительный реквизит для справочника физические лица «Номера счетов»

Добавляем программно, вторую запись в табличную часть «Дополнительные реквизиты» справочника «Физические лица» с тем же самым свойством:

Немного модифицируем код функции ЗначенияСвойств в общем модуле УправлениеСвойствамиСлужебный:

А также код процедуры ЗаполнитьДополнительныеРеквизитыВФорме в общем модуле УправлениеСвойствами:

Таким образом мы можем сохранять и восстанавливать значения реквизитов, которые, принимают множество значений.

// Создает/пересоздает дополнительные реквизиты и элементы в форме владельца свойств.
//
// Параметры:
//  Форма           - ФормаКлиентскогоПриложения - уже настроена в процедуре ПриСозданииНаСервере.
//
//  Объект          - Неопределено - взять объект из реквизита формы "Объект".
//                  - СправочникОбъектИмяСправочника - 
//                  - ДокументОбъектИмяДокумента - 
//                  - ПланВидовХарактеристикОбъектИмяПланаВидовХарактеристик - 
//                  - БизнесПроцессОбъектИмяБизнесПроцесса - 
//                  - ЗадачаОбъектИмяЗадачи - 
//                  - ПланВидовРасчетаОбъектИмяПланаВидовРасчета - 
//                  - ПланСчетовОбъектИмяПланаСчетов -
//                  - ДанныеФормыСтруктура -
//
//  ПоляНадписей    - Булево - если указать Истина, то вместо полей ввода на форме будут созданы поля надписей.
//
//  СкрытьУдаленные - Неопределено - не менять текущий режим скрытия удаленных, установленный ранее.
//                  - Булево - установить/отключить режим скрытия удаленных.
//                    При вызове процедуры ПередЗаписьюНаСервере в режиме скрытия удаленных, удаленные значения
//                    очищаются (не переносятся обратно в объект), а режим СкрытьУдаленные устанавливается Ложь.
//
Процедура ЗаполнитьДополнительныеРеквизитыВФорме(Форма, Объект = Неопределено, ПоляНадписей = Ложь, СкрытьУдаленные = Неопределено) Экспорт
	
	Если НЕ Форма.Свойства_ИспользоватьСвойства
	 ИЛИ НЕ Форма.Свойства_ИспользоватьДопРеквизиты Тогда
		Возврат;
	КонецЕсли;
	
	Если ТипЗнч(СкрытьУдаленные) = Тип("Булево") Тогда
		Форма.Свойства_СкрытьУдаленные = СкрытьУдаленные;
	КонецЕсли;
	
	Если Объект = Неопределено Тогда
		ОписаниеОбъекта = Форма.Объект;
	Иначе
		ОписаниеОбъекта = Объект;
	КонецЕсли;
	
	Форма.Свойства_НаборыДополнительныхРеквизитовОбъекта = Новый СписокЗначений;
	
	КлючНазначения = Неопределено;
	НаборыСвойствОбъекта = УправлениеСвойствамиСлужебный.ПолучитьНаборыСвойствОбъекта(
		ОписаниеОбъекта, КлючНазначения);
	
	УправлениеСвойствамиСлужебный.ЗаполнитьНаборыСДополнительнымиРеквизитами(
		НаборыСвойствОбъекта,
		Форма.Свойства_НаборыДополнительныхРеквизитовОбъекта);
	
	ОбновитьКлючНазначенияФормы(Форма, КлючНазначения);
	
	ОписаниеСвойств = УправлениеСвойствамиСлужебный.ЗначенияСвойств(
		ОписаниеОбъекта.ДополнительныеРеквизиты.Выгрузить(),
		Форма.Свойства_НаборыДополнительныхРеквизитовОбъекта,
		Ложь);
	
	ОписаниеСвойств.Колонки.Добавить("ИмяРеквизитаЗначение");
	ОписаниеСвойств.Колонки.Добавить("СтрокаСсылочногоТипа");
	ОписаниеСвойств.Колонки.Добавить("ИмяСсылочногоРеквизитаЗначение");
	ОписаниеСвойств.Колонки.Добавить("ИмяУникальнаяЧасть");
	ОписаниеСвойств.Колонки.Добавить("ДополнительноеЗначение");
	ОписаниеСвойств.Колонки.Добавить("Булево");
	
	УдалитьСтарыеРеквизитыИЭлементы(Форма);
	
	// Создание реквизитов.
	ДобавляемыеРеквизиты = Новый Массив();
	
	Для каждого ОписаниеСвойства Из ОписаниеСвойств Цикл
		
		ТипЗначенияСвойства = ОписаниеСвойства.ТипЗначения;
		СписокТипов = ТипЗначенияСвойства.Типы();
		СтроковыйРеквизит = (СписокТипов.Количество() = 1) И (СписокТипов[0] = Тип("Строка"));
		
		// Поддержка строк неограниченной длины.
		ИспользоватьНеограниченнуюСтроку = УправлениеСвойствамиСлужебный.ИспользоватьНеограниченнуюСтроку(
			ТипЗначенияСвойства, ОписаниеСвойства.МногострочноеПолеВвода);
		
		Если ИспользоватьНеограниченнуюСтроку Тогда
			ТипЗначенияСвойства = Новый ОписаниеТипов("Строка");
		ИначеЕсли ТипЗначенияСвойства.СодержитТип(Тип("Строка"))
			И ТипЗначенияСвойства.КвалификаторыСтроки.Длина = 0 Тогда
			// Если нельзя использовать неограниченную строку, а в свойствах реквизита она неограниченная,
			// то устанавливаем ограничение в 1024 символа.
			ТипЗначенияСвойства = Новый ОписаниеТипов(ОписаниеСвойства.ТипЗначения,
				,,, Новый КвалификаторыСтроки(1024));
		КонецЕсли;
		
		ОписаниеСвойства.ИмяУникальнаяЧасть = 
		СтрЗаменить(ВРег(Строка(ОписаниеСвойства.Набор.УникальныйИдентификатор())), "-", "x")
		+ "_"
		+ СтрЗаменить(ВРег(Строка(ОписаниеСвойства.Свойство.УникальныйИдентификатор())), "-", "x");
		
		// {{ Prosto. [Silantev Oleg Sergeevich] - [26.09.2020 21:51].
		Если ОписаниеСвойств.Найти("ДополнительныйРеквизитЗначение_" + ОписаниеСвойства.ИмяУникальнаяЧасть) <> Неопределено Тогда 
			ОписаниеСвойства.ИмяУникальнаяЧасть = ОписаниеСвойства.ИмяУникальнаяЧасть + "_" + ОписаниеСвойств.Индекс(описаниеСвойства);		
		КонецЕсли;
		// }} {{ Prosto. [Silantev Oleg Sergeevich] - [26.09.2020 21:51].
		
		
		ОписаниеСвойства.ИмяРеквизитаЗначение =
		"ДополнительныйРеквизитЗначение_" + ОписаниеСвойства.ИмяУникальнаяЧасть;
		
		
		ОписаниеСвойства.СтрокаСсылочногоТипа = Ложь;
		Если СтроковыйРеквизит
			И Не ИспользоватьНеограниченнуюСтроку
			И ОписаниеСвойства.ВыводитьВВидеГиперссылки Тогда
			ФорматированнаяСтрока                           = Новый ОписаниеТипов("ФорматированнаяСтрока");
			ОписаниеСвойства.СтрокаСсылочногоТипа           = Истина;
			ОписаниеСвойства.ИмяСсылочногоРеквизитаЗначение = "СсылочныйДополнительныйРеквизитЗначение_" + ОписаниеСвойства.ИмяУникальнаяЧасть;
			
			Реквизит = Новый РеквизитФормы(ОписаниеСвойства.ИмяСсылочногоРеквизитаЗначение, ФорматированнаяСтрока, , ОписаниеСвойства.Наименование, Истина);
			ДобавляемыеРеквизиты.Добавить(Реквизит);
		КонецЕсли;
		
		Если ОписаниеСвойства.Удалено Тогда
			ТипЗначенияСвойства = Новый ОписаниеТипов("Строка");
		КонецЕсли;
		
		Реквизит = Новый РеквизитФормы(ОписаниеСвойства.ИмяРеквизитаЗначение, ТипЗначенияСвойства, , ОписаниеСвойства.Наименование, Истина);
		ДобавляемыеРеквизиты.Добавить(Реквизит);
		
		ОписаниеСвойства.ДополнительноеЗначение =
			УправлениеСвойствамиСлужебный.ТипЗначенияСодержитЗначенияСвойств(ТипЗначенияСвойства);
		
		ОписаниеСвойства.Булево = ОбщегоНазначения.ОписаниеТипаСостоитИзТипа(ТипЗначенияСвойства, Тип("Булево"));
	КонецЦикла;
	Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	
	// Создание элементов формы.
	Для Каждого ОписаниеСвойства Из ОписаниеСвойств Цикл
		
		ИмяЭлементаДляРазмещения = Форма.Свойства_ИмяЭлементаДляРазмещения;
		Если ТипЗнч(ИмяЭлементаДляРазмещения) <> Тип("СписокЗначений") Тогда
			Если ИмяЭлементаДляРазмещения = Неопределено Тогда
				ИмяЭлементаДляРазмещения = "";
			КонецЕсли;
			
			ЭлементРазмещения = ?(ИмяЭлементаДляРазмещения = "", Неопределено, Форма.Элементы[ИмяЭлементаДляРазмещения]);
		Иначе
			РазделыДляРазмещения = Форма.Свойства_ИмяЭлементаДляРазмещения;
			РазмещениеНабора = РазделыДляРазмещения.НайтиПоЗначению(ОписаниеСвойства.Набор);
			Если РазмещениеНабора = Неопределено Тогда
				РазмещениеНабора = РазделыДляРазмещения.НайтиПоЗначению("ВсеОстальные");
			КонецЕсли;
			ЭлементРазмещения = Форма.Элементы[РазмещениеНабора.Представление];
		КонецЕсли;
		
		ФормаОписаниеСвойства = Форма.Свойства_ОписаниеДополнительныхРеквизитов.Добавить();
		ЗаполнитьЗначенияСвойств(ФормаОписаниеСвойства, ОписаниеСвойства);
		
		// Заполнение таблицы зависимых дополнительных реквизитов.
		Если ОписаниеСвойства.ЗависимостиДополнительныхРеквизитов.Количество() > 0
			И Не ОписаниеСвойства.Удалено Тогда
			ОписаниеЗависимогоРеквизита = Форма.Свойства_ОписаниеЗависимыхДополнительныхРеквизитов.Добавить();
			ЗаполнитьЗначенияСвойств(ОписаниеЗависимогоРеквизита, ОписаниеСвойства);
		КонецЕсли;
		
		ОтборСтрок = Новый Структура;
		ОтборСтрок.Вставить("НаборСвойств", ОписаниеСвойства.Набор);
		ЗависимостиДанногоНабора = ОписаниеСвойства.ЗависимостиДополнительныхРеквизитов.НайтиСтроки(ОтборСтрок);
		Для Каждого СтрокаТаблицы Из ЗависимостиДанногоНабора Цикл
			Если СтрокаТаблицы.ЗависимоеСвойство = "ЗаполнятьОбязательно"
				И ОписаниеСвойства.ТипЗначения = Новый ОписаниеТипов("Булево") Тогда
				Продолжить;
			КонецЕсли;
			Если ОписаниеСвойства.Удалено Тогда
				Продолжить;
			КонецЕсли;
			
			Если ТипЗнч(СтрокаТаблицы.Реквизит) = Тип("Строка") Тогда
				ПутьКРеквизиту = "Параметры.ОписаниеОбъекта." + СтрокаТаблицы.Реквизит;
			Иначе
				ОписаниеДополнительногоРеквизита = ОписаниеСвойств.Найти(СтрокаТаблицы.Реквизит, "Свойство");
				Если ОписаниеДополнительногоРеквизита = Неопределено Тогда
					Продолжить; // Дополнительный реквизит не существует, условие игнорируется.
				КонецЕсли;
				ПутьКРеквизиту = "Параметры.Форма." + ОписаниеДополнительногоРеквизита.ИмяРеквизитаЗначение;
			КонецЕсли;
			
			УправлениеСвойствамиСлужебный.ПостроитьУсловияЗависимостей(ОписаниеЗависимогоРеквизита, ПутьКРеквизиту, СтрокаТаблицы);
		КонецЦикла;
		
		Если ОписаниеСвойства.СтрокаСсылочногоТипа Тогда
			Если ЗначениеЗаполнено(ОписаниеСвойства.Значение) Тогда
				Значение = ОписаниеСвойства.ТипЗначения.ПривестиЗначение(ОписаниеСвойства.Значение);
				СтрокаЗначение = СтроковыеФункции.ФорматированнаяСтрока(Значение);
			Иначе
				Значение = НСтр("ru = 'не задано'");
				СсылкаРедактирования = "НеЗадано";
				СтрокаЗначение = Новый ФорматированнаяСтрока(Значение,, ЦветаСтиля.ЦветПустойГиперссылки,, СсылкаРедактирования);
			КонецЕсли;
			Форма[ОписаниеСвойства.ИмяСсылочногоРеквизитаЗначение] = СтрокаЗначение;
		КонецЕсли;
		Форма[ОписаниеСвойства.ИмяРеквизитаЗначение] = ОписаниеСвойства.Значение;
		
		Если ОписаниеСвойства.Удалено И Форма.Свойства_СкрытьУдаленные Тогда
			Продолжить;
		КонецЕсли;
		
		Если НаборыСвойствОбъекта.Количество() > 1 Тогда
			
			ЭлементСписка = Форма.Свойства_ЭлементыГруппДополнительныхРеквизитов.НайтиПоЗначению(
				ОписаниеСвойства.Набор);
			
			Если ЭлементСписка <> Неопределено Тогда
				Родитель = Форма.Элементы[ЭлементСписка.Представление];
			Иначе
				ОписаниеНабора = НаборыСвойствОбъекта.Найти(ОписаниеСвойства.Набор, "Набор");
				
				Если ОписаниеНабора = Неопределено Тогда
					ОписаниеНабора = НаборыСвойствОбъекта.Добавить();
					ОписаниеНабора.Набор     = ОписаниеСвойства.Набор;
					ОписаниеНабора.Заголовок = НСтр("ru = 'Удаленные реквизиты'")
				КонецЕсли;
				
				Если НЕ ЗначениеЗаполнено(ОписаниеНабора.Заголовок) Тогда
					ОписаниеНабора.Заголовок = Строка(ОписаниеСвойства.Набор);
				КонецЕсли;
				
				ИмяЭлементаНабора = "НаборДополнительныхРеквизитов" + ОписаниеСвойства.ИмяУникальнаяЧасть;
				
				Родитель = Форма.Элементы.Добавить(ИмяЭлементаНабора, Тип("ГруппаФормы"), ЭлементРазмещения);
				
				Форма.Свойства_ЭлементыГруппДополнительныхРеквизитов.Добавить(
					ОписаниеСвойства.Набор, Родитель.Имя);
				
				Если ТипЗнч(ЭлементРазмещения) = Тип("ГруппаФормы")
				   И ЭлементРазмещения.Вид = ВидГруппыФормы.Страницы Тогда
					
					Родитель.Вид = ВидГруппыФормы.Страница;
				Иначе
					Родитель.Вид = ВидГруппыФормы.ОбычнаяГруппа;
					Родитель.Отображение = ОтображениеОбычнойГруппы.Нет;
				КонецЕсли;
				Родитель.ОтображатьЗаголовок = Ложь;
				Родитель.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
				
				ЗаполненныеСвойстваГруппы = Новый Структура;
				Для каждого Колонка Из НаборыСвойствОбъекта.Колонки Цикл
					Если ОписаниеНабора[Колонка.Имя] <> Неопределено Тогда
						ЗаполненныеСвойстваГруппы.Вставить(Колонка.Имя, ОписаниеНабора[Колонка.Имя]);
					КонецЕсли;
				КонецЦикла;
				ЗаполнитьЗначенияСвойств(Родитель, ЗаполненныеСвойстваГруппы);
			КонецЕсли;
		Иначе
			Родитель = ЭлементРазмещения;
		КонецЕсли;
		
		Если ОписаниеСвойства.ВыводитьВВидеГиперссылки Тогда
			ИмяГруппыГиперссылки = "Группа_" + ОписаниеСвойства.ИмяУникальнаяЧасть;
			ГруппаГиперссылки = Форма.Элементы.Добавить(ИмяГруппыГиперссылки, Тип("ГруппаФормы"), Родитель);
			ГруппаГиперссылки.Вид = ВидГруппыФормы.ОбычнаяГруппа;
			ГруппаГиперссылки.Отображение = ОтображениеОбычнойГруппы.Нет;
			ГруппаГиперссылки.ОтображатьЗаголовок = Ложь;
			ГруппаГиперссылки.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
			ГруппаГиперссылки.Заголовок = ОписаниеСвойства.Наименование;
			
			Элемент = Форма.Элементы.Добавить(ОписаниеСвойства.ИмяРеквизитаЗначение, Тип("ПолеФормы"), ГруппаГиперссылки); // РасширениеПоляФормыДляПоляНадписи, РасширениеПоляФормыДляПоляВвода
			
			РеквизитДоступен = РеквизитДоступенПоФункциональнымОпциям(ОписаниеСвойства);
			Если РеквизитДоступен И Не ПоляНадписей Тогда
				ИмяКнопки = "Кнопка_" + ОписаниеСвойства.ИмяУникальнаяЧасть;
				Кнопка = Форма.Элементы.Добавить(
					ИмяКнопки,
					Тип("КнопкаФормы"),
					ГруппаГиперссылки);
					
				Кнопка.ТолькоВоВсехДействиях = Истина;
				Кнопка.ИмяКоманды = "РедактироватьГиперссылкуРеквизита";
				Кнопка.ОтображениеФигуры = ОтображениеФигурыКнопки.ПриАктивности;
			КонецЕсли;
			
			Если Не ОписаниеСвойства.СтрокаСсылочногоТипа И ЗначениеЗаполнено(ОписаниеСвойства.Значение) Тогда
				Элемент.Гиперссылка = Истина;
			КонецЕсли;
		Иначе
			Элемент = Форма.Элементы.Добавить(ОписаниеСвойства.ИмяРеквизитаЗначение, Тип("ПолеФормы"), Родитель); // РасширениеПоляФормыДляПоляНадписи, РасширениеПоляФормыДляПоляВвода
		КонецЕсли;
		
		ФормаОписаниеСвойства.ЭлементФормыДобавлен = Истина;
		
		Если ОписаниеСвойства.Булево И ПустаяСтрока(ОписаниеСвойства.ФорматСвойства) Тогда
			Элемент.Вид = ВидПоляФормы.ПолеФлажка;
			Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право;
		Иначе
			Если ПоляНадписей Тогда
				Элемент.Вид = ВидПоляФормы.ПолеВвода;
			ИначеЕсли ОписаниеСвойства.ВыводитьВВидеГиперссылки
				И (ОписаниеСвойства.СтрокаСсылочногоТипа
					Или ЗначениеЗаполнено(ОписаниеСвойства.Значение))Тогда
				Элемент.Вид = ВидПоляФормы.ПолеНадписи;
			Иначе
				Элемент.Вид = ВидПоляФормы.ПолеВвода;
				Элемент.АвтоОтметкаНезаполненного = ОписаниеСвойства.ЗаполнятьОбязательно И НЕ ОписаниеСвойства.Удалено;
			КонецЕсли;
			
			Элемент.РастягиватьПоВертикали = Ложь;
			Элемент.ПоложениеЗаголовка     = ПоложениеЗаголовкаЭлементаФормы.Лево;
		КонецЕсли;
		
		Если ОписаниеСвойства.СтрокаСсылочногоТипа Тогда
			Элемент.ПутьКДанным = ОписаниеСвойства.ИмяСсылочногоРеквизитаЗначение;
			Элемент.УстановитьДействие("ОбработкаНавигационнойСсылки", "Подключаемый_СвойстваВыполнитьКоманду");
		Иначе
			Элемент.ПутьКДанным = ОписаниеСвойства.ИмяРеквизитаЗначение;
		КонецЕсли;
		Элемент.Подсказка   = ОписаниеСвойства.Подсказка;
		Элемент.УстановитьДействие("ПриИзменении", "Подключаемый_ПриИзмененииДополнительногоРеквизита");
		
		Если Элемент.Вид = ВидПоляФормы.ПолеВвода
		   И Не ИспользоватьНеограниченнуюСтроку
		   И ОписаниеСвойства.ТипЗначения.Типы().Найти(Тип("Строка")) <> Неопределено Тогда
			
			Элемент.СвязьПоТипу = Новый СвязьПоТипу("Свойства_ОписаниеДополнительныхРеквизитов.Свойство",
				ОписаниеСвойств.Индекс(ОписаниеСвойства));
		КонецЕсли;
		
		Если ОписаниеСвойства.МногострочноеПолеВвода > 0 Тогда
			Если НЕ ПоляНадписей Тогда
				Элемент.МногострочныйРежим = Истина;
			КонецЕсли;
			Элемент.Высота = ОписаниеСвойства.МногострочноеПолеВвода;
		КонецЕсли;
		
		Если НЕ ПустаяСтрока(ОписаниеСвойства.ФорматСвойства)
			И Не ОписаниеСвойства.ВыводитьВВидеГиперссылки Тогда
			Если ПоляНадписей Тогда
				Элемент.Формат = ОписаниеСвойства.ФорматСвойства;
			Иначе
				ФорматнаяСтрока = "";
				Массив = СтрРазделить(ОписаниеСвойства.ФорматСвойства, ";", Ложь);
				
				Для каждого Подстрока Из Массив Цикл
					Если СтрНайти(Подстрока, "ДП=") > 0 ИЛИ СтрНайти(Подстрока, "DE=") > 0 Тогда
						Продолжить;
					КонецЕсли;
					Если СтрНайти(Подстрока, "ЧН=") > 0 ИЛИ СтрНайти(Подстрока, "NZ=") > 0 Тогда
						Продолжить;
					КонецЕсли;
					Если СтрНайти(Подстрока, "ДФ=") > 0 ИЛИ СтрНайти(Подстрока, "DF=") > 0 Тогда
						Если СтрНайти(Подстрока, "ддд") > 0 ИЛИ СтрНайти(Подстрока, "ddd") > 0 Тогда
							Подстрока = СтрЗаменить(Подстрока, "ддд", "дд");
							Подстрока = СтрЗаменить(Подстрока, "ddd", "dd");
						КонецЕсли;
						Если СтрНайти(Подстрока, "дддд") > 0 ИЛИ СтрНайти(Подстрока, "dddd") > 0 Тогда
							Подстрока = СтрЗаменить(Подстрока, "дддд", "дд");
							Подстрока = СтрЗаменить(Подстрока, "dddd", "dd");
						КонецЕсли;
						Если СтрНайти(Подстрока, "МММ") > 0 ИЛИ СтрНайти(Подстрока, "MMM") > 0 Тогда
							Подстрока = СтрЗаменить(Подстрока, "МММ", "ММ");
							Подстрока = СтрЗаменить(Подстрока, "MMM", "MM");
						КонецЕсли;
						Если СтрНайти(Подстрока, "ММММ") > 0 ИЛИ СтрНайти(Подстрока, "MMMM") > 0 Тогда
							Подстрока = СтрЗаменить(Подстрока, "ММММ", "ММ");
							Подстрока = СтрЗаменить(Подстрока, "MMMM", "MM");
						КонецЕсли;
					КонецЕсли;
					Если СтрНайти(Подстрока, "ДЛФ=") > 0 ИЛИ СтрНайти(Подстрока, "DLF=") > 0 Тогда
						Если СтрНайти(Подстрока, "ДД") > 0 ИЛИ СтрНайти(Подстрока, "DD") > 0 Тогда
							Подстрока = СтрЗаменить(Подстрока, "ДД", "Д");
							Подстрока = СтрЗаменить(Подстрока, "DD", "D");
						КонецЕсли;
					КонецЕсли;
					ФорматнаяСтрока = ФорматнаяСтрока + ?(ФорматнаяСтрока = "", "", ";") + Подстрока;
				КонецЦикла;
				
				Элемент.Формат = ФорматнаяСтрока;
				Элемент.ФорматРедактирования = ФорматнаяСтрока;
			КонецЕсли;
		КонецЕсли;
		
		Если ОписаниеСвойства.Удалено Тогда
			Элемент.ЦветТекстаЗаголовка = ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет;
			Элемент.ШрифтЗаголовка = ШрифтыСтиля.ЗаголовокУдаленногоРеквизитаШрифт;
			Если Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда
				Элемент.КнопкаОчистки = Истина;
				Элемент.КнопкаВыбора = Ложь;
				Элемент.КнопкаОткрытия = Ложь;
				Элемент.КнопкаВыпадающегоСписка = Ложь;
				Элемент.РедактированиеТекста = Ложь;
			КонецЕсли;
		КонецЕсли;
		
		Если НЕ ПоляНадписей И ОписаниеСвойства.ДополнительноеЗначение И Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда
			ПараметрыВыбора = Новый Массив;
			ПараметрыВыбора.Добавить(Новый ПараметрВыбора("Отбор.Владелец",
				?(ЗначениеЗаполнено(ОписаниеСвойства.ВладелецДополнительныхЗначений),
					ОписаниеСвойства.ВладелецДополнительныхЗначений, ОписаниеСвойства.Свойство)));
			Элемент.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбора);
		КонецЕсли;
		
	КонецЦикла;
	
	// Установка видимости, доступности и обязательности заполнения дополнительных реквизитов.
	Для Каждого ОписаниеЗависимогоРеквизита Из Форма.Свойства_ОписаниеЗависимыхДополнительныхРеквизитов Цикл
		Если ОписаниеЗависимогоРеквизита.ВыводитьВВидеГиперссылки Тогда
			ОбрабатываемыйЭлемент = СтрЗаменить(ОписаниеЗависимогоРеквизита.ИмяРеквизитаЗначение, "ДополнительныйРеквизитЗначение_", "Группа_");
		Иначе
			ОбрабатываемыйЭлемент = ОписаниеЗависимогоРеквизита.ИмяРеквизитаЗначение;
		КонецЕсли;
		
		Если ОписаниеЗависимогоРеквизита.УсловиеДоступности <> Неопределено Тогда
			Результат = РезультатВычисленияУсловия(Форма, ОписаниеОбъекта, ОписаниеЗависимогоРеквизита.УсловиеДоступности);
			Элемент = Форма.Элементы[ОбрабатываемыйЭлемент]; // ПолеФормы
			Если Элемент.Доступность <> Результат Тогда
				Элемент.Доступность = Результат;
			КонецЕсли;
		КонецЕсли;
		Если ОписаниеЗависимогоРеквизита.УсловиеВидимости <> Неопределено Тогда
			Результат = РезультатВычисленияУсловия(Форма, ОписаниеОбъекта, ОписаниеЗависимогоРеквизита.УсловиеВидимости);
			Элемент = Форма.Элементы[ОбрабатываемыйЭлемент];
			Если Элемент.Видимость <> Результат Тогда
				Элемент.Видимость = Результат;
			КонецЕсли;
		КонецЕсли;
		Если ОписаниеЗависимогоРеквизита.УсловиеОбязательностиЗаполнения <> Неопределено Тогда
			Если Не ОписаниеЗависимогоРеквизита.ЗаполнятьОбязательно Тогда
				Продолжить;
			КонецЕсли;
			
			Результат = РезультатВычисленияУсловия(Форма, ОписаниеОбъекта, ОписаниеЗависимогоРеквизита.УсловиеОбязательностиЗаполнения);
			Элемент = Форма.Элементы[ОбрабатываемыйЭлемент];
			Если Не ОписаниеЗависимогоРеквизита.ВыводитьВВидеГиперссылки
				И Элемент.АвтоОтметкаНезаполненного <> Результат Тогда
				Элемент.АвтоОтметкаНезаполненного = Результат;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Структура = Новый Структура("ПараметрыСвойств");
	ЗаполнитьЗначенияСвойств(Структура, Форма);
	Если ТипЗнч(Структура.ПараметрыСвойств) = Тип("Структура")
		И Структура.ПараметрыСвойств.Свойство("ВыполненаОтложеннаяИнициализация") Тогда
		Форма.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация = Истина;
		// Удаление временной декорации, если она была добавлена.
		Если Форма.ПараметрыСвойств.Свойство("ДобавленаПустаяДекорация") Тогда
			Для Каждого ИмяДекорации Из Форма.ПараметрыСвойств.КоллекцияДекораций Цикл
				Форма.Элементы.Удалить(Форма.Элементы[ИмяДекорации]);
			КонецЦикла;
			Форма.ПараметрыСвойств.Удалить("ДобавленаПустаяДекорация");
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры
// Возвращает заполненную таблицу значений свойств объекта.
Функция ЗначенияСвойств(ДополнительныеСвойстваОбъекта, Наборы, ЭтоДополнительноеСведение) Экспорт
	
	Если ДополнительныеСвойстваОбъекта.Количество() = 0 Тогда
		// Предварительная быстрая проверка использования дополнительных свойств.
		СвойстваНеНайдены = ДополнительныеРеквизитыИСведенияНеНайдены(Наборы, ЭтоДополнительноеСведение);
		
		Если СвойстваНеНайдены Тогда
			ОписаниеСвойств = Новый ТаблицаЗначений;
			ОписаниеСвойств.Колонки.Добавить("Набор");
			ОписаниеСвойств.Колонки.Добавить("Свойство");
			ОписаниеСвойств.Колонки.Добавить("ВладелецДополнительныхЗначений");
			ОписаниеСвойств.Колонки.Добавить("ЗаполнятьОбязательно");
			ОписаниеСвойств.Колонки.Добавить("Наименование");
			ОписаниеСвойств.Колонки.Добавить("ТипЗначения");
			ОписаниеСвойств.Колонки.Добавить("ФорматСвойства");
			ОписаниеСвойств.Колонки.Добавить("МногострочноеПолеВвода");
			ОписаниеСвойств.Колонки.Добавить("Удалено");
			ОписаниеСвойств.Колонки.Добавить("Значение");
			Возврат ОписаниеСвойств;
		КонецЕсли;
	КонецЕсли;
	
	Свойства = ДополнительныеСвойстваОбъекта.ВыгрузитьКолонку("Свойство");
	
	НаборыСвойств = Новый ТаблицаЗначений;
	
	НаборыСвойств.Колонки.Добавить(
		"Набор", Новый ОписаниеТипов("СправочникСсылка.НаборыДополнительныхРеквизитовИСведений"));
	
	НаборыСвойств.Колонки.Добавить(
		"ПорядокНабора", Новый ОписаниеТипов("Число"));
	
	Для каждого ЭлементСписка Из Наборы Цикл
		НоваяСтрока = НаборыСвойств.Добавить();
		НоваяСтрока.Набор         = ЭлементСписка.Значение;
		НоваяСтрока.ПорядокНабора = Наборы.Индекс(ЭлементСписка);
	КонецЦикла;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Свойства",      Свойства);
	Запрос.УстановитьПараметр("НаборыСвойств", НаборыСвойств);
	Запрос.УстановитьПараметр("ЭтоОсновнойЯзык", ТекущийЯзык() = Метаданные.ОсновнойЯзык);
	Запрос.УстановитьПараметр("КодЯзыка", ТекущийЯзык().КодЯзыка);
	
	Запрос.Текст =
	"ВЫБРАТЬ
	|	НаборыСвойств.Набор КАК Набор,
	|	НаборыСвойств.ПорядокНабора КАК ПорядокНабора
	|ПОМЕСТИТЬ НаборыСвойств
	|ИЗ
	|	&НаборыСвойств КАК НаборыСвойств
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	НаборыСвойств.Набор КАК Набор,
	|	НаборыСвойств.ПорядокНабора КАК ПорядокНабора,
	|	СвойстваНаборов.Свойство КАК Свойство,
	|	СвойстваНаборов.ПометкаУдаления КАК ПометкаУдаления,
	|	СвойстваНаборов.НомерСтроки КАК ПорядокСвойства
	|ПОМЕСТИТЬ СвойстваНаборов
	|ИЗ
	|	НаборыСвойств КАК НаборыСвойств
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК СвойстваНаборов
	|		ПО (СвойстваНаборов.Ссылка = НаборыСвойств.Набор)
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства
	|		ПО (СвойстваНаборов.Свойство = Свойства.Ссылка)
	|ГДЕ
	|	НЕ СвойстваНаборов.ПометкаУдаления
	|	И НЕ Свойства.ПометкаУдаления
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	Свойства.Ссылка КАК Свойство
	|ПОМЕСТИТЬ ЗаполненныеСвойства
	|ИЗ
	|	ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства
	|ГДЕ
	|	Свойства.Ссылка В(&Свойства)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	СвойстваНаборов.Набор КАК Набор,
	|	СвойстваНаборов.ПорядокНабора КАК ПорядокНабора,
	|	СвойстваНаборов.Свойство КАК Свойство,
	|	СвойстваНаборов.ПорядокСвойства КАК ПорядокСвойства,
	|	СвойстваНаборов.ПометкаУдаления КАК Удалено
	|ПОМЕСТИТЬ ВсеСвойства
	|ИЗ
	|	СвойстваНаборов КАК СвойстваНаборов
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ЗНАЧЕНИЕ(Справочник.НаборыДополнительныхРеквизитовИСведений.ПустаяСсылка),
	|	0,
	|	ЗаполненныеСвойства.Свойство,
	|	0,
	|	ИСТИНА
	|ИЗ
	|	ЗаполненныеСвойства КАК ЗаполненныеСвойства
	|		ЛЕВОЕ СОЕДИНЕНИЕ СвойстваНаборов КАК СвойстваНаборов
	|		ПО ЗаполненныеСвойства.Свойство = СвойстваНаборов.Свойство
	|ГДЕ
	|	СвойстваНаборов.Свойство ЕСТЬ NULL
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ВсеСвойства.Набор КАК Набор,
	|	ВсеСвойства.Свойство КАК Свойство,
	|	ДополнительныеРеквизитыИСведения.ВладелецДополнительныхЗначений КАК ВладелецДополнительныхЗначений,
	|	ДополнительныеРеквизитыИСведения.ЗаполнятьОбязательно КАК ЗаполнятьОбязательно,
	|	ВЫБОР
	|		КОГДА &ЭтоОсновнойЯзык
	|			ТОГДА ДополнительныеРеквизитыИСведения.Заголовок
	|		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(СвойстваПредставления.Заголовок, ДополнительныеРеквизитыИСведения.Заголовок) КАК СТРОКА(150))
	|	КОНЕЦ КАК Наименование,
	|	ДополнительныеРеквизитыИСведения.ТипЗначения КАК ТипЗначения,
	|	ДополнительныеРеквизитыИСведения.ФорматСвойства КАК ФорматСвойства,
	|	ДополнительныеРеквизитыИСведения.МногострочноеПолеВвода КАК МногострочноеПолеВвода,
	|	ВсеСвойства.Удалено КАК Удалено,
	|	ДополнительныеРеквизитыИСведения.Доступен КАК Доступен,
	|	ДополнительныеРеквизитыИСведения.Виден КАК Виден,
	|	ВЫБОР
	|		КОГДА &ЭтоОсновнойЯзык
	|			ТОГДА ДополнительныеРеквизитыИСведения.Подсказка
	|		ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(СвойстваПредставления.Подсказка, ДополнительныеРеквизитыИСведения.Подсказка) КАК СТРОКА(150))
	|	КОНЕЦ КАК Подсказка,
	|	ДополнительныеРеквизитыИСведения.ВыводитьВВидеГиперссылки КАК ВыводитьВВидеГиперссылки,
	|	ДополнительныеРеквизитыИСведения.ЗависимостиДополнительныхРеквизитов.(
	|		ЗависимоеСвойство КАК ЗависимоеСвойство,
	|		Реквизит КАК Реквизит,
	|		Условие КАК Условие,
	|		Значение КАК Значение,
	|		НаборСвойств КАК НаборСвойств
	|	) КАК ЗависимостиДополнительныхРеквизитов
	|ИЗ
	|	ВсеСвойства КАК ВсеСвойства
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
	|		ПО ВсеСвойства.Свойство = ДополнительныеРеквизитыИСведения.Ссылка
	|		ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Представления КАК СвойстваПредставления
	|		ПО (СвойстваПредставления.Ссылка = ДополнительныеРеквизитыИСведения.Ссылка)
	|			И (СвойстваПредставления.КодЯзыка = &КодЯзыка)
	|
	|УПОРЯДОЧИТЬ ПО
	|	Удалено,
	|	ВсеСвойства.ПорядокНабора,
	|	ВсеСвойства.ПорядокСвойства";
	
	Если ЭтоДополнительноеСведение Тогда
		Запрос.Текст = СтрЗаменить(
			Запрос.Текст,
			"Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты",
			"Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения");
	КонецЕсли;
	
	ОписаниеСвойств = Запрос.Выполнить().Выгрузить();
	ОписаниеСвойств.Индексы.Добавить("Свойство");
	ОписаниеСвойств.Колонки.Добавить("Значение");
	
	// Удаление дублей свойств в нижестоящих наборах свойств.
	Если Наборы.Количество() > 1 Тогда
		Индекс = ОписаниеСвойств.Количество()-1;
		
		Пока Индекс >= 0 Цикл
			Строка = ОписаниеСвойств[Индекс];
			НайденнаяСтрока = ОписаниеСвойств.Найти(Строка.Свойство, "Свойство");
			
			Если НайденнаяСтрока <> Неопределено
			   И НайденнаяСтрока <> Строка Тогда
				
				ОписаниеСвойств.Удалить(Индекс);
			КонецЕсли;
			
			Индекс = Индекс-1;
		КонецЦикла;
	КонецЕсли;
	
	// {{ Prosto. [Silantev Oleg Sergeevich] - [26.09.2020 21:33].
	ИспользованныеСвойства = Новый Массив;
	// }} {{ Prosto. [Silantev Oleg Sergeevich] - [26.09.2020 21:33].
	
	// Заполнение значений свойств.
	Для Каждого Строка Из ДополнительныеСвойстваОбъекта Цикл
		ОписаниеСвойства = ОписаниеСвойств.Найти(Строка.Свойство, "Свойство");
		Если ОписаниеСвойства <> Неопределено Тогда
			// {{ Prosto. [Silantev Oleg Sergeevich] - [26.09.2020 21:34].
			Если ИспользованныеСвойства.Найти(ОписаниеСвойства.Свойство) = Неопределено Тогда
				ИспользованныеСвойства.Добавить(ОписаниеСвойства.Свойство) 
			Иначе
				НоваяСтрокаОписания = ОписаниеСвойств.Добавить();
				ЗаполнитьЗначенияСвойств(НоваяСтрокаОписания, ОписаниеСвойства);
				ОписаниеСвойства = НоваяСтрокаОписания;
			КонецЕсли;
			// }} {{ Prosto. [Silantev Oleg Sergeevich] - [26.09.2020 21:34].
			// Поддержка строк неограниченной длины.
			Если НЕ ЭтоДополнительноеСведение Тогда
				ИспользоватьСтрокуВВидеСсылки = ИспользоватьСтрокуВВидеСсылки(
					ОписаниеСвойства.ТипЗначения,
					ОписаниеСвойства.ВыводитьВВидеГиперссылки,
					ОписаниеСвойства.МногострочноеПолеВвода);
				ИспользоватьНеограниченнуюСтроку = ИспользоватьНеограниченнуюСтроку(
					ОписаниеСвойства.ТипЗначения,
					ОписаниеСвойства.МногострочноеПолеВвода);
				НеобходимоПеренестиЗначениеИзСсылки = НеобходимоПеренестиЗначениеИзСсылки(
						Строка.ТекстоваяСтрока,
						Строка.Значение);
				Если (ИспользоватьНеограниченнуюСтроку
						Или ИспользоватьСтрокуВВидеСсылки
						Или НеобходимоПеренестиЗначениеИзСсылки)
					И НЕ ПустаяСтрока(Строка.ТекстоваяСтрока) Тогда
					Если Не ИспользоватьСтрокуВВидеСсылки И НеобходимоПеренестиЗначениеИзСсылки Тогда
						ЗначениеБезСсылки = ЗначениеБезСсылки(Строка.ТекстоваяСтрока, Строка.Значение);
						ОписаниеСвойства.Значение = ЗначениеБезСсылки;
					Иначе
						ОписаниеСвойства.Значение = Строка.ТекстоваяСтрока;
					КонецЕсли;
				Иначе
					ОписаниеСвойства.Значение = Строка.Значение;
				КонецЕсли;
			Иначе
				ОписаниеСвойства.Значение = Строка.Значение;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Возврат ОписаниеСвойств;
	
КонецФункции

Работа в примерах была осуществлена с версией БСП: 3.1.2.245

Источники

Как подключить дополнительные реквизиты к справочнику или документу в БСП 2.3

Создание множественного дополнительного реквизита. Управление торговлей 11

Введение.

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

Дополнительные реквизиты и сведения– механизм, позволяющий  не внося изменения в конфигурацию расширить её функциональность. Например, можно добавить дополнительные реквизит в документ Реализация товаров и услуг, для того, чтобы заполнять место погрузки или разгрузки в накладной. Причем сделать это нужно именно со стороны пользователя. Сейчас на смену этому механизму пришли расширения, однако пользователь самостоятельно сделать подобную настройку уже не сможет. Поэтому данный механизм еще актуален. Более того, расширения не работают в базовых версиях конфигураций, и тогда решать некоторые задачи приходится только с помощью дополнительных реквизитов.

Давайте теперь поговорим о таком важном моменте как создание дополнительного реквизита. Допустим, вы создали внешнюю печатную форму для документа Счет на оплату покупателю. И в ней в зависимости от значения некоторого параметра в справочнике Контрагенты будет включаться отображение некоторого столбца. Параметр этот, естественно, отсутствует в типовой конфигурации, однако мы знаем что есть замечательный механизм дополнительных реквизитов.  Теперь у нас появляется два варианта.

Вариант долгий и не оптимальный.

Нужно всего лишь попросить пользователя создать этот реквизит для справочника Контрагенты, написать длинную инструкцию, так как скорее всего пользователь никогда не слышал ни о дополнительных реквизитах, ни тем более о том как и где их создавать. Более того нужно еще быть уверенным, что пользователь нигде не ошибется в наименовании и типе создаваемого объекта.

Вариант незаметный для пользователя.

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

Процедуру можно вызвать при регистрации внешней формы

&НаСервере
Процедура СоздатьДопРеквизитНаСервере(ИмяРеквизита)
	
    //включим константу использования
    Если Не Константы.ИспользоватьДополнительныеРеквизитыИСведения.Получить() Тогда
        Константы.ИспользоватьДополнительныеРеквизитыИСведения.Установить(Истина);
    КонецЕсли;
	
	//попробуем найти реквизит по наименованию
	ДопРеквизитСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяРеквизита);
	Если НЕ ЗначениеЗаполнено(ДопРеквизитСсылка) Тогда
		//если не нашли реквизит - будем его создавать
		ДопРеквизитОбъект = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
		ДопРеквизитОбъект.Заголовок = ИмяРеквизита;
		ДопРеквизитОбъект.НаборСвойств = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Контрагенты;
                ДопРеквизитОбъект.ТипЗначения = Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(250));
		ДопРеквизитОбъект.Наименование = ДопРеквизитОбъект.Заголовок + " ("+ДопРеквизитОбъект.НаборСвойств+")";
		ДопРеквизитОбъект.Виден = Истина;
		ДопРеквизитОбъект.Доступен = Истина;
		ДопРеквизитОбъект.ДополнительныеЗначенияИспользуются = Истина;
		//зададим имя нового реквизита
		ДопРеквизитОбъект.Имя = "filap_"+СтрЗаменить(ИмяРеквизита," ","");
		ДопРеквизитОбъект.Записать();
		ДопРеквизитСсылка = ДопРеквизитОбъект.Ссылка;		
	КонецЕсли;
	
    //добавим наш реквизит в набор дополнительных реквизитов контрагента
    НаборДополнительныхРеквизитовКонтрагента = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Контрагенты.ПолучитьОбъект();
    Если НаборДополнительныхРеквизитовКонтрагента.ДополнительныеРеквизиты.Найти(ДопРеквизитСсылка, "Свойство") = Неопределено Тогда
        //добавим реквизит в набор
        Стр = НаборДополнительныхРеквизитовКонтрагента.ДополнительныеРеквизиты.Добавить();
        Стр.Свойство = ДопРеквизитСсылка;
	НаборДополнительныхРеквизитовКонтрагента.Записать();
    КонецЕсли;
	
КонецПроцедуры

Также я создал простую обработку, с одной командой, которая при нажатии будет создавать реквизит с наименованием, которое можно ввести на форме обработки.

Форма обработки

Отметим, что необходимо обязательно сделать проверку на существование данного реквизита, так как пользователь мог повторно подключать нашу гипотетическую печатную форму. Так же не забудьте заполнить реквизит Имя – оно должно быть без пробелов. Это служебный реквизит, с помощью которого мы в дальнейшем сможем обращаться к значению нашего дополнительного реквизита. Если вы его не зададите – система сгенерирует его автоматически, но оно будет длинным и «некрасивым». Как несложно заметить, реквизит создался, и именно так как мы это описали в процедуре создания. Строковый тип длиной 250 символов.

Результат добавления

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

На этом все. Всем удачи!

Скачать обработку с примером Вы можете по этой ссылке.

Опубликовано в Статьи по 1С 27.10.2018

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

Отличие дополнительного реквизита от дополнительного сведения в том, что

  • Дополнительные реквизиты – список реквизитов, доступных в форме документа или справочника; причем эти реквизиты хранятся в табличной части объекта, к которому они добавлены;
  • Дополнительные сведения – список значений доступных по дополнительной кнопке; причем доп. сведения  хранятся в  отдельном регистре.

После ввода дополнительного реквизита или сведения 1С, можно создать подключаемую обработку, где считать введенные дополнительные данные и задать необходимую логику обработки данных, в которой использовать этот реквизит или сведение.

Как получить 1С дополнительные реквизиты и сведения программно:

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

////
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ДополнительныеСведения.Свойство,
| ДополнительныеСведения.Значение
|ИЗ
| РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|ГДЕ
| ДополнительныеСведения.Объект = &Объект»;
Запрос.УстановитьПараметр(«Объект», СсылкаДокумент);
////

Для получения дополнительного реквизита использую код вида:

////
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| НоменклатураДополнительныеРеквизиты.Свойство,
| НоменклатураДополнительныеРеквизиты.Значение
|ИЗ
| Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
|ГДЕ
| НоменклатураДополнительныеРеквизиты.Свойство = &Свойство
| И НоменклатураДополнительныеРеквизиты.Ссылка = &Ссылка»;
Запрос.УстановитьПараметр(«Ссылка», СсылкаДокумент);
Запрос.УстановитьПараметр(«Свойство», ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(«Коэффициент бруто»));
////

Теперь вы без труда сможете добавить и получить необходимые дополнительные 1С данные без снятия конфигурации 1С с поддержки и изменения типовой конфигурации. Без сомнения, такой инструмент должен быть в арсенале 1С программиста и активно использоваться в работе.

Примеры работы с дополнительными реквизитами.

Как получить значение дополнительного реквизита:

Пример: мы делаем печатную форму документа «Заказ клиента» и хотим вывести на неё значение определённого дополнительного реквизита — «Должность покупателя».

Используем вложенный запрос, в котором соединяем левым соединением таблицу «Дополнительные реквизиты» документа «Заказ клиента» с Планом видов характеристик «Дополнительные реквизиты и сведения». Устанавливаем условие: заголовок дополнительного реквизита должен быть таким – «Должность покупателя». Таблицы соединяем по ссылке на «Заказ клиента».

Получается вот такой запрос:

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

Также можно использовать метод НайтиПоНаименованию(«***»).

Пример запроса:

"ВЫБРАТЬ 
|	ДоговорыКонтрагентовДополнительныеРеквизиты.Значение, 
|	ДоговорыКонтрагентовДополнительныеРеквизиты.Свойство 
|ИЗ 
|	Справочник.ДоговорыКонтрагентов.ДополнительныеРеквизиты КАК ДоговорыКонтрагентовДополнительныеРеквизиты 
|ГДЕ 
|	ДоговорыКонтрагентовДополнительныеРеквизиты.Ссылка = &Ссылка 
|	И ДоговорыКонтрагентовДополнительныеРеквизиты.Свойство = &Свойство"; 

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

Переменная Ссылка – это ссылка на «Договор контрагента».

 Проверка на предмет того, что дополнительный реквизит заполнен:

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

Если ЕстьСтроки.Количество() = 0 Тогда
	// Обработка условия
КонецЕсли;

 Как изменить значения дополнительных реквизитов:

Задействуем общий модуль УправлениеСвойствами, который входит в состав БСП.

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

МассивСтруктур = Новый Массив;
МассивСтруктур.Добавить(Новый Структура("Свойство, Значение", ДопРеквизитДатаОтправки, ТекущаяДата()));
МассивСтруктур.Добавить(Новый Структура("Свойство, Значение", ДопРеквизитДоставка, Истина));
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ЗаказКлиентаСсылка, МассивСтруктур);

Понравилась статья? Поделить с друзьями:
  • Как снять генератор на газель бизнес камминз
  • Как открыть музыкальную студию с нуля бизнес
  • Как посмотреть картотеку в втб бизнес онлайн
  • Как программно установить тип реквизиту в 1с
  • Как снять деньги со счета бизнеса в некст рп