Перем мМакетныйОбъект;
Перем мТекущаяГруппаТипаМетаданных;
Перем мСоответствиеСтрокДереваИМетаданных;
Перем мВыборкаРезультата;
Перем мРезультатЗапроса;
Перем мВыбранныеУзлы;
Перем мМетаданныеПланаОбмена;
Перем мДанныеПоКоличествуИзменений;
Перем мВнутреннееИмяТаблицы;
Перем мИменаПлановОбмена;
Перем мСтруктураХраненияСРазмерами;

Процедура ОбновитьКоличествоДляСтрокиДерева(СтрокаДерева = Неопределено)
	
	Если СтрокаДерева = Неопределено Тогда
		СтрокаДерева = ЭлементыФормы.ДеревоТаблиц.ТекущаяСтрока;
	КонецЕсли; 
	КолонкиКоличества = Новый Массив();
	КолонкиКоличества.Добавить("КоличествоЗарегистрированных");
	КолонкиКоличества.Добавить("КоличествоВыгруженных");
	КолонкиКоличества.Добавить("КоличествоНевыгруженных");
	Для Каждого ИмяКолонкиКоличества Из КолонкиКоличества Цикл
		СтароеКоличество = СтрокаДерева[ИмяКолонкиКоличества];
		СтрокаДерева[ИмяКолонкиКоличества] = 0;
		Для Каждого ЭлементПакета Из мДанныеПоКоличествуИзменений Цикл
			СтрокиРезультата = ЭлементПакета.НайтиСтроки(Новый Структура("ПолноеИмя", СтрокаДерева.ПолноеИмя));
			Для Каждого СтрокаРезультата Из СтрокиРезультата Цикл
				Если мВыбранныеУзлы.Найти(СтрокаРезультата.Узел) = Неопределено Тогда
					Продолжить;
				КонецЕсли; 
				СтрокаДерева[ИмяКолонкиКоличества] = СтрокаДерева[ИмяКолонкиКоличества] + СтрокаРезультата[ИмяКолонкиКоличества];
			КонецЦикла;
		КонецЦикла;
		Родитель = СтрокаДерева.Родитель;
		Пока Родитель <> Неопределено Цикл
			Родитель[ИмяКолонкиКоличества] = Родитель[ИмяКолонкиКоличества] - СтароеКоличество + СтрокаДерева[ИмяКолонкиКоличества];
			Родитель = Родитель.Родитель;
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры

Процедура ПостроитьДеревоОбменаДанных(ДеревоТаблиц)
	
	ДеревоТаблиц.Строки.Очистить();
	мСоответствиеСтрокДереваИМетаданных.Очистить();
	//Если мМетаданныеПланаОбмена = Неопределено Тогда
	//	Возврат;
	//КонецЕсли; 
	ТаблицаВсехТаблиц = ирКэш.ПолучитьТаблицуВсехТаблицБДЛкс();
	СтрокиМетаОбъектов = ирКэш.Получить().ТаблицаТиповМетаОбъектов.НайтиСтроки(Новый Структура("Категория", 0));
	ИндикаторТипов = ирОбщий.ПолучитьИндикаторПроцессаЛкс(СтрокиМетаОбъектов.Количество(), "Типы метаданных");
	Для Каждого ТипМетаОбъектов Из СтрокиМетаОбъектов Цикл
		ирОбщий.ОбработатьИндикаторЛкс(ИндикаторТипов);
		Единственное = ТипМетаОбъектов.Единственное;
		Если Ложь
			Или Единственное = "КритерийОтбора"
			Или Единственное = "ЖурналДокументов"
			Или Единственное = "ВнешнийИсточникДанных"
		Тогда
			Продолжить;
		КонецЕсли;
		СтрокаДерева = ДеревоТаблиц.Строки.Добавить();
		СтрокаДерева.Имя = ТипМетаОбъектов.Единственное;
		СтрокаДерева.Представление = ирОбщий.ПолучитьПредставлениеИзИдентификатораЛкс(ТипМетаОбъектов.Множественное);
		СтрокаДерева.ПолноеИмя = ТипМетаОбъектов.Единственное;
		СтруктураДанных = Новый Структура();
		СтруктураДанных.Вставить("ОписаниеТипа", ТипМетаОбъектов);
		СтруктураДанных.Вставить("СтрокаДерева", СтрокаДерева);
		мСоответствиеСтрокДереваИМетаданных[ТипМетаОбъектов.Единственное] = СтруктураДанных;
		Если Единственное = "Перерасчет" Тогда
			КоллекцияПредков = Метаданные.РегистрыРасчета;
		Иначе
			КоллекцияПредков = Новый Массив;
			КоллекцияПредков.Добавить(Метаданные);
		КонецЕсли; 
		Для Каждого МетаданныеОбъектаПредка Из КоллекцияПредков Цикл
			ИндикаторОбъекта = ирОбщий.ПолучитьИндикаторПроцессаЛкс(МетаданныеОбъектаПредка[ТипМетаОбъектов.Множественное].Количество(), ТипМетаОбъектов.Множественное);
			Для Каждого МетаданныеОбъекта Из МетаданныеОбъектаПредка[ТипМетаОбъектов.Множественное] Цикл
				ирОбщий.ОбработатьИндикаторЛкс(ИндикаторОбъекта);
				МетаданныеОбъектаПредка = МетаданныеОбъекта;
				ПолноеИмяМД = МетаданныеОбъекта.ПолноеИмя();
				Если ЗначениеЗаполнено(ИмяПланОбмена) Тогда
					ЭлементСостава = мМетаданныеПланаОбмена.Состав.Найти(МетаданныеОбъекта);
					Если Ложь
						Или ЭлементСостава = Неопределено
						Или (Истина
							И ОтображатьТолькоТаблицыСАвторегистрацией
							И ЭлементСостава.Авторегистрация <> АвтоРегистрацияИзменений.Разрешить)
					Тогда
						Продолжить;
					КонецЕсли; 
				Иначе
					ИмяТаблицыИзменений = ирОбщий.ПолучитьИмяТаблицыИзМетаданныхЛкс(ПолноеИмяМД, Истина, Ложь);
					//ОписаниеТаблицыИзменений = ТаблицаВсехТаблиц.НайтиСтроки(Новый Структура("НПолноеИмя, Тип", НРег(ИмяТаблицыИзменений), "Изменения"));
					ОписаниеТаблицыИзменений = ТаблицаВсехТаблиц.НайтиСтроки(Новый Структура("НПолноеИмя", НРег(ИмяТаблицыИзменений)));
					Если ОписаниеТаблицыИзменений.Количество() = 0 Тогда
						Продолжить;
					КонецЕсли; 
				КонецЕсли; 
				ИмяТаблицыБД = ирОбщий.ПолучитьИмяТаблицыИзМетаданныхЛкс(ПолноеИмяМД, , Ложь);
				ОписаниеТаблицы = ТаблицаВсехТаблиц.Найти(НРег(ИмяТаблицыБД), "НПолноеИмя");
				Если ИмяТаблицыБД = "Константы" Тогда
					// Для 8.2.13 и ниже
					ИмяТаблицыБД = ПолноеИмяМД;
					ОписаниеТаблицы = Новый Структура("Имя, Представление, Тип", МетаданныеОбъекта.Имя, МетаданныеОбъекта.Представление(), "Константа");
				КонецЕсли; 
				//ЭлементСоответствия = мСоответствиеСтрокДереваИМетаданных[ОписаниеТаблицы.Тип];
				//Если ЭлементСоответствия = Неопределено Тогда
				//	//СообщитьОшибкуИис("Невозможно определить тип объекта: " + Строка(МетаданныеОбъекта));
				//	Продолжить;
				//КонецЕсли;
				//СтрокаДерева = ЭлементСоответствия.СтрокаДерева;
				СтрокаДобавления = СтрокаДерева.Строки.Добавить(); 
				СтрокаДобавления.Имя = ОписаниеТаблицы.Имя;
				СтрокаДобавления.Представление = ОписаниеТаблицы.Представление;
				СтрокаДобавления.ПолноеИмя = ИмяТаблицыБД;
				СтрокаДобавления.КоличествоЗарегистрированных = 0;
				Для Каждого лИмяПланаОбмена Из мИменаПлановОбмена Цикл
					ЭлементСостава = Метаданные.ПланыОбмена[лИмяПланаОбмена].Состав.Найти(МетаданныеОбъекта);
					Если ЭлементСостава <> Неопределено Тогда
						СтрокаДобавления["Авторегистрация_" + лИмяПланаОбмена] = ЭлементСостава.АвтоРегистрация = АвтоРегистрацияИзменений.Разрешить;
					КонецЕсли; 
				КонецЦикла; 
			КонецЦикла;
			ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
		КонецЦикла;
	КонецЦикла;
	ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
	МетаданныеОбъекта = Неопределено;
	СтрокиКУдалению = Новый Массив;
	Для Каждого СтрокаТипаМетаданных Из ДеревоТаблиц.Строки Цикл
		Если СтрокаТипаМетаданных.Строки.Количество() = 0 Тогда
			СтрокиКУдалению.Добавить(СтрокаТипаМетаданных);
		КонецЕсли; 
	КонецЦикла;
	Для Каждого СтрокаКУдалению Из СтрокиКУдалению Цикл
		ДеревоТаблиц.Строки.Удалить(СтрокаКУдалению);
	КонецЦикла;

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

