1с заполнитьзначениясвойств реквизиты формы

Копирует свойства одного объекта в одноименные свойства другого

Синтаксис

Процедура ЗаполнитьЗначенияСвойств() имеет следующий синтаксис:

ЗаполнитьЗначенияСвойств(Приемник, Источник, [СписокСвойств], [ИсключаяСвойства])

А также альтернативный англоязычный синтаксис:

FillPropertyValues(Destination, Source, [PropertiesList], [ExclProperties])

Параметры

Описание параметров процедуры ЗаполнитьЗначенияСвойств():

Имя параметра* Тип Описание
Приемник Произвольный Значение, чьи свойства будут заполнены значениями соответствующих свойств Источника.

Внимание! Значение данного параметра не может быть примитивного типа!

Источник Произвольный Значения свойств данного объекта будут установлены в соответствующие свойства Приемника.

Внимание! Значение данного параметра не может быть примитивного типа!

СписокСвойств Строка Ограничивает список имен свойств которые необходимо заполнить. Имена свойств указываются через запятую. Если параметр опущен, то копируются только те свойства, которые представлены одновременно и в Источнике, и в Приемнике.
ИсключаяСвойства Строка Список имен свойств Приемника, разделенный запятыми, которые необходимо исключить из заполнения.  Если свойства, указанного в параметре не окажется в Приемнике, будет вызвано исключение.
*Жирным шрифтом выделены обязательные параметры

Описание

Процедура ЗаполнитьЗначенияСвойств() Копирует свойства одного объекта в одноименные свойства другого. Сопоставление свойств производится по именам. Если указан параметр СписокСвойств, то в заполнении участвуют только они, параметр ИсключаяСвойства игнорируется. В противном случае, если указан параметр ИсключаяСвойства, свойства перечисленные в нем, исключаются из обработки.

Доступность

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).

Пример использования

Пример кода с использованием процедуры ЗаполнитьЗначенияСвойств():

Источник = Новый Структура("Наименование,Код", "Стул деревянный", 1);
Получатель = Новый Структура("Наименование,Код");
ЗаполнитьЗначенияСвойств(Получатель, Источник);
Сообщить(Получатель.Наименование + " [" + Получатель.Код + "]");
//Стул деревянный [1]

ЗаполнитьЗначенияСвойств(Получатель, Источник, "Наименование");
Сообщить(Получатель.Наименование + " [" + Получатель.Код + "]");
//Стул деревянный []

ЗаполнитьЗначенияСвойств(Получатель, Источник, , "Код");
Сообщить(Получатель.Наименование + " [" + Получатель.Код + "]");
//Стул деревянный []

Поделиться страницей в соц.сетях

Я отвечу так:

Глобальный контекст (Global context)
ЗаполнитьЗначенияСвойств (FillPropertyValues)
Синтаксис:

ЗаполнитьЗначенияСвойств(<Приемник>, <Источник>, <СписокСвойств>, <ИсключаяСвойства>)
Параметры:

<Приемник> (обязательный)

Тип: Произвольный.
Значение, чьи свойства будут заполнены значениями соответствующих свойств <Источника>.
<Источник> (обязательный)

Тип: Произвольный.
Значения свойств данного объекта будут установлены в соответствующие свойства <Приемника>.
<СписокСвойств> (необязательный)

Тип: Строка.
Список имен свойств, разделенный запятыми, которые необходимо заполнить.
Если свойства не указаны, то копируются только те, которые представлены и в <Источнике> и в <Приемнике>.
Если свойства указаны, то они обязательно должны присутствовать в обоих объектах.
Если в <Источнике> или <Приемнике> заданное свойство отсутствует, то будет вызвано исключение.
<ИсключаяСвойства> (необязательный)

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

Копирует значения свойств <Источника> в свойства <Приемника>. Сопоставление производится по именам свойств.
Если указаны копируемые свойства, то в заполнении участвуют только они, параметр <ИсключаяСвойства> игнорируется.
В противном случае, если указан параметр <ИсключаяСвойства>, то свойства перечисленные в нем, исключаются из обработки.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.

