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

Помогите с запросом… Доп реквизиты Номенклатуры

Я
   m1_1976

29.06.21 — 13:11

Всем добрый день.

Подскажите в тупике.

1С Розница.

Справочник Номенклатура.

У номенклатуры 8 доп реквизитов. (Важно что их конечное число).

Хочу найти запросом все товары у которых 7 известных мне конкретных реквизитов совпадают. (допустим мне известен один товар — из него эти 7 доп.реквизитов беру).

Все доп.реквизиты  обязательны к заполнению…

  

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

   m1_1976

1 — 29.06.21 — 13:14

Верно понимаю что должно быть 7 уровней вложенных запросов.

Первым нахожу все товары у которых совпадает Доп.свойство 1

Второым нахожу все товары среди результатов 1 запроса у которых совпадает Доп.свойство 2

и т.д.

????

   m1_1976

2 — 29.06.21 — 13:14

Че-то мне кажется какой-то огород горожу…

   RomanYS

3 — 29.06.21 — 13:17

соединить по равенству свойств, а потом сгруппировать по ссылке. <!>Имеющие<!> 7 совпадений — искомые элементы

   H A D G E H O G s

4 — 29.06.21 — 13:18

«ВЫБРАТЬ

|    НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка,

|    МАКСИМУМ(ВЫБОР

|            КОГДА НоменклатураДополнительныеРеквизиты.Свойство = &Реквизит1

|                ТОГДА НоменклатураДополнительныеРеквизиты.Значение

|        КОНЕЦ) КАК Реквизит1,

|    МАКСИМУМ(ВЫБОР

|            КОГДА НоменклатураДополнительныеРеквизиты.Свойство = &Реквизит2

|                ТОГДА НоменклатураДополнительныеРеквизиты.Значение

|        КОНЕЦ) КАК Реквизит2

|ПОМЕСТИТЬ Реквизиты

|ИЗ

|    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты

|

|СГРУППИРОВАТЬ ПО

|    НоменклатураДополнительныеРеквизиты.Ссылка

|;

|

|////////////////////////////////////////////////////////////////////////////////

|ВЫБРАТЬ РАЗЛИЧНЫЕ

|    Реквизиты.Ссылка КАК Ссылка

|ИЗ

|    Реквизиты КАК Реквизиты

|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Реквизиты КАК Реквизиты1

|        ПО Реквизиты.Реквизит1 = Реквизиты1.Реквизит1

|            И Реквизиты.Реквизит2 = Реквизиты1.Реквизит2″

   m1_1976

5 — 29.06.21 — 13:18

так решил…

ВЫБРАТЬ

    ВложенныйЗапрос.Ссылка КАК Ссылка,

    СУММА(ВложенныйЗапрос.Поле1) КАК Поле1

ИЗ

    (ВЫБРАТЬ

        НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка,

        1 КАК Поле1

    ИЗ

        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты

    ГДЕ

        НоменклатураДополнительныеРеквизиты.Значение = &ЗначениеТовар

    
    ОБЪЕДИНИТЬ ВСЕ

    
    ВЫБРАТЬ

        НоменклатураДополнительныеРеквизиты.Ссылка,

        1

    ИЗ

        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты

    ГДЕ

        НоменклатураДополнительныеРеквизиты.Значение = &ЗначениеБренд

    
    ОБЪЕДИНИТЬ ВСЕ

    
    ВЫБРАТЬ

        НоменклатураДополнительныеРеквизиты.Ссылка,

        1

    ИЗ

        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты

    ГДЕ

        НоменклатураДополнительныеРеквизиты.Значение = &ЗначениеБренд

    
    ОБЪЕДИНИТЬ ВСЕ

    
    ВЫБРАТЬ

        НоменклатураДополнительныеРеквизиты.Ссылка,

        1

    ИЗ

        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты

    ГДЕ

        НоменклатураДополнительныеРеквизиты.Значение = &ЗначениеСостав

    
    ОБЪЕДИНИТЬ ВСЕ

    
    ВЫБРАТЬ

        НоменклатураДополнительныеРеквизиты.Ссылка,

        1

    ИЗ

        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты

    ГДЕ

        НоменклатураДополнительныеРеквизиты.Значение = &ЗначениеЦвет

    
    ОБЪЕДИНИТЬ ВСЕ

    
    ВЫБРАТЬ

        НоменклатураДополнительныеРеквизиты.Ссылка,

        1

    ИЗ

        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты

    ГДЕ

        НоменклатураДополнительныеРеквизиты.Значение = &ЗначениеСостав

    
    ОБЪЕДИНИТЬ ВСЕ

    
    ВЫБРАТЬ

        НоменклатураДополнительныеРеквизиты.Ссылка,

        1

    ИЗ

        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты

    ГДЕ

        НоменклатураДополнительныеРеквизиты.Значение = &ЗначениеАртикул) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО

    ВложенныйЗапрос.Ссылка