Функция ОбновитьСтатистикуВСоставеПланаОбмена()

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

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

Процедура ОбновитьИтогиПоУзлам()

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

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

//Функция по имени родителя предка формируется префикс типа
Функция СформироватьПрефиксТипаСсылки(Знач НаименованиеПредка)
	
	Если НаименованиеПредка = "Справочники" Тогда
		Возврат "СправочникСсылка";
	ИначеЕсли НаименованиеПредка = "Документы" Тогда
		Возврат "ДокументСсылка";
	ИначеЕсли НаименованиеПредка = "ПланыВидовХарактеристик" Тогда
		Возврат "ПланВидовХарактеристикСсылка";
	ИначеЕсли НаименованиеПредка = "ПланыСчетов" Тогда
		Возврат "ПланСчетовСсылка";
	ИначеЕсли НаименованиеПредка = "ПланыВидовРасчета" Тогда
		Возврат "ПланВидовРасчетаСсылка";
	ИначеЕсли НаименованиеПредка = "БизнесПроцессы" Тогда
		Возврат "БизнесПроцессСсылка";
	ИначеЕсли НаименованиеПредка = "Задачи" Тогда
		Возврат "ЗадачаСсылка";
	Иначе
		Возврат "";
	КонецЕсли;
	
КонецФункции

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

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

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

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

Функция ИзменитьРегистрациюЦелойТаблицы(СтрокаДерева, НовоеЗначениеРегистрации)

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

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

// для узла обмена показывает зарегистрированные изменения
Процедура КоманднаяПанельДереваОбъектовОбновить(Кнопка)
	
	ЗаказатьОбновлениеДереваПослеИзмененияРегистрации();
		
КонецПроцедуры

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

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

Функция ПолучитьИндексКартинкиПоМетаданным(УровеньДерева, ДанныеСтроки)
	
	Если УровеньДерева = 0 Тогда
		СтрокаСоответствия = мСоответствиеСтрокДереваИМетаданных[ДанныеСтроки.Имя];
		Возврат СтрокаСоответствия.ОписаниеТипа.ИндексКартинкиМножественное;
	ИначеЕсли УровеньДерева = 1 Тогда
		СтрокаСоответствия = мСоответствиеСтрокДереваИМетаданных[ДанныеСтроки.Родитель.Имя];
		Возврат СтрокаСоответствия.ОписаниеТипа.ИндексКартинкиЕдинственное;
	КонецЕсли;
	
КонецФункции

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

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

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

//Процедура удаляет все строки дерева у которых уровень не меньше 2
Процедура УдалитьКонечныеЭлементыДерева(ДеревоДанных)
	
	Если ДеревоДанных.Уровень() >= 1 Тогда
		
		ДеревоДанных.Строки.Очистить();
		
	Иначе
		
		Для Каждого СтрокаДерева Из ДеревоДанных.Строки Цикл
			
			УдалитьКонечныеЭлементыДерева(СтрокаДерева);
			
		КонецЦикла;
		
	КонецЕсли;
	
КонецПроцедуры

// удаление регистрации изменений
Процедура КоманднаяПанельДереваОбъектовОтменитьРегистрациюИзменения(Кнопка)
	
	ДобавитьУдалитьРегистрациюДляВыбранныхОбъектовМД(Ложь);
		
КонецПроцедуры

//Функция возвращает данные для регистрации изменений
Функция ПолучитьДанныеДляРегистрацииИзменений(ПолноеИмяМД)
	
	// не для всех типов позволяем список объектов для регистрации редактировать
	Если мТекущаяГруппаТипаМетаданных = "Ссылочный" Тогда
		ФормаРедактированияОбъектов = ПолучитьФорму("ФормаВыбораОбъектовДляРегистрации", ЭтаФорма);
		МассивТипов = Новый Массив();
		МассивТипов.Добавить(Тип(ирОбщий.ИмяТипаИзПолногоИмениТаблицыБДЛкс(ПолноеИмяМД)));
		ФормаРедактированияОбъектов.ОписаниеТиповРедактированияСписка = Новый ОписаниеТипов(МассивТипов);
		РезультатОткрытия = ФормаРедактированияОбъектов.ОткрытьМодально();
		Если РезультатОткрытия <> Истина Тогда
			Возврат Неопределено;
		КонецЕсли;
		СписокРедактирования = ФормаРедактированияОбъектов.СписокРедактирования;
		
		// Избавляемся от пустых ссылок, т.к. они приводят к глобальной регистрации всех данных
		НачальноеКоличество = СписокРедактирования.Количество(); 
		Для СчетчикСписокРедактирования = 1 По НачальноеКоличество Цикл
			ЭлементСписка = СписокРедактирования[НачальноеКоличество - СчетчикСписокРедактирования];
			Если Не ЗначениеЗаполнено(ЭлементСписка.Значение) Тогда
				СписокРедактирования.Удалить(ЭлементСписка);
			КонецЕсли;
		КонецЦикла;
		
		// ничего не выбрали для регистрации
		Если СписокРедактирования.Количество() = 0 Тогда 
			Возврат Неопределено;
		КонецЕсли;
		
	КонецЕсли;	

	Возврат СписокРедактирования;
	
КонецФункции

// добавить регистрацию
Процедура КоманднаяПанельДереваОбъектовДобавитьРегистрацию(Кнопка)
	
	ДобавитьУдалитьРегистрациюДляВыбранныхОбъектовМД(Истина);
	
КонецПроцедуры

//Функция регистрирует изменнения для всего дерева объектов
Функция ИзменитьРегистрациюИзмененийНаВыбранныхУзлахДляВсегоСоставаПланаОбмена(НовоеЗначение = Истина)
	
	Если мВыбранныеУзлы.Количество() = 0 Тогда
		Предупреждение("Сначала необходимо выбрать узлы");
		Возврат Ложь;
	КонецЕсли; 
	ФормаВопроса = ПолучитьФорму("ФормаВыбораОбновленияРегистрации", ЭтаФорма);
	Если НовоеЗначение Тогда
		ФормаВопроса.ТекстВопросаПользователю = "Операция регистрации всех изменений необратима, Вы уверены, "
			+ "что хотите зарегистрировать изменения для выбранных узлов для ВСЕХ объектов, типы которых входят в план обмена?";
		Комментарий = "Добавление";
	Иначе
		ФормаВопроса.ТекстВопросаПользователю = "Операция удаления регистрации изменений необратима, Вы уверены, "
			+ "что хотите удалить регистрацию изменений для выбранных узлов для ВСЕХ объектов, типы которых входят в план обмена?";
		Комментарий = "Удаление";
	КонецЕсли; 
	РезультатОткрытия = ФормаВопроса.ОткрытьМодально();
	Если РезультатОткрытия <> Истина Тогда
		Возврат Ложь;
	КонецЕсли;
	мДанныеПоКоличествуИзменений = Неопределено;
	ТолькоДляОбъектовСАвтоматическойРегистрацией = ФормаВопроса.ОбновлятьТолькоДляЭлементовСАвтоРегистрацией;
	Если ТолькоДляОбъектовСАвтоматическойРегистрацией Тогда
		Комментарий = Комментарий + " регистрации всех авторегистрируемых типов данных";
	Иначе
		Комментарий = Комментарий + " регистрации всех типов данных";
	КонецЕсли; 
	Комментарий = Комментарий + ". " + ПредставлениеВыбранныхУзлов;
	ЗаписьЖурналаРегистрации("Изменение регистрации данных", УровеньЖурналаРегистрации.Предупреждение, мМетаданныеПланаОбмена,, Комментарий);
	Если НовоеЗначение Тогда
		Действие = "ЗарегистрироватьВсе";
	Иначе
		Действие = "УдалитьРегистрациюВсех";
	КонецЕсли; 
	ОбработатьВсеОбъектыМД(Действие, ТолькоДляОбъектовСАвтоматическойРегистрацией);
	Возврат Истина;
	
КонецФункции