Добавлено через 12 минут

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
    
    ЧтоБудемЗАполнять = Объект; //Если реквизит объекта
    ЧтоБудемЗаполнять = ЭтаФорма; //Если реквизит формы
    
    Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
        ЗаполнитьНаСервере(ЧтоБудемЗАполнять); 
    КонецЕсли; 
    
КонецПроцедуры
 
&НаСервере
Процедура ЗаполнитьНаСервере(ЧтоЗаполнять)
 
    ЗаполнитьЗначенияСвойств(ЧтоЗаполнять,Объект.Контрагент);
 
КонецПроцедуры

Добавлено через 3 минуты
Забыл дописать:
Параметром только передавать нельзя…
Либо так

1C
1
ЗаполнитьЗначенияСвойств(Объект,Объект.Контрагент);

либо так

1C
1
ЗаполнитьЗначенияСвойств(ЭтаФорма,Объект.Контрагент);

Обязательно с директивой &наСЕРВЕРЕ

Как заполнить реквизиты формы при программном создании элемента справочника?

Как заполнить реквизиты формы при программном создании элемента справочника?
Я пытаюсь реализовать следующим способом, но значения не сохраняются.

Спецификации = ЗагрузкаРесурснойСпецификацииEPLAN();
	
	Для каждого Элемент Из Спецификации Цикл
		
		П = Новый Структура("Ключ", Элемент);
		
		Форма1 = ПолучитьФорму("Справочник.РесурсныеСпецификации.Форма.ФормаЭлемента",П);

		ЗаполнитьЗначенияСвойств(Форма1,Форма1.Объект);
		Форма1.ОсновноеИзделиеНоменклатура = Форма1.Объект.ОсновноеИзделиеНоменклатура; 
		Форма1.Модифицированность = Истина;
		Форма1.Записать();
		
	КонецЦикла;


  • Вопрос задан

    более года назад

  • 1055 просмотров

Пригласить эксперта

Что-то Вы мутите воду. Какую цель преследуете? Реквизиты формы интересны только если вы хотите с формой работать. Например, перед её открытием что-то проинициализировать. А тут вы будто пытаетесь через форму изменить реквизиты элемента. Вопрос ставьте по другому, что именно Вам нужно, какую цель преследуете?

P.S. «Правильно поставленный вопрос — уже половина ответа». (c)


  • Показать ещё
    Загружается…

24 мар. 2023, в 16:28

40000 руб./за проект

24 мар. 2023, в 16:23

7000 руб./за проект

24 мар. 2023, в 16:19

1000 руб./за проект

Минуточку внимания

Приемы и хитрости для того, чтобы заполнять сложные объекты с помощью одной строки программного кода.

Если вы занимаетесь разработкой в системе 1С:Предприятие 8, то наверняка знаете про функцию ЗаполнитьЗначенияСвойств(), с помощью которой можно очень быстро заполнить достаточно большие объекты. Причем объекты самые разные — структуры, таблицы и деревья значений, справочники, документы и др.

При параллельной разработке в предыдущей версии — 1С:Предприятии 7.7, когда приходится писать большие объемы программного кода, остро приходит понятие — какой же удобной функции не хватает.

Попробуем это исправить!

Итак, сценарий следующий — нужно заставить работать функцию ЗаполнитьЗначенияСвойств() в правилах конвертации, которые можно разработать с помощью 1С:Конвертация данных, ред. 2.1. Оговоримся — источником должна быть конфигурация на платформе 1С:Предприятие 7.7. Важно знать, что алгоритмы, которые разрабатываются с помощью конвертации, реализованы в виде функций, которые затем будут перенесены в обработку выгрузки. Исходя из этого, приступим.

Создаем алгоритмы

РазложитьСтрокуВМассивПодстрок

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

РазложитьСтрокуВМассивПодстрок