УПОРЯДОЧИТЬ ПО

    Поле1 УБЫВ

   m1_1976

6 — 29.06.21 — 13:19

Добавил доп поле = 1 в каждом.

Потом выбираю только те у которых Поле1 = 8

   RomanYS

7 — 29.06.21 — 13:26

(4) с одной стороны прикольно, с другой стороны: почему тогда не просто 2 (или N) левых соединения? Вроде методически более верно и не сильно более громоздко

   apdate by

8 — 29.06.21 — 13:42

а так не правильно? (я плохо знаю запросы знаю mysql Но и там задумался (

Запрос = Новый Запрос;

    Запрос.Текст =

        «ВЫБРАТЬ

        |    Номенклатура.Ссылка

        |ИЗ

        |    Справочник.Номенклатура КАК Номенклатура

        |ГДЕ

        |    Номенклатура.Артикул = Номенклатура.Артикул

        |    И Номенклатура.АлкогольнаяПродукция = Номенклатура.АлкогольнаяПродукция

        |    И Номенклатура.Наименование = Номенклатура.Наименование»;

   apdate by

9 — 29.06.21 — 13:47

+(8) у меня сработало

Запрос = Новый Запрос;

    Запрос.Текст =

        «ВЫБРАТЬ

        |    Тест.Ссылка КАК Ссылка,

        |    Тест.ВерсияДанных КАК ВерсияДанных,

        |    Тест.ПометкаУдаления КАК ПометкаУдаления,

        |    Тест.Код КАК Код,

        |    Тест.Наименование КАК Наименование,

        |    Тест.А КАК А,

        |    Тест.Б КАК Б,

        |    Тест.С КАК С,

        |    Тест.Д КАК Д,

        |    Тест.Предопределенный КАК Предопределенный,

        |    Тест.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных

        |ИЗ

        |    Справочник.Тест КАК Тест

        |ГДЕ

        |    Тест.А = Тест.А

        |    И Тест.Б = Тест.А

        |    И Тест.С = Тест.А

        |    И Тест.Д = Тест.А»;

    
    РезультатЗапроса = Запрос.Выполнить();

    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

        а = «»;

    КонецЦикла;

   RomanYS

10 — 29.06.21 — 13:48

(8) у тебя все условия заведомо Истина (для не групп)

   apdate by

11 — 29.06.21 — 13:48

+(9) выдало все элементы у которых в реквизитах

А, Б, С, Д одинаковые значения

   apdate by

12 — 29.06.21 — 13:51

(10) а что у меня не верно? то?

оно работает далее поместить результат в массив и соединением выдрать ссылки на владельца этих доп реквизитов?

   Classic

13 — 29.06.21 — 13:53

ВЫБРАТЬ

     СравниваемаяНоменклатура.Ссылка КАК Номенклатура

ПОМЕСТИТЬ НесовпадающиеНоменклатуры    

ИЗ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ОсновнаяНоменклатура

    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СравниваемаяНоменклатура

    ПО ОсновнаяНоменклатура.Ссылка <> СравниваемаяНоменклатура.Ссылка

    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДанныеСравниваемойНоменклатуры

    ПО СравниваемаяНоменклатура.Ссылка = ДанныеСравниваемойНоменклатуры.Ссылка

       И ОсновнаяНоменклатура.Свойство = ДанныеСравниваемойНоменклатуры.Свойство

       И ОсновнаяНоменклатура.Значение = ДанныеСравниваемойНоменклатуры.Значение

ГДЕ

   ОсновнаяНоменклатура.Ссылка = &НашаНоменклатура

   И ДанныеСравниваемойНоменклатуры.Ссылка ЕСТЬ NULL

;

ВЫБРАТЬ

   СпрНоменклатура.Ссылка

ИЗ Справочник.Номенклатура КАК СпрНоменклатура

   ЛЕВОЕ СОЕДИНЕНИЕ НесовпадающиеНоменклатуры  КАК НесовпадающиеНоменклатуры

   ПО СпрНоменклатура.Ссылка = НесовпадающиеНоменклатуры.Номенклатура

ГДЕ

  НесовпадающиеНоменклатуры.Номенклатура ЕСТЬ NULL

   Classic

14 — 29.06.21 — 13:53

(13)

Как-то так. Идея я думаю ясна

   lodger

15 — 29.06.21 — 13:54

(5)

а если так?

ВЫБРАТЬ

        НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка,

        СУММА(1) КАК Поле1

    ИЗ

        Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты

    ГДЕ

        НоменклатураДополнительныеРеквизиты.Значение В (&СписокЗначений)

СГРУППИРОВАТЬ ПО

    НоменклатураДополнительныеРеквизиты.Ссылка

ИМЕЮЩИЕ СУММА(1) = 8

   RomanYS

16 — 29.06.21 — 13:54

(12) У ТСа совсем другая задача

   apdate by

17 — 29.06.21 — 13:55

(16) да я видимо не понял задачу :-(

   RomanYS

18 — 29.06.21 — 14:06

(13) возможно сработает.

Только есть нюансы:

1. прикладной: у ТСа свойств всего 8, а совпадать должно 7

2. более принципиальный: что будет если у элемента не будет допреквизита? Есть подозрение, что он попадёт в выборку

   m1_1976

19 — 29.06.21 — 14:09

(18) 2) Будет. Заполнение доп.реквизита обязательно!

Сделал по своему…

Только долго работает запрос…

   Classic

20 — 29.06.21 — 14:14

(18)

Как задача стоит?

Любые 7? Тогда да, мой подход неправильный. Но тогда (6) вообще непонятно к чему

Конкретные 7? Ставим отбор в первой таблице на свойство

У номенклатуры всего 7 из 8? Тогда все правильно.

Я думаю, что задача стоит получить все номенклатуры с такими же свойствами, как и у заданной. Такая задача логична. Единственный вопрос. Если у заданной будет 4 свойства, а у какой-то 5, эта какая-то должна в выборку попадать?

   RomanYS

21 — 29.06.21 — 14:16

(19) Заполнение доп.реквизита обязательно!

Ага и у групп и услуг?

(20) Если у номенклатуры не будет ни одной записи ДР (например у групп) — она попадёт в твою выборку?

   Classic

22 — 29.06.21 — 14:17

(21)

Нет, она попадет в первую таблицу

   RomanYS

23 — 29.06.21 — 14:24

(22) ОК.

И даже 8 раз)) Имеет смысл «различные» добавить, а может и не повлияет ни на что.

   Classic