// Похожа на ПолучитьКлючСтрокиТаблицыБДИзСтрокиТаблицыЗначенийЛкс
Функция ПолучитьОбъектДанныхПоСтрокеИзменений(СтрокаДанных = Неопределено)
	
	Если СтрокаДанных = Неопределено Тогда
		СтрокаДанных = ЭлементыФормы.ТаблицаИзменений.ТекущаяСтрока;
	КонецЕсли; 
	Если СтрокаДанных = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли; 
	Если мТекущаяГруппаТипаМетаданных = "Ссылочный" Тогда
		//Объект = СтрокаДанных.Ссылка.ПолучитьОбъект();
		СтруктураОбъекта = ирОбщий.ОбъектБДПоКлючуЛкс(СтрокаДанных.Ссылка.Метаданные().ПолноеИмя(), СтрокаДанных.Ссылка);
		Если СтруктураОбъекта.Методы.ЭтоНовый() Тогда
			СтруктураОбъекта = Новый УдалениеОбъекта(СтрокаДанных.Ссылка);
		КонецЕсли; 
	ИначеЕсли мТекущаяГруппаТипаМетаданных = "Регистр" Тогда
		СтруктураОбъекта = мМакетныйОбъект;
		// Антибаг 8.2.15 http://www.partners.v8.1c.ru/forum/thread.jsp?id=1034617#1034617
		//Объект.Отбор.Сбросить();
		Для Каждого Колонка Из ТаблицаИзменений.Колонки Цикл
			Если Ложь
				Или Колонка.Имя = "НомерСообщения"
				Или Колонка.Имя = "Узел"
			Тогда
				Продолжить;
			КонецЕсли; 
			ЭлементОтбора = мМакетныйОбъект.Методы.Отбор[Колонка.Имя];
			ирОбщий.ПрисвоитьЕслиНеРавноЛкс(ЭлементОтбора.Использование, Истина);
			ЭлементОтбора.Значение = СтрокаДанных[Колонка.Имя];
		КонецЦикла;
		СтруктураОбъекта.Методы.Прочитать();
	ИначеЕсли мТекущаяГруппаТипаМетаданных = "Константа" Тогда
		СтруктураОбъекта = мМакетныйОбъект;
		СтруктураОбъекта.Методы.Прочитать();
	КонецЕсли;
	Возврат СтруктураОбъекта;
	
КонецФункции


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

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

Процедура ВыполнитьРегистрациюРегистра(Знач ТипТаблицы, Знач ПолноеИмяТаблицы, УзлыДляРегистрации, КоличествоОбъектовКаждогоТипа = 1,
	ТолькоУзлыСАвторегистрацией = Ложь)
	
	КолонкаОтбора = "Регистратор";
	Если ТипТаблицы = "Перерасчет" Тогда
		КолонкаОтбора = "ОбъектПерерасчета";
	ИначеЕсли ТипТаблицы = "РегистрСведений" Тогда
		МетаданныеРегистра = ирОбщий.НайтиОбъектМетаданныхПоПолномуИмениТаблицыБДЛкс(ПолноеИмяТаблицы);
		Если МетаданныеРегистра.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый Тогда
			КолонкаОтбора = "";
			МассивКолонокОтбора = Новый Массив();
			Если МетаданныеРегистра.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда
				МассивКолонокОтбора.Добавить("Период");		
			КонецЕсли;
			Для Каждого КолонкаИзмерений Из МетаданныеРегистра.Измерения Цикл
				Если КолонкаИзмерений.ОсновнойОтбор = Истина Тогда
					МассивКолонокОтбора.Добавить(КолонкаИзмерений.Имя);	
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;		
	
	Запрос = Новый Запрос();
	СтрокаКолонокВыборкиДанных = "";
	Если КолонкаОтбора <> "" Тогда
		СтрокаКолонокВыборкиДанных = мВнутреннееИмяТаблицы + "." + КолонкаОтбора;
	Иначе
		Для Каждого ЭлементКолонки Из МассивКолонокОтбора Цикл
			СтрокаКолонокВыборкиДанных = СтрокаКолонокВыборкиДанных + "," + Символы.ПС + мВнутреннееИмяТаблицы + "." + ЭлементКолонки;
		КонецЦикла;
		СтрокаКолонокВыборкиДанных = СокрЛП(Сред(СтрокаКолонокВыборкиДанных, 2));
	КонецЕсли;
	
	// нет ни измерений, ни периодичности
	Если ПустаяСтрока(СтрокаКолонокВыборкиДанных) Тогда
		ирОбщий.ПланыОбменаИзменитьРегистрациюЛкс(УзлыДляРегистрации, МетаданныеРегистра, Истина, ИзменятьРегистрациюСДвижениями, ДвиженияВместеСПоследовательностями);
		Возврат;
	КонецЕсли;
	
	Запрос.Текст = "ВЫБРАТЬ Первые " + XMLСтрока(КоличествоОбъектовКаждогоТипа) + "
				   |	" + СтрокаКолонокВыборкиДанных + " 
				   |ИЗ
				   |	" + ПолноеИмяТаблицы + " КАК " + мВнутреннееИмяТаблицы;
				   
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл 
		СтруктураНаборЗаписей = ирОбщий.СоздатьНаборЗаписейПоИмениТаблицыБДЛкс(ПолноеИмяТаблицы);
		Если КолонкаОтбора <> "" Тогда 
			СтруктураНаборЗаписей.Методы.Отбор[КолонкаОтбора].Установить(Выборка[КолонкаОтбора]);
		Иначе
			Для Каждого ЭлементКолонки Из МассивКолонокОтбора Цикл
				СтруктураНаборЗаписей.Методы.Отбор[ЭлементКолонки].Установить(Выборка[ЭлементКолонки]);
			КонецЦикла;
		КонецЕсли;
		ирОбщий.ПланыОбменаИзменитьРегистрациюЛкс(УзлыДляРегистрации, СтруктураНаборЗаписей.Методы, Истина, ИзменятьРегистрациюСДвижениями, ДвиженияВместеСПоследовательностями);
	КонецЦикла;
	
КонецПроцедуры

Функция _ВыбратьУзелОбменаПоМетаданным()
	
	лИмяПланаОбмена = мМетаданныеПланаОбмена.Имя;
	Запрос = Новый запрос();
	Запрос.Текст = "ВЫБРАТЬ первые 2
	               |	ПланОбменаРезультат.Ссылка
	               |ИЗ
	               |	ПланОбмена." + лИмяПланаОбмена + " КАК ПланОбменаРезультат
	               |ГДЕ
	               |	ПланОбменаРезультат.ПометкаУдаления = Ложь
	               |	И ПланОбменаРезультат.Ссылка <> &ТекущийУзелОбмена";
	Запрос.УстановитьПараметр("ТекущийУзелОбмена", ПланыОбмена[лИмяПланаОбмена].ЭтотУзел());
	ТаблицаРезультата = Запрос.Выполнить().Выгрузить();
	Если ТаблицаРезультата.Количество() = 1 Тогда
		Возврат ТаблицаРезультата[0].Ссылка;
	Иначе
		Возврат ПланыОбмена[лИмяПланаОбмена].ПустаяСсылка();
	КонецЕсли;
	
КонецФункции

Процедура ПланОбменаПриИзменении(Элемент = Неопределено) Экспорт
	
	//Если Элемент <> Неопределено Тогда
	//	// Антибаг платформы 8.2.16 http://partners.v8.1c.ru/forum/thread.jsp?id=1077270#1077270
	//	Элемент.Значение = Элемент.Значение;
	//КонецЕсли; 
	Если Элемент = Неопределено Тогда
		Элемент = ЭлементыФормы.ИмяПланОбмена;
	КонецЕсли; 
	Узлы.Очистить();
	ТаблицаИзменений.Очистить();
	ДеревоТаблиц.Строки.Очистить();
	мМетаданныеПланаОбмена = Метаданные.ПланыОбмена.Найти(ИмяПланОбмена);
	мДанныеПоКоличествуИзменений = Неопределено;
	ЭтаФорма.РИБ = Ложь;
	Если ЗначениеЗаполнено(ИмяПланОбмена) Тогда
		ЭтаФорма.РИБ = мМетаданныеПланаОбмена.РаспределеннаяИнформационнаяБаза;
	КонецЕсли; 
	КПУзлыОбновить(, Истина);
	КП_ТаблицаИзмененийОбновить();
	//ПроверитьЗаполнитьИтогиТаблицыПоУзлам();
	ЭлементыФормы.ТаблицаИзменений.ТолькоПросмотр = Истина;
	ирОбщий.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма);
	
КонецПроцедуры

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

Процедура УдалитьРегистрациюДляВсехОбъектовНажатие(Элемент)
	
	ИзменитьРегистрациюИзмененийНаВыбранныхУзлахДляВсегоСоставаПланаОбмена(Ложь);
	
КонецПроцедуры

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