Стр		= ИсходящиеДанные;
Разделитель	= ?(ЗначениеЗаполнено(ВходящиеДанные) = 1, ВходящиеДанные, ",");

Результат = СоздатьОбъект("СписокЗначений");

Если ПустаяСтрока(ИсходящиеДанные) = 1 Тогда 
	
	Возврат Результат;
	
ИначеЕсли Найти(ИсходящиеДанные, Разделитель) = 0 Тогда
	
	Результат.ДобавитьЗначение(ИсходящиеДанные);
	
	Возврат Результат;
	
КонецЕсли;                                  

Если Разделитель = " " Тогда
	
	Стр = СокрЛП(Стр);
	
	Пока 1=1 Цикл
		
		Поз = Найти(Стр, Разделитель);
		
		Если Поз=0 Тогда
			
			Результат.ДобавитьЗначение(СокрЛП(Стр));
			Возврат Результат;
			
		КонецЕсли;
		
		Результат.ДобавитьЗначение(СокрЛП(Лев(Стр, Поз-1)));
		Стр = СокрЛ(Сред(Стр, Поз));
		
	КонецЦикла;
	
Иначе
	
	ДлинаРазделителя = СтрДлина(Разделитель);
	
	Пока 1=1 Цикл
		
		Поз = Найти(Стр, Разделитель);
		
		Если Поз=0 Тогда
			
			Результат.ДобавитьЗначение(СокрЛП(Стр));
			Возврат Результат;
			
		КонецЕсли;
		
		Результат.ДобавитьЗначение(СокрЛП(Лев(Стр, Поз-1)));
		Стр = Сред(Стр,Поз+ДлинаРазделителя);
		
	КонецЦикла;
	
КонецЕсли;

Возврат Результат;

ЗаполнитьЗначенияСвойств

Рабочий алгоритм. Синтаксис — тот же, что и в 1С:Предприятии 8, позволяет заполнять справочники, документы, списки и таблицы значений.

ЗаполнитьЗначенияСвойств.png

// Выполняет заполнение приемника по данным источника.
//
//	Параметры:
//		ДанныеПриемник - Произвольный, справочник, документ, список значений, индексированная таблица или таблица значений.
//		ДанныеИсточник - Произвольный, справочник, документ, список значений, индексированная таблица или таблица значений.
//		СписокСвойствСтрока - Строка, список свойств, разделенных запятыми.
//		ИсключаяСвойстваСтрока - Строка, список исключаемых свойств, разделенных запятыми.
//
//	Возвращаемое значение:
//		Число, 1 - если заполнение выполнено успешно, 0 - не удалось выполнить заполнение.

ДанныеПриемник			= ИсходящиеДанные;
ДанныеИсточник			= ВходящиеДанные;
СписокСвойствСтрока		= Источник;
ИсключаяСвойстваСтрока	= Приемник;

ТипКоллекцииПриемник = ТипЗначенияСтр(ДанныеПриемник);
ТипКоллекцииИсточник = ТипЗначенияСтр(ДанныеИсточник);

///////////////////////////////////////////////////////////////////////////////
// Список свойств коллекции

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

ТипКоллекцииПоставщик = ТипЗначенияСтр(КоллекцияПоставщикСвойств);

ПоляКоллекции = СоздатьОбъект("СписокЗначений");

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

///////////////////////////////////////////////////////////////////////////////
// Заполнение источника данными приемника

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

Возврат 1;

Пример

Вот и все. Теперь метод ЗаполнитьЗначенияСвойств() будет доступен в любых обработчиках разрабатываемых правил.

ТаблицаИсточник = СоздатьОбъект("ТаблицаЗначений");
ТаблицаИсточник.НоваяКолонка("Контрагент");
ТаблицаИсточник.НоваяКолонка("Договор");
ТаблицаИсточник.НоваяКолонка("Сумма");

ТаблицаИсточник.НоваяСтрока();

ТаблицаИсточник.Контрагент = "Иванов";
ТаблицаИсточник.Договор = "Договор №1 от 01.02.2014";
ТаблицаИсточник.Сумма = 1000;