24 — 29.06.21 — 14:27

(23)

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

Можно поставить конечно. Можно и на один запрос переписать, только тогда следующий программист вообще не поймет как это работает :)

   m1_1976

25 — 29.06.21 — 14:37

(21) А причем тут Группы?

У них нет ТЧ «ДополнительныеРеквизиты».

Да и групп у меня нет и не будем в этой базе.. Все живет в доп.реквзитах замечтаельно. Еще и по группам их раскладывать??? :)

(20) У доп.свойства в рознице есть признак обязательности заполнения. У меня все заполнены. 100%

Спасибо всем за помощь.

Процентов на 60% помогли.  Самое важно — натолкнули на мысль! За это СПАСИБО!

   Classic

26 — 29.06.21 — 14:45

(25)

Покажи, что налабал. А то терзают смутные сомнения

   m1_1976

27 — 29.06.21 — 14:56

см (5)

через задницу… но

   Classic

28 — 29.06.21 — 15:10

(27)

Это очень мягко сказано.

В общем случае, если типы свойств будут разные, то твой запрос будет выдавать непонятные значения

   m1_1976

29 — 29.06.21 — 15:18

(28) Типы свойств всегда справочник «Дополнительные свойства».

Одно плохо = долго работает.

Несколько секунд (5-7) запрос выполняется.

потом переделаю…

   Classic

30 — 29.06.21 — 15:41

(29)

Смотри, например у тебя есть свойства (условно) «длина» и «ширина»

У твоей номенклатуры длина 10, ширина 5

У другой номенклатуры ширина 10, длина 5

Что выдаст твой запрос?

   m1_1976

31 — 29.06.21 — 16:22