Процедура ЗарегистрироватьИзмененияПоОдномуОбъектуНажатие(Элемент)
	
	Если мВыбранныеУзлы.Количество() = 0 Тогда
		Предупреждение("Сначала необходимо выбрать узлы");
		Возврат;
	КонецЕсли; 
	КоличествоОбъектовКаждогоТипа = 1;
	Если Не ВвестиЗначение(КоличествоОбъектовКаждогоТипа, "Введите количество объектов каждого типа", Тип("Число")) Тогда 
		Возврат;
	КонецЕсли; 
	ФормаВопроса = ПолучитьФорму("ФормаВыбораОбновленияРегистрации", ЭтаФорма);
	ФормаВопроса.ТекстВопросаПользователю = "Операция регистрации одного изменения для каждого типа объектов необратима, Вы уверены, что хотите зарегистрировать изменения?";
	РезультатОткрытия = ФормаВопроса.ОткрытьМодально();
	Если РезультатОткрытия <> Истина Тогда
		Возврат;
	КонецЕсли;
	ОбработатьВсеОбъектыМД("ЗарегистироватьПервыеN", ФормаВопроса.ОбновлятьТолькоДляЭлементовСАвтоРегистрацией, КоличествоОбъектовКаждогоТипа);
		
КонецПроцедуры

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

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

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

Процедура ДеревоОбменаПередНачаломИзменения(Элемент, Отказ)
	
	Отказ = Истина;
	
КонецПроцедуры

Процедура ДеревоОбменаПриАктивизацииСтроки(Элемент = Неопределено)
	
	Если ЭтаФорма.ПоказыватьСодержимое Тогда
		КП_ТаблицаИзмененийОбновить();
	КонецЕсли; 
	
КонецПроцедуры

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

Процедура ОтображатьТолькоМетаданныеСИзменениямиПриИзменении(Элемент)
	
	ПостроитьДеревоСоставаПланаОбмена();

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

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

Процедура КП_ТаблицаИзмененийМенеджерТабличногоПоля(Кнопка)
	
	ирОбщий.ОткрытьМенеджерТабличногоПоляЛкс(ЭлементыФормы.ТаблицаИзменений, ЭтаФорма);
	
КонецПроцедуры

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

Процедура КП_ТаблицаИзмененийРедакторОбъектаБДЯчейки(Кнопка)
	
	ирОбщий.ОткрытьСсылкуЯчейкиВРедактореОбъектаБДЛкс(ЭлементыФормы.ТаблицаИзменений);
	
КонецПроцедуры

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

Процедура ЗагружатьИзмененияПриИзменении(Элемент)
	
	ПостроитьДеревоСоставаПланаОбмена();

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

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

	Если ВыбраннаяСтрока = Неопределено Тогда
		ВыбраннаяСтрока = ЭлементыФормы.ДеревоТаблиц.ТекущаяСтрока;
	КонецЕсли; 
	Если ЗначениеЗаполнено(ИмяПланОбмена) Тогда
		ТекстВыбор = "ВЫРАЗИТЬ(_Т.Узел КАК ПланОбмена." + ИмяПланОбмена + ")";
	Иначе
		ТекстВыбор = "_Т.Узел";
	КонецЕсли; 
	ТекстВыбор = ТекстВыбор + " КАК Узел, _Т.*";
	Если мТекущаяГруппаТипаМетаданных = "Ссылочный" Тогда
		ТекстВыбор = ТекстВыбор + ", ВЫБОР КОГДА ЕСТЬNULL(_Т.Ссылка.Ссылка, 0) = 0 ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК ОбъектУдален, _Т.Ссылка.ПометкаУдаления КАК ПометкаУдаления";
	КонецЕсли; 
	ТекстПервые = "";
	Если МаксимальнаяПорция > 0 Тогда
		ТекстПервые = " ПЕРВЫЕ " + Формат(МаксимальнаяПорция, "ЧГ=");
	КонецЕсли; 
	Построитель = Новый ПостроительЗапроса("ВЫБРАТЬ " + ТекстПервые + ТекстВыбор + " ИЗ " + ВыбраннаяСтрока.ПолноеИмя + ".Изменения КАК _Т АВТОУПОРЯДОЧИВАНИЕ");
	Построитель.ЗаполнитьНастройки();
	Для Каждого ДоступноеПоле Из Построитель.ДоступныеПоля Цикл
		Если ДоступноеПоле.Имя = "НомерСообщения" Тогда
			Продолжить;
		КонецЕсли; 
		Построитель.Порядок.Добавить(ДоступноеПоле.Имя, ДоступноеПоле.Имя);
	КонецЦикла;
	Если мТекущаяГруппаТипаМетаданных = "Ссылочный" Тогда
		ДоступноеПолеДата = Построитель.ДоступныеПоля.Ссылка.Поля.Найти("Дата");
		Если ДоступноеПолеДата <> Неопределено Тогда
			Построитель.ВыбранныеПоля.Добавить(ДоступноеПолеДата.ПутьКДанным, "Дата");
		КонецЕсли;
	КонецЕсли; 
	Построитель.ВыбранныеПоля.Удалить(Построитель.ВыбранныеПоля.Найти("Узел1"));
	Построитель.Порядок.Удалить(Построитель.Порядок.Индекс(Построитель.Порядок.Найти("Узел1")));
	//Если мВыбранныеУзлы.Количество() = 1 Тогда
	//	Построитель.ВыбранныеПоля.Удалить(Построитель.ВыбранныеПоля.Найти("Узел"));
	//	Построитель.Порядок.Удалить(Построитель.Порядок.Индекс(Построитель.Порядок.Найти("Узел")));
	//КонецЕсли; 
	ЭлементОтбора = Построитель.Отбор.Добавить("Узел");
	ЭлементОтбора.Использование = Истина;
	ЭлементОтбора.ВидСравнения = ВидСравнения.ВСписке;
	СписокУзлов = Новый СписокЗначений;
	Если ЭлементыФормы.ИтогиТаблицыПоУзлам.ТекущаяСтрока.Узел = "<Все>" Тогда
		СписокУзлов.ЗагрузитьЗначения(мВыбранныеУзлы);
	Иначе
		СписокУзлов.Добавить(ЭлементыФормы.ИтогиТаблицыПоУзлам.ТекущаяСтрока.Узел);
	КонецЕсли; 
	ЭлементОтбора.Значение = СписокУзлов;
	
	// Антибаг 8.2.14 http://partners.v8.1c.ru/forum/thread.jsp?id=1017264#1017264
	Если ирКэш.НомерВерсииПлатформыЛкс() >= 802014 Тогда
		Если мТекущаяГруппаТипаМетаданных = "Регистр" Тогда
			ОбъектМетаданных = ирОбщий.НайтиОбъектМетаданныхПоПолномуИмениТаблицыБДЛкс(ВыбраннаяСтрока.ПолноеИмя);
			Для Каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл
				ВыбранноеПоле = Построитель.ВыбранныеПоля.Найти(ОбщийРеквизит.Имя);
				Если Истина
					И ВыбранноеПоле <> Неопределено
					И ОбъектМетаданных.Измерения.Найти(ОбщийРеквизит.Имя) = Неопределено
				Тогда
					Если ирОбщий.ЛиОбщийРеквизитИспользуетсяВОбъектеМетаданныхЛкс(ОбщийРеквизит, ОбъектМетаданных) Тогда
						Построитель.ВыбранныеПоля.Удалить(ВыбранноеПоле);
					КонецЕсли; 
				КонецЕсли; 
			КонецЦикла; 
		КонецЕсли; 
	КонецЕсли;
	Возврат Построитель;

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