ТаблицаПриемник = СоздатьОбъект("ТаблицаЗначений");
ТаблицаПриемник.НоваяКолонка("Контрагент");
ТаблицаПриемник.НоваяКолонка("Договор");
ТаблицаПриемник.НоваяКолонка("Сумма");
ТаблицаПриемник.НоваяКолонка("Задолженность");

ТаблицаПриемник.НоваяСтрока();
ЗаполнитьЗначенияСвойств(ТаблицаПриемник, ТаблицаИсточник,, "Сумма,Договор");

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

Заполнение табличной части 1С 8.3

Очень часто встречается задача заполнить табличную часть какими-нибудь  значениями, например результатом выполнения запроса.  Для демонстрации реализуем пример, в котором выполняется заполнение табличной части. Сделаем небольшую учебную задачу: будем заполнять табличную часть документа всей номенклатурой, которая не помечена на удаление. Количество при этом будет равно 1. Для заполнения табличной части документа нам необходимо работать с  одноименной таблицей реквизита Объект, который является основным реквизитом управляемой формы.

Табличная часть реквизита Объект

Поскольку по условиям задачи, необходимо отобрать всю не помеченную на удаление номенклатуру, то оптимально это сделать при помощи запроса, в котором я буду получать все не помеченные элементы справочника номенклатура. Я создал команду, при выполнении которой будет заполняться табличная часть, и разместил её на форме.

Команда 1С и размещение её на форме

Исполнение команды будет выполняться в серверном контексте, поскольку объект Запрос не работает в клиентском контексте на тонком клиенте.

&НаСервере
Процедура ЗаполнитьТоварамиНаСервере()

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

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

&НаКлиенте
Процедура ЗаполнитьТоварами(Команда)
    ЗаполнитьТоварамиНаСервере();
КонецПроцедуры

При обходе запроса, я использую метод Добавить табличной части объекта (вообще это метод объекта, который имеет тип ДанныйФормыКоллекция, именно в этот тип преобразуется табличная часть документа-объекта, при создании на сервере). Данный метод является функцией, которая создаёт и возвращает новую строку.

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

Очистка табличной части документа 1С 8.3

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

Объект.СписокТоваров.Очистить();

После выполнения этого метода вся табличная часть будет очищена.

Текущая строка табличной части 1С 8.3

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

Текущая строка табличной части 1С 8.3

Например, может возникать ситуация, что мы редактируем какое-нибудь поле текущей строки таблицы на форме, и нам нужно, чтобы было пересчитано другое поле  (или несколько полей) этой текущей строки. Например, мы изменяем цену (или количество) нашей табличной части, и необходимо, чтобы сумма автоматически была пересчитана.

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

Возврат полей свойством ТекущиеДанные

Для того, чтобы отработать изменение текущего поля цены, создадим обработчик события ПриИзменении этого поля.

Обработчик ПриИзменении поля таблицы формы

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

&НаКлиенте
Процедура СписокТоваровЦенаПриИзменении(Элемент)
	ТекДанные = Элементы.СписокТоваров.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат; //если пустая таблица
	КонецЕсли;
	ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена;
КонецПроцедуры

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

&НаКлиенте
Процедура УмножитьНа2(Команда)
    ТекДанные = Элементы.СписокТоваров.ТекущиеДанные;
    Если ТекДанные = Неопределено Тогда
        Возврат; //если пустая таблица
    КонецЕсли;
    ТекДанные.Количество = ТекДанные.Количество * 2;
    ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена;
КонецПроцедуры

Теперь доработаем этот пример: после увеличения текущей строки будем сдвигать текущую строку на строку вниз. Для этого допишем предыдущий код:

Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока;
ИдентификторСлед = Идентификтор + 1;

Если ИдентификторСлед < Объект.СписокТоваров.Количество() Тогда
    Элементы.СписокТоваров.ТекущаяСтрока = ИдентификторСлед;
КонецЕсли;

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