(30) С ума сойти…  Меня пытаетесь запутать? Зачем? Пишите правильно:

Ш10 Д5

Ш5 Д10

Прчием тут мой запрос. У меня в запросе строго будет

(ШИРИНА = &ВыбШИРИНА)

(ДЛИНА = &ВыбДлина)

И не важно в каком порядоке Вы их в своем вопросе написали :))))))

У меня строго 8 доп.реквизитов

У меня есть товар, в котором у меня все известно (БРЕНД,СОСТАВ,ТИПТОВАРА,ЦВЕТ, МОДЕЛЬ и т.д)

Восьмое свойство РАЗМЕР.

Я своим запросом зная, эти 7 доп.реквизитов (из одного товара) — нахожу все такие же товары всех размеров!

Задачу я решил.

   Eiffil123

32 — 29.06.21 — 16:36

наиболее логично сделать 7 внутренних соединений с основой таблицей номенклатур и далее на закладке отборов наложить фильтр на эти реквизиты

   acanta

33 — 29.06.21 — 16:37

А если это не доп.реквизиты, а части одного реквизита, подстроки?

   Жан Пердежон

34 — 29.06.21 — 16:59

(30) там разные ссылки будут, так как (29)

(5) для общего случая — в каждый подзапрос отбор по свойству добавить (если не только доп.свойства),

если только допсвойства, то и (15) должно работать

и зачем у тебя сортировка вместо  ИМЕЮЩИЕ СУММА(Поле1) = 7?

   Classic

35 — 29.06.21 — 17:09

(31)

У тебя в (5) ничего такого не написано.

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

   Garykom

36 — 29.06.21 — 17:12

у допреквизитов поле имя есть по которому удобно в запросах

   m1_1976

37 — 29.06.21 — 17:21

(34) Сортировка это пережиток КонсолиЗапросов (отладка) — так вывел себе наверх в результате наиболее часто встречающиеся. Попробовал на десятке разных наборов. Понял что работает… и переделал на ИМЕЮЩИЕ.

Тут поспешил…

   m1_1976

38 — 29.06.21 — 17:22

(35) Так не может быть! так как (29)

  

m1_1976

39 — 29.06.21 — 17:23

Еще раз спасибо.

тему можно закрыть.

Ном = Справочники.Номенклатура.НайтиПоРеквизиту("Гарантия", ЗначениеРеквизита);

Этот способ подходит для поиска по реквизитам справочника. И он ищет только первый элемент и не годится, если их несколько.
Но, поскольку вы пишете что вам нужно осуществить поиск по дополнительному реквизиту, то вам прийдеться писать запрос, и решение зависит от того, как в вашей конфигурации реализованы дополнительные реквизиты.
Например, в конфигурации УНФ, дополнительные реквизиты, это элементы табличной части справочника Номенклатура. При этом «свойство», т.е. имя реквизита, в вашем случае «Гарантия», это план видов характеристик ДополнительныеРеквизитыИСведения. Запрос будет выглядеть примерно так:

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

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

Автор bony_ann, 08 авг 2018, 12:50

0 Пользователей и 1 гость просматривают эту тему.

В отчёте (отдельными колонками) нужно вывести номенклатуру и её дополнительные реквизиты, введённые пользователем в режиме предприятия.
Не понятно каким образом получить доп реквизиты.
Не судите строго, студентка, только начала работать с 1с. 


Цитата: bony_ann от 08 авг 2018, 12:50
В отчёте (отдельными колонками) нужно вывести номенклатуру и её дополнительные реквизиты, введённые пользователем в режиме предприятия.
Не понятно каким образом получить доп реквизиты.
Не судите строго, студентка, только начала работать с 1с.

Дополнительные реквизиты — это табличная часть справочника Номенклатура?
Сделайте цикл по строкам этой табличной части.


Примерно так можно получить:


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

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


Цитата: ДмитрийФ от 08 авг 2018, 13:29
Примерно так можно получить:

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

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

Спасибо, но запрос вывел таблицу значений по каждой номенклатуре, а как получить отдельные значения в столбцах?


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


Теги:

  • Форум 1С

  • Форум 1С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4

  • Конфигурирование, программирование в 1С Предприятие 8

  • Получение дополнительных реквизитов справочника

Похожие темы (5)

Рейтинг@Mail.ru

Rambler's Top100

Поиск

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

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

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

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

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

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

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

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

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

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

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