Процедура КП_ТаблицаИзмененийОбновить(Кнопка = Неопределено)
	
	ОбновитьИтогиПоТаблице();
	СтруктураТекущейСтроки = Неопределено;
	ТекущаяКолонка = ЭлементыФормы.ТаблицаИзменений.ТекущаяКолонка;
	Если ТекущаяКолонка <> Неопределено Тогда
		ТекущаяКолонка = ТекущаяКолонка.Данные;
	КонецЕсли; 
	ТекущаяСтрокаИзменений = ЭлементыФормы.ТаблицаИзменений.ТекущаяСтрока;
	Если ТекущаяСтрокаИзменений <> Неопределено Тогда
		СтруктураТекущейСтроки = Новый Структура();
		Если мТекущаяГруппаТипаМетаданных = "Ссылочный" Тогда
			СтруктураТекущейСтроки.Вставить("Ссылка", ТекущаяСтрокаИзменений.Ссылка);
		Иначе
			Для Каждого Колонка Из ТаблицаИзменений.Колонки Цикл
				Если Колонка.Имя = "НомерСообщения" Тогда
					Продолжить;
				КонецЕсли; 
				СтруктураТекущейСтроки.Вставить(Колонка.Имя, ТекущаяСтрокаИзменений[Колонка.Имя]);
			КонецЦикла; 
		КонецЕсли; 
	КонецЕсли; 
	ТаблицаИзменений.Очистить();
	ТаблицаИзменений.Колонки.Очистить();
	ВыбраннаяСтрока = ЭлементыФормы.ДеревоТаблиц.ТекущаяСтрока;
	Если ВыбраннаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	УровеньВыбраннойСтроки = ВыбраннаяСтрока.Уровень();
	ЭлементыФормы.ТаблицаИзменений.ТолькоПросмотр = (УровеньВыбраннойСтроки = 0);
	Если УровеньВыбраннойСтроки = 1 Тогда
		ОбновитьИтогиПоТаблице();
		ирОбщий.ПолучитьМакетныйОбъектДанныхТаблицыБДЛкс(ВыбраннаяСтрока.ПолноеИмя, мМакетныйОбъект, мТекущаяГруппаТипаМетаданных);
		Построитель = ПолучитьПостроительДляТаблицыИзменений();
		//ЧислоСтрокДляЗагрузки = ирОбщий.КонтрольРазмераВыборкиПользователемЛкс(Построитель);
		//Если ЧислоСтрокДляЗагрузки > 0 Тогда
		//	Построитель = ПолучитьПостроительДляТаблицыИзменений(, ЧислоСтрокДляЗагрузки);
		//КонецЕсли;
		//// http://partners.v8.1c.ru/forum/thread.jsp?id=1034151#1034151
		////МаксимальныйРазмер = 500000;
		////Построитель = ПолучитьПостроительДляТаблицыИзменений(, МаксимальныйРазмер);
		
		Состояние("Выборка содержимого таблицы изменений...");
		мРезультатЗапроса = Построитель.Результат;
		ирОбщий.ЗагрузитьВыборкуВТабличноеПолеПервуюПорциюЛкс(ЭтаФорма, мРезультатЗапроса, мВыборкаРезультата,
			ЭлементыФормы.КП_ТаблицаИзменений);
		Состояние("Подготовка данных таблицы изменений...");
		// Дорогая операция!
		ТаблицаИзменений = ирОбщий.ПолучитьТаблицуСКолонкамиБезТипаNullЛкс(ТаблицаИзменений,,, "НомерСообщения");
		Состояние("");
		Если мТекущаяГруппаТипаМетаданных = "Ссылочный" Тогда
			ТаблицаИзменений.Колонки.ОбъектУдален.Заголовок = "Объект удален";
			ТаблицаИзменений.Колонки.ПометкаУдаления.Заголовок = "Ссылка.Пометка удаления";
			Если ТаблицаИзменений.Колонки.Найти("Дата") <> Неопределено Тогда
				ТаблицаИзменений.Колонки.Дата.Заголовок = "Ссылка.Дата";
			КонецЕсли; 
		КонецЕсли; 
		ТаблицаИзменений.Колонки.НомерСообщения.Заголовок = "Номер сообщения";
	Иначе
		мРезультатЗапроса = Неопределено;
		мВыборкаРезультата = Неопределено;
		ОбновитьРазмерДинамическойТаблицы();
	КонецЕсли;
	ЭлементыФормы.ТаблицаИзменений.СоздатьКолонки();
	Для Каждого КолонкаТП Из ЭлементыФормы.ТаблицаИзменений.Колонки Цикл
		Если Ложь
			Или КолонкаТП.Имя = "НомерСообщения" 
			Или (Истина
				И мТекущаяГруппаТипаМетаданных = "Ссылочный"
				И КолонкаТП.Имя <> "Ссылка"
				И КолонкаТП.Имя <> "Узел")
		Тогда
			КолонкаТП.ТолькоПросмотр = Истина;
		Иначе
			КолонкаТП.ЭлементУправления.УстановитьДействие("ОкончаниеВводаТекста", Новый Действие("ПолеВводаКолонкиСсылка_ОкончаниеВводаТекста"));
		КонецЕсли;
		КолонкаТП.ЭлементУправления.УстановитьДействие("НачалоВыбора", Новый Действие("ПолеВводаТаблицыИзменений_НачалоВыбора"));
		КолонкаТП.ТекстШапки = ТаблицаИзменений.Колонки[КолонкаТП.Имя].Заголовок;
	КонецЦикла;
	КолонкаНомерСообщения = ЭлементыФормы.ТаблицаИзменений.Колонки.Найти("НомерСообщения");
	Если КолонкаНомерСообщения <> Неопределено Тогда
		ЭлементыФормы.ТаблицаИзменений.Колонки.Сдвинуть(КолонкаНомерСообщения, - ЭлементыФормы.ТаблицаИзменений.Колонки.Индекс(КолонкаНомерСообщения));
	КонецЕсли; 
	ЭлементыФормы.ТаблицаИзменений.ИзменятьСоставСтрок = мВыбранныеУзлы.Количество() > 0;
	Если ЭлементыФормы.ТаблицаИзменений.Колонки.Количество() > 0 Тогда
		ЭлементыФормы.ТаблицаИзменений.Колонки.Узел.Видимость = ЭлементыФормы.ИтогиТаблицыПоУзлам.ТекущаяСтрока.Узел = "<Все>";
		Если Не ЭлементыФормы.ТаблицаИзменений.Колонки.Узел.Видимость Тогда
			ЭлементыФормы.ТаблицаИзменений.ИзменятьСоставСтрок = ТаблицаИзменений.Колонки.Узел.ТипЗначения.СодержитТип(ТипЗнч(ЭлементыФормы.ИтогиТаблицыПоУзлам.ТекущаяСтрока.Узел));
		КонецЕсли; 
	КонецЕсли; 
	ЭлементыФормы.КП_ТаблицаИзменений.Кнопки.ПодборВТаблицуИзменений.Доступность = ЭлементыФормы.ТаблицаИзменений.ИзменятьСоставСтрок;
	Если СтруктураТекущейСтроки <> Неопределено Тогда
		НоваяСтруктураТекущейСтроки = Новый Структура();
		Для Каждого Колонка Из ТаблицаИзменений.Колонки Цикл
			Если Колонка.Имя = "НомерСообщения" Тогда
				Продолжить;
			КонецЕсли; 
			Если СтруктураТекущейСтроки.Свойство(Колонка.Имя) Тогда
				НоваяСтруктураТекущейСтроки.Вставить(Колонка.Имя, СтруктураТекущейСтроки[Колонка.Имя]);
			КонецЕсли; 
		КонецЦикла;
		НайденныеСтроки = ТаблицаИзменений.НайтиСтроки(НоваяСтруктураТекущейСтроки);
		Если НайденныеСтроки.Количество() > 0 Тогда
			НоваяТекущаяСтрока = НайденныеСтроки[0];
			Попытка
				ЭлементыФормы.ТаблицаИзменений.ТекущаяСтрока = НоваяТекущаяСтрока;
			Исключение
				// Если вызывано из ПриОкончанииРедактирования строки
			КонецПопытки; 
		КонецЕсли; 
	КонецЕсли; 
	Если ТекущаяКолонка <> Неопределено Тогда
		НоваяТекущаяКолонка = ЭлементыФормы.ТаблицаИзменений.Колонки.Найти(ТекущаяКолонка);
		Если НоваяТекущаяКолонка <> Неопределено И НоваяТекущаяКолонка.Видимость Тогда
			ЭлементыФормы.ТаблицаИзменений.ТекущаяКолонка = НоваяТекущаяКолонка;
		КонецЕсли; 
	КонецЕсли; 
	
КонецПроцедуры

Процедура ПолеВводаТаблицыИзменений_НачалоВыбора(Элемент, СтандартнаяОбработка)
	
	ирОбщий.ПолеВводаКолонкиРасширенногоЗначения_НачалоВыбораЛкс(ЭлементыФормы.ТаблицаИзменений, СтандартнаяОбработка,, Истина);

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

Процедура ГлавнаяКоманднаяПанельНовоеОкно(Кнопка)
	
	ирОбщий.ОткрытьНовоеОкноОбработкиЛкс(ЭтотОбъект);
	
КонецПроцедуры

Процедура ДействияФормыОПодсистеме(Кнопка)
	
	ирОбщий.ОткрытьСправкуПоПодсистемеЛкс(ЭтотОбъект);
	
КонецПроцедуры