Также при помощи текущей строки можно находить аналогичную строку в соответствующей табличной части основного реквизита формы Объект, которую также можно изменять (строка на форме тоже изменится автоматически). Мы ранее сделали пересчет суммы при изменении цены, теперь сделаем пересчет суммы при изменении количества, но напрямую через реквизит Объект.

&НаКлиенте
Процедура СписокТоваровКоличествоПриИзменении(Элемент)
    Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока;
    Если Идентификтор = Неопределено Тогда
        Возврат;
    КонецЕсли;
    ТекСтрока = Объект.СписокТоваров.НайтиПоИдентификатору(Идентификтор);
    Если ТекСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;
    ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.Количество;
КонецПроцедуры

В этом коде мы используем метод НайтиПоИдентификатору переменной Объект.СписокТоваров, которая имеет типа ДанныйФормыКоллекция, этот метод получает элемент коллекции по указанному идентификатору. Если этот элемент найден, то мы можем с ними работать, причем данные на форме изменяться автоматически.

Обход табличной части 1С

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

&НаКлиенте
Процедура УмножитьВсеНа2(Команда)

    ТабОбх = Объект.СписокТоваров;
    Для Каждого стрТабл из ТабОбх Цикл
        стрТабл.Количество = стрТабл.Количество * 2;
        стрТабл.Сумма = стрТабл.Цена * стрТабл.Количество;
    КонецЦикла;

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

Остальные статьи по теме конфигурирования в 1С:

Конфигурирование табличный частей объектов 1С

Справочники в 1С 8.3

Документы в 1С 8.3

Предопределенные элементы справочников 1С

Формы справочников в 1С 8.3

Более подробно и основательно конфигурирование в 1С дается в моей книге:

Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

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

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

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

  Маркет42 - Место для твоих разработок  

Быстрое заполнение данных формы из параметров

Я
   trey1

08.06.17 — 11:23

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

    КА = Параметры.КА;

    КА1 = Параметры.КА1;

получается громоздко, есть ли какой то более изящный способ? ЗаполнитьЗначенияСвойств() не работает.

Все имена реквизитов в подчиненной форме и ключей в структуре для проброса параметров сделал одинаковыми.

  

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

   Ц_У

1 — 08.06.17 — 11:24

ЗаполнитьЗначенияСвойств() не работает.

(0) Почему?

   cw014

2 — 08.06.17 — 11:27

(1) Сломал видимо

   trey1

3 — 08.06.17 — 11:29

(1) Ругается на несоответствие типов

   trey1

4 — 08.06.17 — 11:31

Дело в том, что открывается общая форма, как как-такового «Объекта» нет, только реквизиты, т.е ЗаполнитьЗначенияСвойств(объект,Параметры ) думаю заработает но не в моем случае

   Гипервизор

5 — 08.06.17 — 11:53

(4) Неправда ваша. Параметры это структура?

Вполне себе работает.

Форма = ПолучитьОбщуюФорму(«МояФорма»);

ЗаполнитьЗначенияСвойств(Форма, Параметры);

Форма.Открыть();

   trey1

6 — 08.06.17 — 13:01

(5) Фигня в том, что это работает только в толстом клиенте

   Cyberhawk

7 — 08.06.17 — 13:19

Не понял, в чем проблема-то?

Что значит

«КА = Параметры.КА;

    КА1 = Параметры.КА1;

громоздко?»

   Ц_У

8 — 08.06.17 — 13:29

(6) Не верю! (с)

Месье знает толк в извращениях:

Для Каждого ПараметрСтуктуры ИЗ Параметры Цикл

<ТутТипоОбъект[ПараметрСтуктуры.Ключ]> = ПараметрСтуктуры.Значение;

КонецЦикла;

   Лефмихалыч

9 — 08.06.17 — 13:31

(0) ЗаполнятьИзДанныхЗаполнения включи у нужных реквизитов

  

cw014

10 — 08.06.17 — 13:32

(6) С чего это вдруг?

TurboConf — расширение возможностей Конфигуратора 1С

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