На чтение 2 мин. Просмотров 635 Опубликовано 15.12.2019

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

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

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

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

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

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

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

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

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

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

Юзайте на здоровья!

3 thoughts on “Получить значение дополнительных реквизитов 1С 8”

Спасибо, очень помогло.

К сожалению, на строчке
Запрос.УстановитьПараметр(«Объект», Объект);
спотыкается и отказывается дальше работать

Как редактировать доп реквизиты:

редактировать их состав можно тут:

хранятся они тут:

где типы реквизитов:

получить их в запросе можно так:

НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка,

НоменклатураДополнительныеРеквизиты.Ссылка.Код КАК Код,

НоменклатураДополнительныеРеквизиты.Свойство КАК Свойство,

НоменклатураДополнительныеРеквизиты.Значение КАК Значение

Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты

Разберем что откуда берется.

Дополнительные реквизиты заводятся в «ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения» и там же указан тип значений допРеквизитов:

ДополнительныеРеквизитыИСведения.Ссылка КАК Ссылка,

ДополнительныеРеквизитыИСведения.ТипЗначения КАК ТипЗначения

ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения

Для справки: Кроме ссыка и типЗначения в «ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения» хранится куча свойств этих реквизитов

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

ЗначенияСвойствОбъектов.Владелец КАК Владелец,

ЗначенияСвойствОбъектов.Ссылка КАК Ссылка,

ЗначенияСвойствОбъектов.Владелец.ТипЗначения КАК ВладелецТипЗначения

Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов

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