Процедура ТаблицаИзмененийПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	ВыделенныеСтроки = ЭлементыФормы.ТаблицаИзменений.ВыделенныеСтроки;
	Если ВыделенныеСтроки.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	Ответ = Вопрос("Вы действительно хотите удалить регистрацию по " + ВыделенныеСтроки.Количество() + " изменениям?", РежимДиалогаВопрос.ОКОтмена);
	Если Ответ <> КодВозвратаДиалога.ОК Тогда
		Возврат;
	КонецЕсли;
	СтрокаДереваТекущихДанных = ЭлементыФормы.ДеревоТаблиц.ТекущиеДанные;
	СтрокаОбновления = ЭлементыФормы.ДеревоТаблиц.ТекущиеДанные;
	Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ВыделенныеСтроки.Количество(), "Удаление регистрации");
	НачальноеКоличество = ВыделенныеСтроки.Количество(); 
	Для СчетчикВыделенныеСтроки = 1 По НачальноеКоличество Цикл
		ВыделеннаяСтрока = ВыделенныеСтроки[НачальноеКоличество - СчетчикВыделенныеСтроки];
		ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
		КлючОбъекта = ПолучитьКлючОбъектаСтроки(ВыделеннаяСтрока);
		ирОбщий.ПланыОбменаИзменитьРегистрациюЛкс(ВыделеннаяСтрока.Узел, КлючОбъекта, Ложь);
		ТаблицаИзменений.Удалить(ВыделеннаяСтрока);
	КонецЦикла;
	ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
	ОбновитьИтогиПоТаблице();
	//КП_ТаблицаИзмененийОбновить();

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

Процедура ТаблицаИзмененийПередНачаломИзменения(Элемент, Отказ)
	
	Отказ = Истина;
	
КонецПроцедуры

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

Процедура ТаблицаИзмененийПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
	
	ирОбщий.ТабличноеПолеПриВыводеСтрокиЛкс(Элемент, ОформлениеСтроки, ДанныеСтроки, ЭлементыФормы.КП_ТаблицаИзменений.Кнопки.Пустые);
	
КонецПроцедуры

Процедура КП_ТаблицаИзмененийПустые(Кнопка)
	
	ирОбщий.КнопкаОтображатьПустыеИИдентификаторыНажатиеЛкс(Кнопка);
	ЭлементыФормы.ТаблицаИзменений.ОбновитьСтроки();
	
КонецПроцедуры

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

Процедура ПолеВводаКолонкиСсылка_ОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
	
	ирОбщий.ПолеВвода_ОкончаниеВводаТекстаЛкс(Элемент, Текст, Значение, СтандартнаяОбработка);
	
КонецПроцедуры

Процедура ПослеВосстановленияЗначений()
	
	Если Открыта() Тогда
		ПланОбменаПриИзмененииБезВычисленияКоличества();
	КонецЕсли; 

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

Процедура ПланОбменаПриИзмененииБезВычисленияКоличества()
	
	СтароеВычислятьКоличество = ОтображатьКоличествоОбъектовДляКоторыхЗарегистрированыИзменения;
	ОтображатьКоличествоОбъектовДляКоторыхЗарегистрированыИзменения = Ложь;
	ПланОбменаПриИзменении();
	ОтображатьКоличествоОбъектовДляКоторыхЗарегистрированыИзменения = СтароеВычислятьКоличество;

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

Процедура КП_ТаблицаИзмененийКонсольКомпоновки(Кнопка)
	
	Если ЭлементыФормы.ДеревоТаблиц.ТекущаяСтрока = Неопределено Или ЭлементыФормы.ТаблицаИзменений.Колонки.Количество() = 0 Тогда
		Возврат;
	КонецЕсли; 
	Построитель = ПолучитьПостроительДляТаблицыИзменений();
	// Из-за бага платформы пока так не стоит делать
	//Построитель.Текст = СтрЗаменить(Построитель.Текст, "АВТОУПОРЯДОЧИВАНИЕ", "");
	//Отчеты.ирКонсольКомпоновокДанных.Создать().ОткрытьПоЗапросу(, Новый Структура("Узел", УзелОбмена));
	Запрос = Построитель.ПолучитьЗапрос();
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "АВТОУПОРЯДОЧИВАНИЕ", "");
	КонсольКомпоновокДанных = ирОбщий.ПолучитьОбъектПоПолномуИмениМетаданныхЛкс("Отчет.ирКонсольКомпоновокДанных");
	#Если Сервер И Не Сервер Тогда
		КонсольКомпоновокДанных = Отчеты.ирКонсольКомпоновокДанных.Создать();
	#КонецЕсли
    КонсольКомпоновокДанных.ОткрытьПоЗапросу(Запрос);
	
	//Отчеты.ирКонсольКомпоновокДанных.Создать().ОткрытьПоОбъектуМетаданных(ЭлементыФормы.ДеревоТаблиц.ТекущиеДанные.ПолноеИмя + ".Изменения", Новый Структура("Узел", УзелОбмена));
	
КонецПроцедуры

Процедура ПланОбменаНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	
	ирОбщий.ПолеВводаСИсториейВыбора_НачалоВыбораИзСпискаЛкс(Элемент, ЭтаФорма);

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

Процедура КП_ТаблицаИзмененийЗагрузитьПолностью(Кнопка)
	
	//ирОбщий.ЗагрузитьВыборкуВТабличноеПолеПолностьюЛкс(ЭтаФорма, мВыборкаРезультата, ЭлементыФормы.КП_ТаблицаИзменений);
	ирОбщий.ЗагрузитьВыборкуВТабличноеПолеПервуюПорциюЛкс(ЭтаФорма, мРезультатЗапроса, мВыборкаРезультата, ЭлементыФормы.КП_ТаблицаИзменений,, 0);
	
КонецПроцедуры

Процедура ОбновитьРазмерДинамическойТаблицы() Экспорт

	ирОбщий.ПослеЗагрузкиВыборкиВТабличноеПолеЛкс(ЭтаФорма, мВыборкаРезультата,
		ЭлементыФормы.КП_ТаблицаИзменений, ЭлементыФормы.КоличествоСтрокИзменений);

КонецПроцедуры // ОбновитьРазмерТаблицы()

Процедура СтруктураКоманднойПанелиНажатие(Кнопка)
	
	ирОбщий.ОткрытьСтруктуруКоманднойПанелиЛкс(ЭтаФорма, Кнопка);
	
КонецПроцедуры

Процедура КП_ТаблицаИзмененийСброситьНомер(Кнопка)
	
	Отказ = Истина;
	ВыделенныеСтроки = ЭлементыФормы.ТаблицаИзменений.ВыделенныеСтроки;
	Если ВыделенныеСтроки.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	Ответ = Вопрос("Вы действительно хотите сбросить номера сообщений по " + ВыделенныеСтроки.Количество() + " объектам?", РежимДиалогаВопрос.ОКОтмена);
	Если Ответ <> КодВозвратаДиалога.ОК Тогда
		Возврат;
	КонецЕсли;
	СтрокаДереваТекущихДанных = ЭлементыФормы.ДеревоТаблиц.ТекущиеДанные;
	СтрокаОбновления = ЭлементыФормы.ДеревоТаблиц.ТекущиеДанные;
	Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ВыделенныеСтроки.Количество(), "Сброс номеров сообщений");
	Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
		ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
		КлючОбъекта = ПолучитьКлючОбъектаСтроки(ВыделеннаяСтрока);
		ирОбщий.ПланыОбменаИзменитьРегистрациюЛкс(ВыделеннаяСтрока.Узел, КлючОбъекта);
		ВыделеннаяСтрока.НомерСообщения = Null;
	КонецЦикла;
	ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
	
КонецПроцедуры

Функция ПолучитьКлючОбъектаСтроки(ВыделеннаяСтрока)

	КлючОбъекта = Неопределено;
	Если мТекущаяГруппаТипаМетаданных = "Ссылочный" Тогда
		КлючОбъекта = ВыделеннаяСтрока.Ссылка;
	ИначеЕсли мТекущаяГруппаТипаМетаданных = "Регистр" Тогда
		КлючОбъекта = мМакетныйОбъект;
		// http://partners.v8.1c.ru/forum/thread.jsp?id=1034617#1034617
		//мМакетныйОбъект.Отбор.Сбросить();
		Для Каждого Колонка Из ТаблицаИзменений.Колонки Цикл
			Если Ложь
				Или Колонка.Имя = "НомерСообщения" 
				Или Колонка.Имя = "Узел"
			Тогда
				Продолжить;
			КонецЕсли; 
			ЭлементОтбора = мМакетныйОбъект.Методы.Отбор[Колонка.Имя];
			ЭлементОтбора.Значение = ВыделеннаяСтрока[Колонка.Имя];
			ЭлементОтбора.Использование = Истина;
		КонецЦикла;
	ИначеЕсли мТекущаяГруппаТипаМетаданных = "Константа" Тогда
		КлючОбъекта = мМакетныйОбъект;
	КонецЕсли; 
	Возврат КлючОбъекта;

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

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

Процедура ПланОбменаНачалоВыбора(Элемент, СтандартнаяОбработка)
	
	Форма = ирКэш.Получить().ПолучитьФорму("ВыборОбъектаМетаданных", Элемент, ЭтаФорма);
	Форма.НачальноеЗначениеВыбора = Новый Структура("ФильтрКорневыхТипов", "ПланОбмена");
	Форма.ОткрытьМодально();
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

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

Процедура ОбновлениеОтображения()
	
	ЭлементыФормы.ОтображатьТолькоМетаданныеСИзменениями.Доступность = ОтображатьКоличествоОбъектовДляКоторыхЗарегистрированыИзменения;
	