Google+

  • © 2019 Услуги 1С программиста. Доработка и обслуживание 1С. Удаленное программирование по всей России. Платформы 7.7 8.2 8.3 , битрикс.
  • Использование дополнительных реквизитов и сведений¶

    Использование дополнительных реквизитов и сведений в БП 2.0¶

    • Справочник ЗначенияСвойствОбъектов
    • План видов характеристик НазначенияСвойствКатегорийОбъектов
    • План видов характеристик СвойстваОбъектов
    • Регистр сведений ЗначенияСвойствОбъектов

    Использование дополнительных реквизитов и сведений в БП 3.0, УТ11,..¶

    • План видов характеристик ДополнительныеРеквизитыИСведения
    • Справочник ЗначенияСвойствОбъектов (Дополнительные значения)
    • Справочник ЗначенияСвойствОбъектовИерархия (Дополнительные значения (иерархия))
    • Справочник НаборыДополнительныхРеквизитовИСведений
    • Регистр сведений ДополнительныеСведения
    • Табличная часть «Дополнительные реквизиты» справочников и документов

    Использование для разных доп.реквизитов единого набора Значений дополнительных реквизитов.

    Для этого для дополнительного реквизита (ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения) установить реквизит ВладелецДополнительныхЗначений = [ПВХ.ДРС владелец Значениий доп.реквизитов]

    Примеры работы¶

        //Получение доп.реквизита при выгрузке
        ЗначениеДопРеквизита = УправлениеСвойствами.ЗначениеСвойства(ДанныеИБ.Ссылка, "ДокументПолучен_1571e91ee3854e3e93c31762011f3a4d"); 
    
        AdditionalInfoВставить(ДанныеXDTO, "ОригиналПолучен", ЗначениеЗаполнено(ЗначениеДопРеквизита));
    
    
        //получение доп.реквизита для объекта "Источник" 
        ЭлементПВХ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Серия", Истина);
        НайденнаяСтрока = Источник.ДополнительныеРеквизиты.Найти(ЭлементПВХ, "Свойство");
    
        //УТ11
        //Доп.сведение
        ЭлементПВХ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Тип", Истина);
        МассивСвойств = новый массив;
        МассивСвойств.Добавить(ЭлементПВХ);    
        ТаблицаСвойств = УправлениеСвойствами.ПолучитьЗначенияСвойств(Источник, ложь, истина, МассивСвойств);
        НайденнаяСтрока = ТаблицаСвойств.Найти(ЭлементПВХ, "Свойство");
        Если не НайденнаяСтрока = Неопределено Тогда
            Значение = НайденнаяСтрока.Значение;
        КонецЕсли;
    
    
    //Проверим и создадим строковый доп. реквизит к справочнику Номенклатура
    &НаСервере
    функция ПроверитьДобавитьСтроковыйДопРеквизитДляНоменклатуры(ИмяРеквизита, ДлинаСтроки=0)
    
        //ищем доп. реквизит по заголовку
        ЭлПВХ_Ссылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Заголовок",ИмяРеквизита);
        Если ЭлПВХ_Ссылка.Пустая() Тогда
            //если не найдено, то создадим новый
            ЭлПВХ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
            ЭлПВХ.Заголовок = ИмяРеквизита;
            ЭлПВХ.НаборСвойств = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура;
            ЭлПВХ.Наименование = ЭлПВХ.Заголовок+" ("+ЭлПВХ.НаборСвойств+")";
            ЭлПВХ.ТипЗначения = Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(ДлинаСтроки));
            ЭлПВХ.Записать();
            ЭлПВХ_Ссылка = ЭлПВХ.Ссылка;
        КонецЕсли;
    
        //проверим, что реквизит указан в наборе доп. реквизитов заказа покупателя
        НаборОб = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура.ПолучитьОбъект();
        Если НаборОб.ДополнительныеРеквизиты.Найти(ЭлПВХ_Ссылка, "Свойство") = Неопределено Тогда
            //добавим реквизит в набор
            СтрНаборОб = НаборОб.ДополнительныеРеквизиты.Добавить();
            СтрНаборОб.Свойство = ЭлПВХ_Ссылка;
        КонецЕсли;
        Если НаборОб.Модифицированность() Тогда
            //запишем при необходимости
            НаборОб.Записать();
        КонецЕсли;
        Возврат ЭлПВХ_Ссылка;
    КонецФункции
    
    //Установка доп.реквизита Объекта
    &НаСервере
    Процедура УстановитьДополнительныйРеквизитОбъекта(Объект, ИмяРеквизита, ЗначениеРеквизита)
    
        ЭлПВХ_Ссылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Заголовок",ИмяРеквизита);
        Если ЭлПВХ_Ссылка.Пустая() Тогда
            Сообщить("Не найден доп. реквизит "+ИмяРеквизита+", значение не установлено!");
            Возврат;
        КонецЕсли;
    
        СтрДопРеквизиты = Объект.ДополнительныеРеквизиты.Найти(ЭлПВХ_Ссылка, "Свойство");
        Если СтрДопРеквизиты = Неопределено Тогда
            СтрДопРеквизиты = Объект.ДополнительныеРеквизиты.Добавить();
        КонецЕсли;
        СтрДопРеквизиты.Свойство = ЭлПВХ_Ссылка;
        СтрДопРеквизиты.Значение = ЗначениеРеквизита;
    
    КонецПроцедуры
    

    Установка доп.сведения Объекта¶

    &НаСервереБезКонтекста
    Функция ЗаписатьЗначениеДополнительногоСведения(Объект, Свойство, Значение)
    
        Попытка
            УстановитьПривилегированныйРежим(Истина);
            НаборЗаписей = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей();
    
            НаборЗаписей.Отбор.Объект.Установить(Объект);
            НаборЗаписей.Отбор.Свойство.Установить(Свойство);
    
            НоваяСтрокаНабора = НаборЗаписей.Добавить();
    
            НоваяСтрокаНабора.Объект = Объект;
            НоваяСтрокаНабора.Свойство = Свойство;
    
            НоваяСтрокаНабора.Значение = Значение;
    
            НаборЗаписей.Записать();
    
            Возврат Истина;
        Исключение
            Возврат Ложь;
        КонецПопытки;
    КонецФункции
    
    

    Поиск Объекта по значению доп.сведения¶

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

    Снятие ограничения в 150 символов на длину наименования для дополнительных значений (Справочник.ЗначенияСвойствОбъектов)¶

    https://its.1c.ru/db/v8std#content:746:hdoc

    #Область ОбработчикиСобытий
    
    Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
        Поля.Добавить("Наименование");
        Поля.Добавить("ПолноеНаименование");
        СтандартнаяОбработка = Ложь;
    КонецПроцедуры
    
    Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
        //ЛокализацияКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка);
        // 1cmanager.ru Снимаем ограничение на длину наименования в 150 символов
        Представление = ?(ПустаяСтрока(Данные.ПолноеНаименование), Данные.Наименование, Данные.ПолноеНаименование);
         СтандартнаяОбработка = Ложь;    
    КонецПроцедуры
    
    #КонецОбласти
    
    

    Запись дополнительных реквизитов (БСП)¶

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

    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

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