КонецПроцедуры

Процедура УзлыПриИзмененииФлажка(Элемент, Колонка)
	
	ПриИзмененииВыбранныхУзлов();

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

Процедура ИмяПланОбменаОткрытие(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	Если ЗначениеЗаполнено(ИмяПланОбмена) Тогда
		ОткрытьФорму("ПланОбмена." + ИмяПланОбмена + ".ФормаСписка");
	КонецЕсли; 
	
КонецПроцедуры

Процедура УзлыВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	
	ОткрытьЗначение(ВыбраннаяСтрока.Ссылка);
	
КонецПроцедуры

Процедура КПУзлыОбновить(Кнопка = Неопределено, ПринудительныйПризнакИзменениеВыбранныхУзлов = Неопределено)
	
	мДанныеПоКоличествуИзменений = Неопределено;
	Если ЭлементыФормы.Узлы.ТекущаяСтрока <> Неопределено Тогда
		СтарыйТекущийУзел = ЭлементыФормы.Узлы.ТекущаяСтрока.Ссылка;
	КонецЕсли; 
	Узлы.Очистить();
	//ИтогиТаблицыПоУзлам.Очистить();
	мИменаПлановОбмена = Новый Массив;
	Если ЗначениеЗаполнено(ИмяПланОбмена) Тогда
		Для Каждого МетаПланОбмена Из Метаданные.ПланыОбмена Цикл
			КолонкаТП = ЭлементыФормы.ДеревоТаблиц.Колонки["Авторегистрация_" + МетаПланОбмена.Имя];
			КолонкаТП.Видимость = Ложь;
		КонецЦикла;
		мИменаПлановОбмена.Добавить(ИмяПланОбмена);
	Иначе
		Для Каждого МетаПланОбмена Из Метаданные.ПланыОбмена Цикл
			мИменаПлановОбмена.Добавить(МетаПланОбмена.Имя);
		КонецЦикла;
	КонецЕсли; 
	//ЭлементыФормы.ДеревоТаблиц.Колонки.Авторегистрация.Видимость = ЗначениеЗаполнено(ИмяПланОбмена);
	ЭлементыФормы.Узлы.Колонки.ПланОбмена.Видимость = Не ЗначениеЗаполнено(ИмяПланОбмена);
	ЭлементыФормы.Узлы.Колонки.РИБ.Видимость = Не ЗначениеЗаполнено(ИмяПланОбмена);
	Для Каждого лИмяПланаОбмена Из мИменаПлановОбмена Цикл
		КолонкаТП = ЭлементыФормы.ДеревоТаблиц.Колонки["Авторегистрация_" + лИмяПланаОбмена];
		КолонкаТП.Видимость = Истина;
		ВыборкаУзлов = ПланыОбмена[лИмяПланаОбмена].Выбрать();
		#Если Сервер И Не Сервер Тогда
		    ВыборкаУзлов = ПланыОбмена.ПолныйИис.Выбрать();
		#КонецЕсли
		Пока ВыборкаУзлов.Следующий() Цикл
			СтрокаУзла = Узлы.Добавить();
			ЗаполнитьЗначенияСвойств(СтрокаУзла, ВыборкаУзлов);
			Если мВыбранныеУзлы.Найти(ВыборкаУзлов.Ссылка) <> Неопределено Тогда
				СтрокаУзла.Пометка = Истина;
			КонецЕсли; 
			СтрокаУзла.СобственныйУзел = ПланыОбмена[лИмяПланаОбмена].ЭтотУзел() = ВыборкаУзлов.Ссылка;
			ЗаполнитьСтрокуУзла(СтрокаУзла);
		КонецЦикла;
	КонецЦикла;
	Узлы.Сортировать("ПланОбмена, СобственныйУзел Убыв, Ссылка");
	НачальноеКоличество = мВыбранныеУзлы.Количество(); 
	ВыбранныеУзлыИзменены = Ложь;
	Для СчетчикмВыбранныеУзлы = 1 По НачальноеКоличество Цикл
		ВыбранныйУзел = мВыбранныеУзлы[НачальноеКоличество - СчетчикмВыбранныеУзлы];
		Если Узлы.Найти(ВыбранныйУзел, "Ссылка") = Неопределено Тогда
			Если Не ЗначениеЗаполнено(ИмяПланОбмена) Или ТипЗнч(ВыбранныйУзел) = Тип("ПланОбменаСсылка." + ИмяПланОбмена) Тогда
				НоваяСтрока = Узлы.Добавить();
				НоваяСтрока.Ссылка = ВыбранныйУзел;
				НоваяСтрока.Пометка = Истина;
				ЗаполнитьСтрокуУзла(НоваяСтрока);
			Иначе
				мВыбранныеУзлы.Удалить(НачальноеКоличество - СчетчикмВыбранныеУзлы);
				ВыбранныеУзлыИзменены = Истина;
			КонецЕсли; 
		КонецЕсли;
	КонецЦикла;
	Если СтарыйТекущийУзел <> Неопределено Тогда
		НоваяТекущаяСтрока = Узлы.Найти(СтарыйТекущийУзел, "Ссылка");
		Если НоваяТекущаяСтрока <> Неопределено Тогда
			ЭлементыФормы.Узлы.ТекущаяСтрока = НоваяТекущаяСтрока;
		КонецЕсли; 
	КонецЕсли; 
	Если Ложь
		Или ПринудительныйПризнакИзменениеВыбранныхУзлов = Истина 
		Или ВыбранныеУзлыИзменены
		Или ОтображатьКоличествоОбъектовДляКоторыхЗарегистрированыИзменения // Это нужно, чтобы несуществующие узлы обновлялись
	Тогда
		ПриИзмененииВыбранныхУзлов();
	Иначе
		ОбновитьВидимостьКолонокАвторегистрации();
	КонецЕсли;
	
КонецПроцедуры

Процедура ЗаполнитьСтрокуУзла(НоваяСтрока)
	
	НоваяСтрока.ПланОбмена = НоваяСтрока.Ссылка.Метаданные().Имя;
	НоваяСтрока.РИБ = НоваяСтрока.Ссылка.Метаданные().РаспределеннаяИнформационнаяБаза;
	
КонецПроцедуры

Процедура ПриИзмененииВыбранныхУзлов(Групповое = Ложь)
	
	ОбновитьВидимостьКолонокАвторегистрации();
	ИтогиТаблицыПоУзлам.Очистить();
	СтрокаИтоговТаблицы = ИтогиТаблицыПоУзлам.Добавить();
	СтрокаИтоговТаблицы.Узел = "<Все>";
	ЭлементыФормы.ИтогиТаблицыПоУзлам.ТекущаяСтрока = СтрокаИтоговТаблицы;
	Для Каждого ВыбранныйУзел Из мВыбранныеУзлы Цикл
		СтрокаИтоговТаблицы = ИтогиТаблицыПоУзлам.Добавить();
		СтрокаИтоговТаблицы.Узел = ВыбранныйУзел;
	КонецЦикла;
	Если Ложь
		Или ОтображатьТолькоМетаданныеСИзменениями 
		Или ОтображатьТолькоТаблицыСАвторегистрацией 
		Или ДеревоТаблиц.Строки.Количество() = 0
	Тогда
		ПостроитьДеревоСоставаПланаОбмена();
	Иначе
		ОбновитьСтатистикуВСоставеПланаОбмена();
	КонецЕсли; 
	
КонецПроцедуры

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

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

Процедура КПУзлыУстановитьПометки(Кнопка)
	
	ирОбщий.ИзменитьПометкиВыделенныхСтрокЛкс(ЭлементыФормы.Узлы, , Истина, "Ссылка", Новый Структура("СобственныйУзел", Ложь));
	ПриИзмененииВыбранныхУзлов();
	
КонецПроцедуры

Процедура КПУзлыСнятьПометки(Кнопка)
	
	ирОбщий.ИзменитьПометкиВыделенныхСтрокЛкс(ЭлементыФормы.Узлы, , Ложь);
	ПриИзмененииВыбранныхУзлов();

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

Процедура ИтогиТаблицыПоУзламПриАктивизацииСтроки(Элемент)
	
	Если Элемент.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	УстановитьТекущуюСтрокуТаблицыУзлов(Элемент.ТекущаяСтрока.Узел);
	КП_ТаблицаИзмененийОбновить();
	
КонецПроцедуры

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

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

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

Процедура КоманднаяПанельДереваОбъектовОткрытьОбработкуОбъектов(Кнопка)
	
	Если ЭлементыФормы.ДеревоТаблиц.ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ОбработкаОбъектов = ирОбщий.ПолучитьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирПодборИОбработкаОбъектов");
	#Если Сервер И Не Сервер Тогда
	    ОбработкаОбъектов = Обработки.ирПодборИОбработкаОбъектов.Создать();
	#КонецЕсли
	ФормаОбработки = ОбработкаОбъектов.ПолучитьФорму();
	ФормаОбработки.Открыть();
	ОбработкаОбъектов.ИспользоватьОтборПоУзлу = Истина;
	Если ЭлементыФормы.Узлы.ТекущаяСтрока <> Неопределено Тогда
		ОбработкаОбъектов.УзелОтбораОбъектов = ЭлементыФормы.Узлы.ТекущаяСтрока.Ссылка;
	ИначеЕсли ЗначениеЗаполнено(ИмяПланОбмена) Тогда 
		ОбработкаОбъектов.УзелОтбораОбъектов = Новый ("ПланОбменаСсылка." + ИмяПланОбмена);
	КонецЕсли; 
	ПолныеИменаТаблиц = ПолучитьПолныеИменаВыделенныхТаблиц();
	Если ПолныеИменаТаблиц.Количество() = 1 Тогда
		ОбластьПоиска = ПолныеИменаТаблиц[0].Значение;
	Иначе
		ОбластьПоиска = ПолныеИменаТаблиц;
	КонецЕсли; 
	ФормаОбработки.УстановитьОбластьПоиска(ОбластьПоиска);
	
КонецПроцедуры

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

Процедура КоманднаяПанельДереваОбъектовСверткаСодержимое(Кнопка)
	
	ИзменитьСвернутостьПанельТекущейТаблицы(Не ПоказыватьСодержимое);
	Если ПоказыватьСодержимое Тогда
		КП_ТаблицаИзмененийОбновить();
	КонецЕсли; 

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

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

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

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
	
	Если Не Отказ Тогда
		ИзменитьСвернутостьПанельТекущейТаблицы(Истина);
	КонецЕсли; 

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

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	ирОбщий.ФормаОбработкаОповещенияЛкс(ЭтаФорма, ИмяСобытия, Параметр, Источник); 

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

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

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

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

Процедура КПУзлыРедактироватьОбъект(Кнопка)
	
	Если ЭлементыФормы.Узлы.ТекущаяСтрока <> Неопределено Тогда
		ирОбщий.ОткрытьСсылкуВРедактореОбъектаБДЛкс(ЭлементыФормы.Узлы.ТекущаяСтрока.Ссылка);
	КонецЕсли; 
	
КонецПроцедуры

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

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

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

Процедура КлсУниверсальнаяКомандаНажатие(Кнопка) Экспорт 
	
	ирОбщий.УниверсальнаяКомандаФормыЛкс(ЭтаФорма, Кнопка);
	
КонецПроцедуры

Процедура ОбработчикОжиданияСПараметрамиЛкс() Экспорт 
	
	ирОбщий.ОбработчикОжиданияСПараметрамиЛкс();

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

Процедура ОтображатьТолькоТаблицыСАвторегистрациейПриИзменении(Элемент)
	
	ПостроитьДеревоСоставаПланаОбмена();
	
КонецПроцедуры

Процедура УзлыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
	
	Если ДанныеСтроки.СобственныйУзел Тогда
		//ОформлениеСтроки.Ячейки.Пометка.ТолькоПросмотр = Истина;
		ОформлениеСтроки.ЦветФона = WebЦвета.Перламутровый;
		//ЖирныйШрифт = Новый Шрифт(,, Истина);
		//ОформлениеСтроки.Шрифт = ЖирныйШрифт;
	КонецЕсли; 
	
КонецПроцедуры

Процедура КПУзлыОткрытьОбработкуОбъектов(Кнопка)
	
	ирОбщий.ОткрытьОбъектыИзВыделенныхЯчеекВПодбореИОбработкеОбъектовЛкс(ЭлементыФормы.Узлы, "Ссылка");
	
КонецПроцедуры

Процедура УстановитьТекущуюСтрокуТаблицыУзлов(Знач Узел)
	
	СтрокаУзла = Узлы.Найти(Узел, "Ссылка");
	Если СтрокаУзла <> Неопределено Тогда
		ЭлементыФормы.Узлы.ТекущаяСтрока = СтрокаУзла;
		ЭлементыФормы.Узлы.ТекущаяКолонка = ЭлементыФормы.Узлы.Колонки.Ссылка;
	КонецЕсли;

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

Процедура ТаблицаИзмененийПриАктивизацииСтроки(Элемент)
	
	Если Элемент.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	УстановитьТекущуюСтрокуТаблицыУзлов(Элемент.ТекущаяСтрока.Узел);

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

Процедура КПУзлыНайтиВСписке(Кнопка)
	
	Если ЭлементыФормы.Узлы.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ирОбщий.ОткрытьСсылкуВСпискеЛкс(ЭлементыФормы.Узлы.ТекущаяСтрока.Ссылка);
	
КонецПроцедуры

Процедура ОсновныеДействияФормыСтруктураФормы(Кнопка)
	
	ирОбщий.ОткрытьСтруктуруФормыЛкс(ЭтаФорма);

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

Процедура КоманднаяПанельДереваОбъектовСвернутьВсе(Кнопка)
	
	ирОбщий.ТабличноеПолеДеревоЗначений_СвернутьВсеСтрокиЛкс(ЭлементыФормы.ДеревоТаблиц);

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

Процедура ПриЗакрытии()
	
	ирОбщий.Форма_ПриЗакрытииЛкс(ЭтаФорма);

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

Процедура КоманднаяПанельДереваОбъектовПоказатьСтруктуруХранения(Кнопка)
	
	ТекущаяСтрокаТаблиц = ЭлементыФормы.ДеревоТаблиц.ТекущаяСтрока;
	Если ТекущаяСтрокаТаблиц = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	Форма = ОбработкаСтруктурыХраненияБД();
	Форма.ПараметрИмяТаблицы = ТекущаяСтрокаТаблиц.ПолноеИмя + ".Изменения";
	Форма.Открыть();
	
КонецПроцедуры

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

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

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

Процедура КоманднаяПанельДереваОбъектовСравнить(Кнопка)
	
	ирОбщий.СравнитьСодержимоеЭлементаУправленияЛкс(ЭлементыФормы.ДеревоТаблиц);
	
КонецПроцедуры

Процедура ОсновныеДействияФормыГлавныйУзел(Кнопка)
	
	ПолучитьФорму("УправлениеГлавнымУзлом").Открыть();
	
КонецПроцедуры

Процедура КоманднаяПанельДереваОбъектовОткрытьМетаданные(Кнопка)
	
	ТекущаяСтрока = ЭлементыФормы.ДеревоТаблиц.ТекущаяСтрока;
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	Если ТекущаяСтрока.Уровень() = 1 Тогда
		ирОбщий.ОткрытьОбъектМетаданныхЛкс(ТекущаяСтрока.ПолноеИмя);
	КонецЕсли; 

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

Процедура КоманднаяПанельДереваОбъектовМенеджерТабличногоПоля(Кнопка)
	
	ирОбщий.ОткрытьМенеджерТабличногоПоляЛкс(ЭлементыФормы.ДеревоТаблиц, ЭтаФорма);

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

Процедура КПУзлыМенеджерТабличногоПоля(Кнопка)
	
	ирОбщий.ОткрытьМенеджерТабличногоПоляЛкс(ЭлементыФормы.Узлы, ЭтаФорма);

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

ирОбщий.ИнициализироватьФормуЛкс(ЭтаФорма, "Обработка.ирРедакторИзмененийНаУзлах.Форма.Форма");

ДеревоТаблиц.Колонки.Добавить("ПолноеИмя");
мСоответствиеСтрокДереваИМетаданных = Новый Соответствие;
ОтображатьКоличествоОбъектовДляКоторыхЗарегистрированыИзменения = Истина;
ОтображатьТолькоМетаданныеСИзменениями = Истина;
мВыбранныеУзлы = Новый Массив();
ПоказыватьСодержимое = Истина;
мВнутреннееИмяТаблицы = "Таблица34582";
КолонкаШаблон = ЭлементыФормы.ДеревоТаблиц.Колонки.Авторегистрация_Шаблон;
Для Каждого МетаПланОбмена Из Метаданные.ПланыОбмена Цикл
	ИмяКолонки = "Авторегистрация_" + МетаПланОбмена.Имя;
	КолонкаДерева = ДеревоТаблиц.Колонки.Добавить(ИмяКолонки);
	КолонкаТП = ЭлементыФормы.ДеревоТаблиц.Колонки.Добавить(ИмяКолонки);
	ЗаполнитьЗначенияСвойств(КолонкаТП, КолонкаШаблон,, "Имя"); 
	КолонкаТП.Данные = ИмяКолонки;
	КолонкаТП.ТекстШапки = МетаПланОбмена.Имя;
	КолонкаТП.Видимость = Истина;
КонецЦикла;
