Перем мВыборкаРезультатаСтрокиТаблицы;
Перем мСтруктураОбъектаБД;
Перем мНастройкаКолонок;
Перем СтароеИмяОсновнойТаблицы;
Перем мОтборВерсий;
Перем мПолучатьПредставленияСсылокВНайденныхСсылках;
Перем мКнопкаИдентификаторы;
Перем мПодменюТекущаяТаблица; // Кэш
Перем мСтарыйАвтозапускПодсчетаСсылок;
Перем мСтарыйАвтозапускПоискаСсылок;
Перем мСвязанныйДинамическийСписок;
Перем мФормаУпрДляПодключаемыхКоманд;

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

Процедура ЗагрузитьНастройкуВФорме(НастройкаФормы, ДопПараметры) Экспорт 
	
	ирКлиент.ЗагрузитьНастройкуФормыЛкс(ЭтаФорма, НастройкаФормы); 
	ИмяСинонимПриИзменении();
	СвязанныеДанныеТолькоНепустыеПриИзменении(ЭтаФорма);

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

Процедура ОбновлениеОтображения()
	
	ирКлиент.Форма_ОбновлениеОтображенияЛкс(ЭтаФорма);
	ТекущееТабличноеПоле = ТекущееТабличноеПоле();
	Если ТекущееТабличноеПоле <> Неопределено Тогда
		ирКлиент.ТабличноеПолеСОтборомПросмотраОбновитьПредставлениеЛкс(ЭтаФорма, ТекущееТабличноеПоле); 
		ОбновитьРазмерыДинамическогоТабличногоПоля(ЭлементыФормы.ПанельДвижения);
		ОбновитьРазмерыДинамическогоТабличногоПоля(ЭлементыФормы.ПанельТабличныеЧасти);
	КонецЕсли; 
	
КонецПроцедуры

// Антибаг платформы 8.3.21 https://www.hostedredmine.com/issues/946345
Процедура ОбновитьРазмерыДинамическогоТабличногоПоля(Знач ПанельТаблиц)
	
	ИмяСтраницы = ПанельТаблиц.ТекущаяСтраница.Имя;
	Если ЗначениеЗаполнено(ИмяСтраницы) Тогда
		ДинамическоеТабличноеПоле = ЭлементыФормы.Найти(Сред(ИмяСтраницы, СтрДлина("Страница") + 1));
		Если ДинамическоеТабличноеПоле <> Неопределено Тогда
			ОбновитьРазмерыТабличногоПоляСтраницы(ПанельТаблиц, ДинамическоеТабличноеПоле);
		Иначе
			// Страница1
			Пустышка = 0;
		КонецЕсли;
	КонецЕсли;

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

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

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

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

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

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

Процедура УстановитьОтображениеЗакладок(Панель)
	
	Если Панель.Страницы.Количество() < 2 Тогда
		Панель.ОтображениеЗакладок = ОтображениеЗакладок.НеИспользовать;
		Панель.Страницы[0].Видимость = Истина;
	Иначе
		Панель.Страницы[0].Видимость = Ложь;
	КонецЕсли;

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

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

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

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

Процедура ОбновитьРазмерыТабличногоПоляСтраницы(Знач ПанельТаблиц, Знач ТабличноеПолеТаблицы)
	
	ТабличноеПолеТаблицы.Высота = ПанельТаблиц.Высота - 4; // Было 4. При 8 меньше неудобств при поломке привязок в немаксимизированном режиме окна
	ТабличноеПолеТаблицы.Ширина = ПанельТаблиц.Ширина - 4;

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

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

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

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

// <Описание процедуры>
//
// Параметры:
//  <Параметр1>  - <Тип.Вид> - <описание параметра>
//                 <продолжение описания параметра>;
//  <Параметр2>  - <Тип.Вид> - <описание параметра>
//                 <продолжение описания параметра>.
//
Процедура ПоместитьДанныеВТЧ(Объект, ИмяТЧ)

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

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

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

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

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

Функция ПоместитьДанныеОбъектаВФорму(СтруктураОбъекта, ДанныеИзБД = Истина, СсылкаИзменилась = Истина) 

	ИмяПоляСсылка = ирОбщий.ПеревестиСтроку("Ссылка");
	ИмяПоляЭтоГруппа = ирОбщий.ПеревестиСтроку("ЭтоГруппа");
	Если СтруктураОбъекта = Неопределено И фОбъект.ЭтоСсылочныйОбъект Тогда
		СтруктураОбъекта = Новый Структура;
		СтруктураОбъекта.Вставить("Данные", фОбъект.ВыбОбъект);
		СтруктураОбъекта.Вставить("Методы", Неопределено);
	КонецЕсли;  
	МетаданныеОбъекта = МетаданныеТаблицыБД(); 
	ирОбщий.ОбновитьТекстПослеМаркераЛкс(ЭтаФорма.Заголовок, , "", ": ");
	Если фОбъект.ЭтоНаборЗаписей И Не фОбъект.мРежимМенеджераЗаписи Тогда
		КлючТекущейСтроки = КлючОбъекта();
		Если КлючТекущейСтроки <> Неопределено Тогда
			СтруктураКлючаТекущейСтроки = ирОбщий.СтруктураКлючаТаблицыБДЛкс(ИмяОсновнойТаблицы,,, Ложь);
			Если СтруктураКлючаТекущейСтроки.Свойство("Регистратор") Тогда
				СтруктураКлючаТекущейСтроки.Удалить("Регистратор");
			КонецЕсли; 
			ЗаполнитьЗначенияСвойств(СтруктураКлючаТекущейСтроки, КлючТекущейСтроки);
		КонецЕсли; 
	КонецЕсли; 
	СостояниеРеквизитыТаблица = ирКлиент.ТабличноеПолеСостояниеСтрокЛкс(ЭлементыФормы.РеквизитыТаблица, "ИмяРеквизита");
	//Если ЭлементыФормы.ПанельОбъект.ТекущаяСтраница <> Неопределено Тогда
	//	СтараяТекущаяСтраницаОбъекта = ЭлементыФормы.ПанельОбъект.ТекущаяСтраница.Имя;
	//КонецЕсли; 
	РеквизитыТаблица.Очистить();
	ЭтаФорма.Модифицированность = Ложь;
	НастроитьЭлементыФормы(ЭтаФорма);
	ПоискВОбъекте.Очистить();
	СвязанныеДанныеПриАктивизацииСтроки();
	Если СсылкаИзменилась Тогда
		ирКлиент.УстановитьГотовностьДанныхСтраницыЛкс(ЭтаФорма, ЭлементыФормы.ПанельОсновная.Страницы.СтраницаИзмененияНаУзлах, Ложь);
		фОбъект.СсылкиНаОбъект.Очистить();
		фОбъект.КоличествоНайденныхСсылок = 0;
		ирКлиент.УстановитьГотовностьДанныхСтраницыЛкс(ЭтаФорма, ЭлементыФормы.ПанельОсновная.Страницы.СтраницаСсылкиНаОбъект, Ложь);
		Для Каждого СтрокаСвязанныхДанных Из фОбъект.СвязанныеДанные Цикл
			СтрокаСвязанныхДанных.КоличествоСсылающихся = "?";
		КонецЦикла;
		//ирКлиент.УстановитьГотовностьДанныхСтраницыЛкс(ЭтаФорма, ЭлементыФормы.ПанельОсновная.Страницы.СтраницаСвязанныеДанные, Ложь);
	КонецЕсли; 
	ЭлементыФормы.ПанельОсновная.Страницы.СтраницаСтраницыПанельДвижения.Видимость = фОбъект.ЭтоДокумент;
	ЭлементыФормы.ЛиЧитатьПисатьДвижения.Видимость = фОбъект.ЭтоДокумент;
	ЭлементыФормы.ЛиЗаписьДвиженийВТранзакции.Видимость = фОбъект.ЭтоДокумент;
	ЭлементыФормы.ЗаписьБезЗамещения.Видимость = фОбъект.ЭтоНаборЗаписей;
	ЭлементыФормы.ПанельОбъект.Страницы.СтраницаКартаМаршрута.Видимость = Ложь;
	Если Истина
		И фОбъект.ЭтоСсылочныйОбъект
		И ТипЗнч(фОбъект.ВыбОбъект) = Тип("Строка") 
	Тогда 
		Возврат Неопределено;
	КонецЕсли; 
	Если СтруктураОбъекта = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли; 
	Если Не фОбъект.ЭтоМетаСсылка И СтруктураОбъекта.Методы <> Неопределено Тогда
		СтруктураОбъекта.Методы.ДополнительныеСвойства.Свойство("НомерЗагруженнойВерсии", фОбъект.НомерЗагруженнойВерсии);
		ирКлиент.ФормаОбъекта_ОбновитьЗаголовокЛкс(ЭтаФорма);
		//Если Не ДанныеИзБД Тогда
		//	Для Каждого КлючИЗначение Из СтруктураОбъекта.Методы.ДополнительныеСвойства Цикл
		//		ДобавитьДопСвойствоНаФорму(КлючИЗначение.Ключ, КлючИЗначение.Значение);
		//	КонецЦикла;
		//КонецЕсли; 
	КонецЕсли; 
	Если фОбъект.ЭтоСсылочныйОбъект Тогда
		Если СтруктураОбъекта.Методы <> Неопределено И Не ЗначениеЗаполнено(фОбъект.ВыбОбъект) И Не фОбъект.ЭтоМетаСсылка Тогда
			фОбъект.ВыбОбъект = СтруктураОбъекта.Методы.Ссылка;
		КонецЕсли; 
		ОписаниеТиповСтрока = Новый ОписаниеТипов("Строка");
		Если фОбъект.ЭтоВнешнийОбъект Или фОбъект.ЭтоМетаСсылка Тогда
			ОписаниеТиповИД = ОписаниеТиповСтрока;
		Иначе
			//ОписаниеТиповИД = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(36));
			ОписаниеТиповИД = Новый ОписаниеТипов("УникальныйИдентификатор");
		КонецЕсли; 
		ТочнаяСсылка = ?(СтруктураОбъекта.Методы <> Неопределено И Не фОбъект.ЭтоВнешнийОбъект И Не фОбъект.ЭтоМетаСсылка И СтруктураОбъекта.Методы.ЭтоНовый(), СтруктураОбъекта.Методы.ПолучитьСсылкуНового(),
			фОбъект.ВыбОбъект);
		ЗначениеРеквизита = ирОбщий.СтроковыйИдентификаторСсылкиЛкс(ТочнаяСсылка);
		Попытка
			ЗначениеРеквизита = Новый УникальныйИдентификатор(ЗначениеРеквизита);
		Исключение
		КонецПопытки;
		ДобавитьСтрокуТаблицыРеквизиты(ЗначениеРеквизита, "ИдентификаторСсылкиЛкс", "Идентификатор ссылки", ОписаниеТиповИД, 
			СтруктураОбъекта.Методы = Неопределено Или фОбъект.ЭтоМетаСсылка Или фОбъект.ЭтоВнешнийОбъект Или Не СтруктураОбъекта.Методы.ЭтоНовый());
		ОбновитьНавигационнуюСсылку(ТочнаяСсылка);
		Если фОбъект.ЭтоМетаСсылка Тогда
			ЗначениеРеквизита = "" + фОбъект.ВыбОбъект;
			ДобавитьСтрокуТаблицыРеквизиты(ЗначениеРеквизита, "Представление", "Представление", ОписаниеТиповСтрока, Истина);
		Иначе
			СтруктураТЧ = ирОбщий.ТабличныеЧастиОбъектаЛкс(МетаданныеОбъекта);
			Если Истина
				И ирОбщий.РежимСовместимостиМеньше8_3_4Лкс()
				И ирОбщий.ЛиКорневойТипОбъектаСПредопределеннымЛкс(ирОбщий.ПервыйФрагментЛкс(ИмяОсновнойТаблицы))
			Тогда
				ЗначениеРеквизита = ирОбщий.ПолучитьМенеджерЛкс(МетаданныеОбъекта).ПолучитьИмяПредопределенного(фОбъект.ВыбОбъект);
				ДобавитьСтрокуТаблицыРеквизиты(ЗначениеРеквизита, "ИмяПредопределенныхДанных", "Имя предопределенных данных*", ОписаниеТиповСтрока, Истина);
			КонецЕсли; 
			Для Каждого ДоступноеПоле Из ПоляТаблицыБД() Цикл
				ИмяПоля = ДоступноеПоле.Имя;
				Если СтруктураТЧ.Свойство(ИмяПоля) Тогда
					Продолжить;
				КонецЕсли;
				Если Ложь
					Или ИмяПоля = ИмяПоляСсылка
				Тогда
					Продолжить;
				КонецЕсли; 
				МетаРеквизит = ДоступноеПоле.Метаданные;
				Если МетаРеквизит <> Неопределено Тогда
					Попытка
						ИспользованиеРеквизита = МетаРеквизит.Использование;
					Исключение
						ИспользованиеРеквизита = Неопределено
					КонецПопытки;
					Если ИспользованиеРеквизита <> Неопределено И ирОбщий.ЛиМетаданныеОбъектаСГруппамиЛкс(МетаданныеОбъекта) Тогда
						Если Ложь
							Или (Истина
								И ИспользованиеРеквизита = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппы 
								И СтруктураОбъекта.Данные[ИмяПоляЭтоГруппа])
							Или (Истина
								И ИспользованиеРеквизита = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляЭлемента 
								И Не СтруктураОбъекта.Данные[ИмяПоляЭтоГруппа])
							Или (ИспользованиеРеквизита = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппыИЭлемента)
						Тогда
						Иначе
							Продолжить;
						КонецЕсли;
					КонецЕсли; 
				КонецЕсли; 
				НедоступноИзменениеПоля = ирОбщий.НедоступноИзменениеПоляСсылочногоОбъектаЛкс(ИмяПоля);
				ДобавитьСтрокуТаблицыРеквизиты(СтруктураОбъекта.Данные[ИмяПоля], ИмяПоля, ДоступноеПоле.Заголовок, ДоступноеПоле.ТипЗначения, НедоступноИзменениеПоля, ДанныеИзБД, МетаРеквизит);
			КонецЦикла;
			СписокСвойств = ирОбщий.ДопРеквизитыБСПОбъектаЛкс(фОбъект.ВыбОбъект);
			Для Каждого Свойство Из СписокСвойств Цикл
				#Если Сервер И Не Сервер Тогда
					Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПустаяСсылка();
				#КонецЕсли
				ТекущееЗначение = ирОбщий.ЗначениеДопРеквизитаБСПЛкс(СтруктураОбъекта.Данные, Свойство, ИмяПоляСсылка);
				ДобавитьСтрокуТаблицыРеквизиты(ТекущееЗначение, Свойство.Имя, Свойство.Заголовок, Свойство.ТипЗначения,,, Свойство);
			КонецЦикла;
			Если Ложь
				Или фОбъект.СтраницыТабличныеЧасти.Количество() = 0
				Или (Истина
					И ирОбщий.ЛиМетаданныеОбъектаСГруппамиЛкс(МетаданныеОбъекта)
					И СсылкаИзменилась)
			Тогда
				ПодготовитьСтраницыТабличныхЧастей(СтруктураОбъекта, СтруктураТЧ, Не СсылкаИзменилась);
			Иначе
				ЗагрузитьТаблицыТЧ(СтруктураОбъекта, СтруктураТЧ, Не СсылкаИзменилась);
			КонецЕсли; 
			ЗагрузитьТаблицыДвижений(фОбъект.ВыбОбъект, Не СсылкаИзменилась);
			Если БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипЗнч(фОбъект.ВыбОбъект)) И СтруктураОбъекта.Методы <> Неопределено Тогда
				ЭлементыФормы.ПанельОбъект.Страницы.СтраницаКартаМаршрута.Видимость = Истина;
				ЭлементыФормы.КартаМаршрута.УстановитьСхему(СтруктураОбъекта.Методы.ПолучитьКартуМаршрута());
			КонецЕсли; 
		КонецЕсли; 
		ЗаполнитьИндексыКартинокТаблицыРеквизитов(СтруктураОбъекта);
		ПорядокРеквизитовПриИзменении();
		//ЭлементыФормы.ПанельОбъект.ТекущаяСтраница = ЭлементыФормы.ПанельОбъект.Страницы.СтраницаРеквизитыТаблица;
		Если ирОбщий.ЛиМетаданныеОбъектаСГруппамиЛкс(МетаданныеОбъекта) Тогда
			фОбъект.ЭтоГруппа = СтруктураОбъекта.Данные[ирОбщий.ПеревестиСтроку("ЭтоГруппа")];
		КонецЕсли;
		КнопкаПометкиНаУдаление = ЭлементыФормы.ОсновныеДействияФормы.Кнопки.ПометитьНаУдаление;
		Если фОбъект.ЭтоВнешнийОбъект Или фОбъект.ЭтоМетаСсылка Тогда
			КнопкаПометкиНаУдаление.Доступность = Ложь;
		Иначе
			КнопкаПометкиНаУдаление.Доступность = Истина;
			ФрагментыПодсказки = ирОбщий.СтрРазделитьЛкс(КнопкаПометкиНаУдаление.Подсказка);
			ФрагментыПодсказки.Удалить(0);
			Если СтруктураОбъекта.Данные[ирОбщий.ПеревестиСтроку("ПометкаУдаления")] Тогда
				НовыйТекстКнопки = "Снять пометку удаления";
			Иначе
				НовыйТекстКнопки = "Пометить на удаление";
			КонецЕсли; 
			ФрагментыПодсказки.Вставить(0, НовыйТекстКнопки);
			НоваяПодсказкаКнопки = ирОбщий.СтрСоединитьЛкс(ФрагментыПодсказки, ".");
			КнопкаПометкиНаУдаление.Текст = НовыйТекстКнопки; 
			КнопкаПометкиНаУдаление.Подсказка = НоваяПодсказкаКнопки;
			КнопкаПометкиНаУдаление.Пояснение = НоваяПодсказкаКнопки;
		КонецЕсли; 
		МодифицированностьОбъекта = Не фОбъект.ЭтоМетаСсылка И СтруктураОбъекта.Методы <> Неопределено И СтруктураОбъекта.Методы.Модифицированность();
	ИначеЕсли фОбъект.ЭтоКонстанта Тогда
		строкаТзРеквизиты = РеквизитыТаблица.Добавить();
		строкаТзРеквизиты.ИмяРеквизита = "Значение";
		строкаТзРеквизиты.ПредставлениеРеквизита = "Значение";
		строкаТзРеквизиты.ЗначениеРеквизита = СтруктураОбъекта.Данные.Значение;
		строкаТзРеквизиты.РасширенноеЗначение = СтруктураОбъекта.Данные.Значение;
		строкаТзРеквизиты.ОписаниеТипов = МетаданныеОбъекта.Тип;
		ОбновитьТипЗначенияВСтрокеРеквизита(строкаТзРеквизиты);
		строкаТзРеквизиты.Подсказка = МетаданныеОбъекта.Подсказка;
		строкаТзРеквизиты.РазрешеноИзменение = Истина;
		ЗаполнитьИндексыКартинокТаблицыРеквизитов(СтруктураОбъекта);
		//МодифицированностьОбъекта = СтруктураОбъекта.Методы.Модифицированность(); // У менеджера значения константы почему то нет такого метода
		МодифицированностьОбъекта = Ложь;
	Иначе // Это набор записей
		фОбъект.мСчитанНепустойНаборЗаписей = СтруктураОбъекта.Данные.Количество() > 0;
		ЭтаФорма.НаборЗаписей = СтруктураОбъекта.Методы.Выгрузить();
		Если Не ирОбщий.ЛиКорневойТипВнешнегоИсточникаДанныхЛкс(ирОбщий.ПервыйФрагментЛкс(ИмяОсновнойТаблицы)) Тогда
			УдалитьКолонкуНомерСтрокиВТаблицеЗначений(НаборЗаписей);
		КонецЕсли;
		ПоляТаблицыБД = ирКэш.ПоляТаблицыБДЛкс(ИмяОсновнойТаблицы);
		ИмяУдаляемойКолонки = "МоментВремени";
		Если Истина
			И НаборЗаписей.Колонки.Найти(ИмяУдаляемойКолонки) <> Неопределено 
			И ПоляТаблицыБД.Найти(ИмяУдаляемойКолонки, "Имя") = Неопределено
		Тогда
			// https://www.hostedredmine.com/issues/946859
			НаборЗаписей.Колонки.Удалить(ИмяУдаляемойКолонки);
		КонецЕсли;
		//ЭлементыФормы.НаборЗаписей.Значение = НаборЗаписей;
		Если фОбъект.мРежимМенеджераЗаписи Тогда
			ПоместитьСтрокуНабораВТаблицуРеквизитов(ДанныеИзБД);
		КонецЕсли; 
		ирКлиент.ТабличноеПолеСОтборомПросмотраУстановитьДанныеЛкс(ЭтаФорма, ЭлементыФормы.НаборЗаписей, Ложь);
		НастроитьТабличноеПолеНабораЗаписей();
		МодифицированностьОбъекта = СтруктураОбъекта.Методы.Модифицированность();
		Для Каждого ЭлементОтбора Из СтруктураОбъекта.Методы.Отбор Цикл
			СтрокаТаблицы = ТаблицаОтбора.НайтиСтроки(Новый Структура("ИмяПоля", ЭлементОтбора.Имя))[0];
			СтрокаТаблицы.ЗначениеЧтения = ЭлементОтбора.Значение; 
		КонецЦикла;
	КонецЕсли; 
	Если фОбъект.ЭтоСсылочныйОбъект Или фОбъект.мРежимМенеджераЗаписи Или фОбъект.ЭтоКонстанта Тогда
		ирКлиент.ТабличноеПолеВосстановитьСостояниеСтрокЛкс(ЭлементыФормы.РеквизитыТаблица, СостояниеРеквизитыТаблица);
		//Если СтараяТекущаяСтраницаОбъекта <> Неопределено Тогда
		//	НоваяТекущаяСтраница = ЭлементыФормы.ПанельОбъект.Страницы.Найти(СтараяТекущаяСтраницаОбъекта);
		//	Если НоваяТекущаяСтраница <> Неопределено Тогда
		//		ЭлементыФормы.ПанельОбъект.ТекущаяСтраница = НоваяТекущаяСтраница;
		//	КонецЕсли; 
		//КонецЕсли; 
	Иначе
		Если СтруктураКлючаТекущейСтроки <> Неопределено Тогда
			ПоказатьЯчейкуДанныхОбъекта(, , СтруктураКлючаТекущейСтроки, Ложь);
		КонецЕсли; 
	КонецЕсли; 
	ОбновитьВерсииОбъекта();
	ЭтаФорма.Модифицированность = МодифицированностьОбъекта И Не ДанныеИзБД;
	ПанельОбъектаПриСменеСтраницы();
	ПриАктивизацииСтрокиСтраницыДвижений(Ложь);
	Возврат Истина;

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

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

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

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

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

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

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

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

Процедура ЗагрузитьТаблицыТЧ(Знач СтруктураОбъекта = Неопределено, Знач СтруктураТЧ = Неопределено, ВосстанавливатьТекущуюСтроку = Истина)
	
	Если СтруктураОбъекта = Неопределено Тогда
		Возврат
	КонецЕсли;
	Если ВосстанавливатьТекущуюСтроку Тогда
		ТекущаяСтрока = ЭлементыФормы.СтраницыПанельТабличныеЧасти.ТекущаяСтрока;
		Если ТекущаяСтрока <> Неопределено Тогда
			СтарыйКлючСтрокиТЧ = ирКлиент.ТабличноеПолеКлючСтрокиЛкс(ЭлементыФормы[ТекущаяСтрока.ИмяСтраницы], 0);
		КонецЕсли; 
	КонецЕсли; 
	ТабличноеПолеСтраниц = ЭлементыФормы.СтраницыПанельТабличныеЧасти;
	ТаблицаСтраниц = ирОбщий.ДанныеЭлементаФормыЛкс(ТабличноеПолеСтраниц);
	Для Каждого ЭлементТЧ Из СтруктураТЧ Цикл
		ИмяТабличнойЧасти = ЭлементТЧ.Ключ;
		СтрокаСтраницы = фОбъект.СтраницыТабличныеЧасти.Найти(ИмяТабличнойЧасти, "Имя");
		ТаблицаДанныхПоля = ирОбщий.СкопироватьТаблицуЛкс(СтруктураОбъекта.Данные[ИмяТабличнойЧасти]);
		УдалитьКолонкуНомерСтрокиВТаблицеЗначений(ТаблицаДанныхПоля);
		УстановитьДанныеТабличнойЧастиВФорме(СтрокаСтраницы, ТаблицаДанныхПоля);
		
		// Сразу заполним количество, чтобы после завершения потока кода не сбросилась текущая строка при отборе по количеству
		СтрокаСтраницы.Количество = ТаблицаДанныхПоля.Количество(); 
		СтрокаСтраницы.Непустая = СтрокаСтраницы.Количество > 0;
	КонецЦикла;
	Если СтарыйКлючСтрокиТЧ <> Неопределено Тогда
		ирКлиент.ТабличноеПолеВосстановитьТекущуюСтрокуЛкс(ЭлементыФормы[ЭлементыФормы.СтраницыПанельТабличныеЧасти.ТекущаяСтрока.ИмяСтраницы], СтарыйКлючСтрокиТЧ);
	КонецЕсли; 
	ОтобратьСтраницыТабличныхЧастей(); // Антибаг платформы 8.3.18. Отбор не перефильтрует строки. Надо явно это вызвать. https://www.hostedredmine.com/issues/930380
	ПриАктивизацииСтрокиСтраницыТабличныхЧастей(Ложь);
	
КонецПроцедуры

Процедура УстановитьДанныеТабличнойЧастиВФорме(Знач СтрокаСтраницы, ТаблицаДанныхПоля)
	
	ПанельТабличныеЧасти = ЭлементыФормы.ПанельТабличныеЧасти;
	УдалитьКолонкуНомерСтрокиВТаблицеЗначений(ТаблицаДанныхПоля);
	ТабличноеПолеТЧ = ЭлементыФормы[СтрокаСтраницы.ИмяСтраницы];
	ТабличноеПолеТЧ.Значение = ТаблицаДанныхПоля;
	ПанельТабличныеЧасти.Страницы["Страница" + СтрокаСтраницы.ИмяСтраницы].Значение.Вставить("ТаблицаЗначений", ТаблицаДанныхПоля);

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

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

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

Процедура ЗаполнитьИндексыКартинокТаблицыРеквизитов(Объект, ЗаполнятьПорядок = Истина)

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

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

Процедура ЗаполнитьСвязанныеДанные()

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

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

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

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

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

Процедура ОбработатьПараметрОткрытияИскомоеЗначение()
	
	Если фОбъект.ПараметрИскомоеЗначение <> Неопределено Тогда
		НайтиЗначениеВОбъекте(фОбъект.ПараметрИскомоеЗначение);
		фОбъект.ПараметрИскомоеЗначение = Неопределено;
	КонецЕсли;

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

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

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

// Параметры
//   КлючИлиОбъект - СтруктураОбъектаБД, Ссылка, ОбъектБД
Процедура ЗагрузитьОбъектПоКлючу(Знач КлючИлиОбъект) Экспорт 
	
	Если Не мПроверитьМодифицированность() Тогда
		Возврат;
	КонецЕсли;
	Если ТипЗнч(КлючИлиОбъект) = Тип("Структура") И КлючИлиОбъект.Свойство("ПолноеИмяТаблицы") Тогда
		НовоеИмяОсновнойТаблицы = КлючИлиОбъект.ПолноеИмяТаблицы;
		Если ирОбщий.ЛиТипВложеннойТаблицыБДЛкс(ирОбщий.ТипТаблицыБДЛкс(НовоеИмяОсновнойТаблицы)) Тогда
			НовоеИмяОсновнойТаблицы = ирОбщий.СтрокаБезПоследнегоФрагментаЛкс(НовоеИмяОсновнойТаблицы);
			КлючИлиОбъект = КлючИлиОбъект.Структура[ирОбщий.ПеревестиСтроку("Ссылка")];
		КонецЕсли;
	Иначе
		НовоеИмяОсновнойТаблицы = ирКэш.ИмяТаблицыИзМетаданныхЛкс(ирОбщий.ПолучитьПолноеИмяМДТипаЛкс(ирОбщий.ТипОбъектаБДЛкс(КлючИлиОбъект)),, Ложь);
	КонецЕсли; 
	Если ирОбщий.ЛиСсылкаНаОбъектБДЛкс(КлючИлиОбъект, Ложь) Тогда
		УстановитьСсылкуОбъекта(КлючИлиОбъект);
	КонецЕсли;
	ТаблицаИзменилась = ИмяОсновнойТаблицы <> НовоеИмяОсновнойТаблицы;
	УстановитьТаблицуБД(НовоеИмяОсновнойТаблицы, Истина); // Здесь будет прочитан объект, если имя таблицы изменилось
	Если Не ЗначениеЗаполнено(ИмяОсновнойТаблицы) Тогда
		Возврат;
	КонецЕсли; 
	Если Ложь
		Или Не ТаблицаИзменилась 
		Или Не ирОбщий.ЛиСсылкаНаОбъектБДЛкс(КлючИлиОбъект)
	Тогда
		Если ТипЗнч(КлючИлиОбъект) = Тип("Структура") Тогда
			Если КлючИлиОбъект.Свойство("ПолноеИмяТаблицы") Тогда
				мСтруктураОбъектаБД = Новый Структура;
				мСтруктураОбъектаБД.Вставить("Данные", КлючИлиОбъект);
				мСтруктураОбъектаБД.Вставить("Методы", КлючИлиОбъект.Структура);
			Иначе
				мСтруктураОбъектаБД = КлючИлиОбъект;
			КонецЕсли; 
		ИначеЕсли ирОбщий.ЛиСсылкаНаОбъектБДЛкс(КлючИлиОбъект, Ложь) Тогда // TODO Убрать дублирование
			Если мСтруктураОбъектаБД = Неопределено Тогда // Оптимизация https://www.hostedredmine.com/issues/879371
				мСтруктураОбъектаБД = ПолучитьОсновнойОбъектИзБД(Истина);
			КонецЕсли; 
		Иначе
			мСтруктураОбъектаБД = Новый Структура;
			мСтруктураОбъектаБД.Вставить("Данные", КлючИлиОбъект);
			мСтруктураОбъектаБД.Вставить("Методы", КлючИлиОбъект);
		КонецЕсли; 
		Если фОбъект.ЭтоСсылочныйОбъект Тогда
			// TODO Убрать дублирование
			Если ирОбщий.ЛиСсылкаНаОбъектБДЛкс(КлючИлиОбъект, Ложь) Тогда
				НоваяСсылка = КлючИлиОбъект;
			Иначе
				НоваяСсылка = мСтруктураОбъектаБД.Методы.Ссылка;
			КонецЕсли; 
			УстановитьСсылкуОбъекта(НоваяСсылка);
		ИначеЕсли фОбъект.ЭтоКонстанта Тогда
		Иначе
			ЗагрузитьЗначенияОтбораИзНабораЗаписейИлиКлючаЗаписи(мСтруктураОбъектаБД.Методы);
		КонецЕсли; 
		КлючИлиОбъект = мСтруктураОбъектаБД.Методы;
		Если фОбъект.ПараметрПрочитатьОбъект Тогда
			Если фОбъект.ЭтоСсылочныйОбъект Тогда
				ВыбОбъектПриИзменении();
			Иначе
				ПеречитатьДанные();
				Если ирОбщий.ЛиКлючЗаписиРегистраЛкс(КлючИлиОбъект) Тогда
					ПоказатьСтрокуНабораЗаписей(КлючИлиОбъект);
				КонецЕсли; 
			КонецЕсли;
		Иначе
			ПоместитьДанныеОбъектаВФорму(мСтруктураОбъектаБД, Ложь);
		КонецЕсли;
	КонецЕсли;
	фОбъект.ПараметрКлючИлиОбъект = Неопределено;

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

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

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

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

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

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

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

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

Функция ПолучитьИзмененныйОбъект(выхВерсияДанныхИзменена = Ложь)

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

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

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

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

Процедура ПоместитьТаблицуРеквизитовВОбъект(Объект, выхВерсияДанныхИзменена = Ложь)
	
	ИмяПоляСсылка = "";
	Для каждого СтрокаРеквизита из РеквизитыТаблица Цикл
		//МетаРеквизит = мПоляТаблицыБД.Найти(СтрокаРеквизита.ИмяРеквизита, "Имя").Метаданные;
		//Если Истина
		//	И МетаРеквизит <> Неопределено
		//	И Не МетаРеквизит.Тип.СодержитТип(ТипЗнч(СтрокаРеквизита.ЗначениеРеквизита))
		//	И СообщатьОПотерях
		//Тогда
		//	ирОбщий.СообщитьЛкс("Значение реквизита """ + СтрокаРеквизита.ИмяРеквизита + """ не изменено (несовместимые типы)", СтатусСообщения.Информация);
		//	Продолжить;
		//КонецЕсли;
		Если Истина
			И СтрокаРеквизита.ИмяРеквизита = "ВерсияДанных" 
			И СокрП(Объект[СтрокаРеквизита.ИмяРеквизита]) <> СокрП(СтрокаРеквизита.РасширенноеЗначение)
		Тогда
			выхВерсияДанныхИзменена = Истина;
		КонецЕсли;
		Если Ложь
			Или Не СтрокаРеквизита.РазрешеноИзменение 
			Или СтрокаРеквизита.ИмяРеквизита = "ИдентификаторСсылкиЛкс"
		Тогда
			Продолжить;
		КонецЕсли;
		НовоеЗначение = СтрокаРеквизита.РасширенноеЗначение;
		Попытка
			Если ЗначениеЗаполнено(СтрокаРеквизита.ДопРеквизит) Тогда
				ирОбщий.УстановитьЗначениеДопРеквизитаБСПЛкс(Объект, СтрокаРеквизита.ДопРеквизит, СтрокаРеквизита.РасширенноеЗначение, ИмяПоляСсылка, Истина, Ложь);
			Иначе
				Объект[СтрокаРеквизита.ИмяРеквизита] = НовоеЗначение;
			КонецЕсли; 
		Исключение
			Если Истина
				И СтрокаРеквизита.ИмяРеквизита = "ИмяПредопределенныхДанных"
				И ирОбщий.РежимСовместимостиМеньше8_3_4Лкс()
				И ирОбщий.ЛиКорневойТипОбъектаСПредопределеннымЛкс(ирОбщий.ПервыйФрагментЛкс(ИмяОсновнойТаблицы))
			Тогда
				//
			Иначе
				ОписаниеОшибки = ОписаниеОшибки();
				Если Истина
					// Поддержка языка системы RU, EN. 
					// Тест: Метаданные.HTTPСервисы = 1;
					И Найти(ОписаниеОшибки, "Поле объекта недоступно для записи") = 0 
					И Найти(ОписаниеОшибки, "Object field is not writable") = 0
					И Найти(ОписаниеОшибки, "Поле об`єкту недоступне для запису") = 0 // Украинский
				Тогда
					ирОбщий.СообщитьЛкс("Не удалось установить значение реквизита """ + СтрокаРеквизита.ИмяРеквизита + """: " + ОписаниеОшибки, СтатусСообщения.Внимание);
				КонецЕсли; 
			КонецЕсли; 
		КонецПопытки;
	КонецЦикла;

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

// Процедура заполняет реквизиты и табличные части из таблиц на форме и записывает объект
Функция ЗаписатьОбъект(Знач РежимЗаписи, ОбратимаяЗапись = Ложь)
	
	ВерсияДанныхИзменена = Ложь;
	СтруктураОбъекта = ПолучитьИзмененныйОбъект(ВерсияДанныхИзменена);
	Если ВерсияДанныхИзменена Тогда
		Ответ = Вопрос("С момента чтения объекта он был изменен вне редактора. Продолжение откатит эти изменения.", РежимДиалогаВопрос.ОКОтмена,, КодВозвратаДиалога.Отмена);
		Если Ответ = КодВозвратаДиалога.Отмена Тогда
			Возврат Неопределено;
		КонецЕсли;
	КонецЕсли; 
	Если Истина
		И Не Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(фОбъект.ВыбОбъект)) 
		И ТипЗнч(РежимЗаписи) = Тип("РежимЗаписиДокумента")
	Тогда
		РежимЗаписи = Неопределено;
	КонецЕсли;
	Если ЭтоНаборЗаписей Тогда
		РежимЗаписи = Не ЗаписьБезЗамещения;
	КонецЕсли; 
	лОчищатьПоОтборуЧтения = Не фОбъект.ЭтоСсылочныйОбъект И Не фОбъект.ЭтоКонстанта И фОбъект.ОчищатьПоОтборуЧтения И фОбъект.мСчитанНепустойНаборЗаписей;
	Если лОчищатьПоОтборуЧтения Тогда
		ОтборЧтения = Новый Структура;
		Для Каждого СтрокаТаблицы Из ТаблицаОтбора.НайтиСтроки(Новый Структура("Использование", Истина)) Цикл
			ОтборЧтения.Вставить(СтрокаТаблицы.ИмяПоля, СтрокаТаблицы.ЗначениеЧтения);
		КонецЦикла;
		НачатьТранзакцию();
		СтруктураОбъектаЧтения = ирОбщий.ОбъектБДПоКлючуЛкс(ИмяОсновнойТаблицы, ОтборЧтения,, Ложь);
		ирОбщий.ЗаписатьОбъектЛкс(СтруктураОбъектаЧтения.Методы, , РежимЗаписи);
	КонецЕсли;
	// Временное хранилище пока нельзя использовать для этой цели из-за ошибки платформы https://www.hostedredmine.com/issues/957168
	//АдресСообщений = ПоместитьВоВременноеХранилище(Новый Массив, Новый УникальныйИдентификатор);
	АдресСообщений = "ОшибкиЗаписиОбъекта";
	ирОбщий.СохранитьЗначениеЛкс(АдресСообщений, Неопределено);
	Попытка
		ирОбщий.ЗаписатьОбъектЛкс(СтруктураОбъекта.Методы, , РежимЗаписи,,,,,,, АдресСообщений);
		Если фОбъект.ЭтоСсылочныйОбъект Тогда
			Если Не ОбратимаяЗапись Тогда
				УстановитьСсылкуОбъекта(СтруктураОбъекта.Методы.Ссылка);
			КонецЕсли; 
			СписокСвойств = ирОбщий.ДопРеквизитыБСПОбъектаЛкс(фОбъект.ВыбОбъект);
			Если СписокСвойств.Количество() > 0 Тогда
				НачатьТранзакцию();
				Попытка
					Блокировка = Новый БлокировкаДанных;
					ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДополнительныеСведения");
					ЭлементБлокировки.УстановитьЗначение("Объект", СтруктураОбъекта.Методы.Ссылка);
					Блокировка.Заблокировать();
					Запрос = Новый Запрос;
					Запрос.Текст = "
					|ВЫБРАТЬ
					|	*
					|ИЗ
					|	РегистрСведений.ДополнительныеСведения 
					|ГДЕ Объект = &Ссылка
					|";
					Запрос.УстановитьПараметр("Ссылка", СтруктураОбъекта.Методы.Ссылка);
					ТаблицаДопСведения = Запрос.Выполнить().Выгрузить(); 
					ИмяПоляСсылка = "";
					Для Каждого СтрокаРеквизита Из РеквизитыТаблица Цикл
						Если ЗначениеЗаполнено(СтрокаРеквизита.ДопРеквизит) Тогда
							ирОбщий.УстановитьЗначениеДопРеквизитаБСПЛкс(СтруктураОбъекта.Методы, СтрокаРеквизита.ДопРеквизит, СтрокаРеквизита.РасширенноеЗначение, ИмяПоляСсылка, Ложь, Истина, ТаблицаДопСведения);
						КонецЕсли; 
					КонецЦикла;
					СтруктураНабораЗаписей = ирОбщий.ОбъектБДПоКлючуЛкс("РегистрСведений.ДополнительныеСведения"); 
					СтруктураНабораЗаписей.Методы.Отбор.Объект.Установить(СтруктураОбъекта.Методы.Ссылка);
					СтруктураНабораЗаписей.Методы.Загрузить(ТаблицаДопСведения);
					ирОбщий.ЗаписатьОбъектЛкс(СтруктураНабораЗаписей.Методы);
					ЗафиксироватьТранзакцию();
				Исключение
					ОтменитьТранзакцию();
					ВызватьИсключение;
				КонецПопытки;
			КонецЕсли; 
		КонецЕсли; 
	Исключение
		ОтобразитьОшибкиЗаполнения(АдресСообщений);
		Если лОчищатьПоОтборуЧтения Тогда
			ОтменитьТранзакцию();
		КонецЕсли;
		ВызватьИсключение;
	КонецПопытки; 
	Если лОчищатьПоОтборуЧтения Тогда
		ЗафиксироватьТранзакцию();
	КонецЕсли; 
	//Если Не ОбратимаяЗапись И СообщитьИмяТаблицы Тогда
	//	ирОбщий.СообщитьЛкс("Записываем " + Объект);
	//КонецЕсли; 
	Если фОбъект.ЭтоСсылочныйОбъект Тогда
		Результат = СтруктураОбъекта.Методы.Ссылка;
		Если Не ЗначениеЗаполнено(Результат) Тогда
			ВызватьИсключение "Ошибка получения ссылки записанного объекта";
		КонецЕсли; 
	Иначе
		Результат = Неопределено;
	КонецЕсли; 
	Возврат Результат;
	
КонецФункции

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

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

Функция ПолучитьИмяТаблицыФормыРегистра(ПолноеИмяМД) Экспорт 
	
	ИмяТаблицыРегистра = фОбъект.мПрефиксИмениТабличногоПоляДвижения + СтрЗаменить(ПолноеИмяМД, ".", "_");
	Возврат ИмяТаблицыРегистра;

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

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

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

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

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

Процедура КнопкаПровестиНажатие(Элемент)
	
	Ответ = Вопрос("Вы действительно хотите провести документ "+Строка(фОбъект.ВыбОбъект)+" ?", РежимДиалогаВопрос.ДаНет, 30, КодВозвратаДиалога.Нет, "Провести документ?");
	Если Ответ <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	КнопкаЗаписатьНажатие(, РежимЗаписиДокумента.Проведение);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

Функция мПроверитьМодифицированность()

	Отказ = Ложь;
	Если Модифицированность Тогда
		ирКлиент.ПередОтображениемДиалогаПередЗакрытиемФормыЛкс(ЭтаФорма);
		Ответ = Вопрос("Данные были изменены. Продолжить НЕ сохраняя изменения?", РежимДиалогаВопрос.ОКОтмена);
		Если Ответ = КодВозвратаДиалога.Отмена Тогда
			Отказ = Истина;
		КонецЕсли;
	КонецЕсли;
	Возврат Не Отказ;

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

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

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

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

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

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

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

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

Процедура РеквизитыТаблицаПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	Если Не ЗначениеЗаполнено(ИмяОсновнойТаблицы) Тогда
		// Плавающая ошибка на 8.3.19 https://github.com/tormozit/RDT1C/issues/49
		Возврат;
	КонецЕсли; 
	
	// Для ускорения
	//КнопкаИдентификаторы = ЭлементыФормы.ОсновныеДействияФормы.Кнопки.ПодменюТекущаяТаблица.Кнопки.Идентификаторы;
	КнопкаИдентификаторы = мКнопкаИдентификаторы;
	
	ЦветФонаТекущегоЗначения = ирОбщий.ЦветФонаТекущегоЗначенияЛкс();
	Если Не СтрокуРевизитаРазрешеноРедактировать(ДанныеСтроки) Тогда 
		ОформлениеСтроки.Ячейки.ЗначениеРеквизита.ТолькоПросмотр = Истина;
	КонецЕсли;
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки, КнопкаИдентификаторы, "ЗначениеРеквизита",
		Новый Структура("ЗначениеРеквизита", "РасширенноеЗначение"), Истина,, "ЗначениеРеквизита");
	Если ДанныеСтроки.ПризнакМодификации Тогда
		ОформлениеСтроки.Ячейки.ЗначениеРеквизита.ЦветТекста = WebЦвета.КожаноКоричневый;
	КонецЕсли; 
	Если ДанныеСтроки.ЛиСтрокаНеограниченнойДлины Тогда
		ОформлениеСтроки.Ячейки.ЗначениеРеквизита.ЦветФона = фОбъект.ЦветФонаСтрокиНеограниченноДлины;
	КонецЕсли; 
	Если ПараметрСтрокиПоиска <> Неопределено И Не ЗначениеЗаполнено(ДанныеСтроки.ДопРеквизит) Тогда
		СловаПоиска = Новый Массив;
		Если ПараметрСтрокиПоиска.Свойство(ДанныеСтроки.ИмяРеквизита, СловаПоиска) Тогда 
			ТекстРеквизита = НРег(ОформлениеСтроки.Ячейки.ЗначениеРеквизита.Текст);
			Для Каждого Слово Из СловаПоиска Цикл
				Если Найти(ТекстРеквизита, Нрег(Слово)) > 0 Тогда 
					ОформлениеСтроки.Ячейки.ЗначениеРеквизита.ЦветФона = ЦветФонаТекущегоЗначения;
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;
	Если ДанныеСтроки.ФункциональныеОпцииНеВключены Тогда
		ОформлениеСтроки.Ячейки.ФункциональныеОпции.ЦветТекста = WebЦвета.Красный;
	КонецЕсли; 
	Если Не ДанныеСтроки.ПросмотрТипов Тогда
		ОформлениеСтроки.Ячейки.ОписаниеТипов.ЦветТекста = WebЦвета.Красный;
		ОформлениеСтроки.Ячейки.ИмяТипаЗначения.ЦветТекста = WebЦвета.Красный;
		ОформлениеСтроки.Ячейки.ТипЗначения.ЦветТекста = WebЦвета.Красный;
	КонецЕсли; 
	ОтметкаНезаполненного = ДанныеСтроки.Обязательный И Не ЗначениеЗаполнено(ДанныеСтроки.ЗначениеРеквизита);
	КлючПоиска = Новый Структура("Реквизит, ТаблицаОбъекта", ДанныеСтроки.ИмяРеквизита, "");
	НайденныеЭлементы = ПоискВОбъекте.НайтиСтроки(КлючПоиска);
	Если НайденныеЭлементы.Количество() > 0 Тогда
		НайденныйЭлемент = НайденныеЭлементы[0];
		#Если Сервер И Не Сервер Тогда
			НайденныйЭлемент = ПоискВОбъекте.Добавить();
		#КонецЕсли
		Если ЗначениеЗаполнено(НайденныйЭлемент.Сообщение) Тогда
			ЦветФонаЯчейки = ирОбщий.ЦветФонаОшибкиЛкс();
		Иначе
			ЦветФонаЯчейки = ЦветФонаТекущегоЗначения;
		КонецЕсли;
		ОформлениеСтроки.Ячейки.ЗначениеРеквизита.ЦветФона = ЦветФонаЯчейки;
		Если ЗначениеЗаполнено(НайденныйЭлемент.Сообщение) Тогда
			ОтметкаНезаполненного = Не ЗначениеЗаполнено(ДанныеСтроки.ЗначениеРеквизита);
		КонецЕсли;
	КонецЕсли;
	ОформлениеСтроки.Ячейки.ЗначениеРеквизита.ОтметкаНезаполненного = ОтметкаНезаполненного;
	Если ЗначениеЗаполнено(ДанныеСтроки.ДопРеквизит) Тогда
		ирКлиент.ОформитьСтрокуДопРеквизитаБСПЛкс(ОформлениеСтроки);
	КонецЕсли;
	РежимИдентификаторов = КнопкаИдентификаторы.Пометка;
	Если Истина
		И Не РежимИдентификаторов 
		И ЛиРежимПароляСтрокиРеквизита(ДанныеСтроки) 
	Тогда
		ОформлениеСтроки.Ячейки.ЗначениеРеквизита.УстановитьТекст("*****");
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

Процедура УстановитьСсылкуОбъекта(НоваяСсылка)
	
	фОбъект.ВыбОбъект = НоваяСсылка;
	ОбновитьСсылкуОбъектаВПоле();
	
КонецПроцедуры

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

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

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

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

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

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

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

Процедура РеквизитыТаблицаПриИзмененииФлажка(Элемент, Колонка)
	
	ирКлиент.ТабличноеПолеПриИзмененииФлажкаЛкс(ЭтаФорма, Элемент, Колонка);
	
КонецПроцедуры

Процедура РеквизитыТаблицаЗначениеРеквизитаОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка, ТекстАвтоПодбора = Неопределено)

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

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

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

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

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

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

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

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

Процедура СтраницыДвиженияПриАктивизацииСтроки(Элемент)
	
	ПриАктивизацииСтрокиСтраницыДвижений();
	
КонецПроцедуры

Процедура СтраницыДвиженияПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	ОформлениеСтроки.Ячейки.ТипРегистра.ОтображатьКартинку = Истина;
	ОформлениеСтроки.Ячейки.ТипРегистра.ИндексКартинки = ДанныеСтроки.ТипРегистраКартинка;
	
КонецПроцедуры

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

Процедура ОбновитьОтборСтрокСпискаДвижений(НовоеИспользованиеОтбора)

	ЭлементыФормы.КП_СтраницыДвижения.Кнопки.ДвиженияСкрыватьПустые.Пометка = НовоеИспользованиеОтбора;
	ЭлементОтбора = ЭлементыФормы.СтраницыПанельДвижения.ОтборСтрок.Непустая;
	ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
	ЭлементОтбора.Использование = НовоеИспользованиеОтбора;
	ЭлементОтбора.Значение = Истина;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция ПолучитьПостроительИзмененийТаблицы()
	
	ПостроительЗапроса = Новый ПостроительЗапроса;
	Попытка
		ПостроительЗапроса.Текст = "
		|ВЫБРАТЬ 
		|	* 
		//|ИЗ " + ИмяОсновнойТаблицы + ".Изменения"; // Так платформа выдает ошибку на таблицах перерасчетов
		|ИЗ " + ИмяОсновнойТаблицы + ".Изменения КАК _Изменения_";
	Исключение
		// В планы обмена таблица не входит
		Возврат Неопределено;
	КонецПопытки; 
	ПостроительЗапроса.ЗаполнитьНастройки();
	Возврат ПостроительЗапроса;
	
КонецФункции

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

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

Процедура ЗаполнитьКлючСтрокиТаблицыЗначений(Знач СтруктураКлюча, Знач ТекущаяСтрока) 
	
	#Если Сервер И Не Сервер Тогда
		СтруктураКлюча = Новый Структура;
	#КонецЕсли
	ЗаполнитьЗначенияСвойств(СтруктураКлюча, ТекущаяСтрока); 
	Если СтруктураКлюча.Свойство("НомерСтроки") Тогда
		СтруктураКлюча.НомерСтроки = ТекущаяСтрока.Владелец().Индекс(ТекущаяСтрока) + 1;
	КонецЕсли;

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

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

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

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

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

Процедура КоманднаяПанельДеревоУзловОбновить(Кнопка)
	
	ОбновитьПометкиДереваУзлов();
	
КонецПроцедуры

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

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

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

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

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

Функция ТаблицаЗначенийДвижения(Знач ПолноеИмяРегистра)
	
	ИмяТабличногоПоляРегистра = ПолучитьИмяТаблицыФормыРегистра(ПолноеИмяРегистра);
	Возврат ЭлементыФормы.ПанельДвижения.Страницы["Страница" + ИмяТабличногоПоляРегистра].Значение.ТаблицаЗначений;

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

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

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

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

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

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

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

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

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

Процедура ЛиТаблицыИзмененийПриИзменении(Элемент)
	
	ЗаполнитьСвязанныеДанные();
	
КонецПроцедуры

Процедура ТолькоНепустыеПриИзменении(Элемент = Неопределено)
	
	СвязанныеДанныеТолькоНепустыеПриИзменении(ЭтаФорма);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ОсновныеДействияФормыНайтиВСписке(Кнопка)
	
	НайтиТекущуюСтрокуВДинамическомСписке(Ложь);
	
КонецПроцедуры

Процедура ОсновныеДействияФормыНайтиВДинамическомСписке(Кнопка)
	
	НайтиТекущуюСтрокуВДинамическомСписке(Истина);
	
КонецПроцедуры

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

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

Процедура СвязанныеДанныеПриАктивизацииСтроки(Элемент = Неопределено)

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

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

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

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

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

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

Процедура КоманднаяПанельСтрокиТаблицыБДОбновить(Кнопка)
	

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

Процедура ЛиТабличныеЧастиПриИзменении(Элемент)
	
	ЗаполнитьСвязанныеДанные();

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

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

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

	ирКлиент.ПослеЗагрузкиВыборкиВТабличноеПолеЛкс(ЭтаФорма, мВыборкаРезультатаСтрокиТаблицы, ЭлементыФормы.КоманднаяПанельСтрокиТаблицыБД, ЭлементыФормы.КоличествоСтрокТаблицыБД);

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

Процедура КоманднаяПанельСтрокиТаблицыБДЗагрузитьПолностью(Кнопка)
	
	ирКлиент.ЗагрузитьВыборкуВТабличноеПолеПолностьюЛкс(ЭтаФорма, мВыборкаРезультатаСтрокиТаблицы, ЭлементыФормы.КоманднаяПанельСтрокиТаблицыБД);

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

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

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

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

Процедура ОбновитьСсылкуОбъектаВПоле()

	ЭлементыФормы.ВыбОбъект.Значение = фОбъект.ВыбОбъект;
	ОбновитьНавигационнуюСсылку();
	ирКлиент.ФормаОбъекта_ОбновитьЗаголовокЛкс(ЭтаФорма);

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

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

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

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

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

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

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

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

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

Функция ПараметрыВыбораОбъектаМетаданных()
	Возврат ирКлиент.ПараметрыВыбораОбъектаМетаданныхЛкс(Истина,, Истина, Истина, Истина,,, Истина,,, Истина);
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ОсновныеДействияФормыУдалитьСКонтролемСсылок(Кнопка)
	
	ФормаОбработки = ирКлиент.ПолучитьФормуЛкс("Обработка.ирУдалениеОбъектовСКонтролемСсылок.Форма");
	Объекты = Новый Массив;
	Объекты.Добавить(фОбъект.ВыбОбъект);
	ФормаОбработки.ДобавитьМассивОбъектовВУдаляемыеОбъекты(Объекты);
	ФормаОбработки.Открыть();
	
КонецПроцедуры

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

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

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

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

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

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

Процедура ОсновныеДействияФормыПометитьНаУдаление(Кнопка)
	
	КнопкаЗаписатьНажатие(, "ПометкаУдаления");

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

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

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

	СвязанныеКолонкиИмяПредставлениеПриИзменении(ЭтаФорма);
	ПорядокРеквизитовПриИзменении();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ПолеВвода_АвтоПодборТекста(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)
	
	СтруктураОтбора = СтруктураОтбораВПолеВводаКолонкиРеквизита();
	ирКлиент.ПолеВвода_ОкончаниеВводаТекстаЛкс(Элемент, Текст,, СтандартнаяОбработка,,,, СтруктураОтбора, Истина);

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ОсновныеДействияФормыОткрытьОсновнуюФормуОбъектаПоСсылке(Кнопка)
	
	Если Истина
		И фОбъект.ЭтоСсылочныйОбъект
		И мПроверитьМодифицированность()
		И ЗначениеЗаполнено(фОбъект.ВыбОбъект) 
	Тогда
		Если ирОбщий.ЛиТипСсылкиВнешнейТаблицыЛкс(ТипЗнч(фОбъект.ВыбОбъект)) Тогда
			// https://www.hostedredmine.com/issues/917016
			ирКлиент.ОткрытьЗначениеЛкс(фОбъект.ВыбОбъект);
		Иначе
			ОсновнаяФормаОбъекта = фОбъект.ВыбОбъект.ПолучитьФорму();
			ОсновнаяФормаОбъекта.Открыть();
			ОсновнаяФормаОбъекта.ТолькоПросмотр = Ложь;
			АктивироватьТекущийРеквизитИлиТЧВФормеОбъекта(ОсновнаяФормаОбъекта);
		КонецЕсли; 
	КонецЕсли; 
	
КонецПроцедуры

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

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

Процедура СтраницыДвиженияВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	
	ОткрытьДинамичекийСписокДвижения(Ложь);
	
КонецПроцедуры

Процедура ОсновныеДействияФормыСправкаМетаданного(Кнопка)
	
	МетаданныеОбъекта = МетаданныеТаблицыБД();
	Если МетаданныеОбъекта <> Неопределено Тогда
		ОткрытьСправку(МетаданныеОбъекта);
	КонецЕсли; 
	
КонецПроцедуры

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

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

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

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

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

Процедура КП_СсылкиНаОбъектОбновить(Кнопка = Неопределено)

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

// Предопределеный метод
Процедура ПроверкаЗавершенияФоновыхЗаданий() Экспорт 
	
	ирКлиент.ПроверитьЗавершениеФоновыхЗаданийФормыЛкс(ЭтаФорма);
	
КонецПроцедуры

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

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

// Это надо делать в самом конце потока кода, чтобы пользователь мог прервать этот долгий процесс
Процедура ДополнительныеПоляПрочитатьПоля(Кнопка = Неопределено)
	
	ирКлиент.ОбновитьДоступныеПоляДляДополнительныхПолейЛкс(СсылкиНаОбъект, КомпоновщикДопПолей, ЭлементыФормы.ДоступныеПоляДополнительныхПолей);
	
	СтрокаПорядка = ирКлиент.ПрочитатьДополнительныеПоляСсылающихсяОбъектовЛкс(ЭлементыФормы.НайденныеСсылки, КомпоновщикДопПолей); 
	СсылкиНаОбъект.Сортировать(СтрокаПорядка);

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

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

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

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

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

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

Процедура НайтиИПоказатьСсылкиВФорме(НайденныеСсылки = Неопределено, РазрешитьАктивациюСтраницы = Истина) Экспорт 

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

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

Процедура ПриПолученииДанныхДоступныхПолей(Элемент, ОформленияСтрок)

	ирКлиент.ПриПолученииДанныхТабличногоПоляКомпоновкиЛкс(ЭтаФорма, Элемент, ОформленияСтрок,, ИмяСиноним);

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

Процедура ФильтрИменТабличныхЧастейАвтоПодборТекста(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)
	
	ОтобратьСтраницыТабличныхЧастей(Текст);

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

Процедура КП_СтраницыТабличныхЧастейСкрыватьПустые(Кнопка)
	
	ОбновитьОтборСтрокСпискаТабличныхЧастей(Не Кнопка.Пометка);
	Если Не Кнопка.Пометка Тогда 
		ирКлиент.ТабличноеПолеАктивироватьТекущуюСтрокуЕслиНеУстановленаЛкс(ЭлементыФормы.СтраницыПанельТабличныеЧасти);
	КонецЕсли;

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

Процедура ОбновитьОтборСтрокСпискаТабличныхЧастей(НовоеИспользованиеОтбора)
	
	ЭлементыФормы.КП_СтраницыТабличныхЧастей.Кнопки.ТабличныеЧастиСкрыватьПустые.Пометка = НовоеИспользованиеОтбора;
	ЭлементОтбора = ЭлементыФормы.СтраницыПанельТабличныеЧасти.ОтборСтрок.Непустая;
	ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
	ЭлементОтбора.Использование = НовоеИспользованиеОтбора;
	ЭлементОтбора.Значение = Истина;

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

Процедура СтраницыТабличныеЧастиПриАктивизацииСтроки(Элемент = Неопределено)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);
	ПриАктивизацииСтрокиСтраницыТабличныхЧастей();

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

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

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

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

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

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

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

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

Процедура СвязанныеДанныеПриИзмененииФлажка(Элемент, Колонка)
	
	ирКлиент.ТабличноеПолеПриИзмененииФлажкаЛкс(ЭтаФорма, Элемент, Колонка);
	
КонецПроцедуры

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

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

Процедура ОбновитьВерсииОбъекта()
	
	Если Не ЭлементыФормы.ПанельОсновная.Страницы.ВерсииОбъекта.Доступность Тогда
		Возврат;
	КонецЕсли; 
	ЭлементыФормы.КоманднаяПанельВерсии.Кнопки.ОтключитьОтборВерсий.Доступность = мОтборВерсий.Количество() > 0;
	ИсторияДанныхМоя = ирОбщий.ИсторияДанныхЛкс();
	#Если Сервер И Не Сервер Тогда
		ИсторияДанныхМоя = ИсторияДанных;
	#КонецЕсли
	КлючОбъекта = КлючОбъекта();
	ОбъектМД = МетаданныеТаблицыБД();
	Если Ложь
		Или Не ЗначениеЗаполнено(КлючОбъекта) И Не фОбъект.ЭтоКонстанта
		Или Не ПравоДоступа("ПросмотрИсторииДанных", ОбъектМД) 
		Или ирОбщий.РасширениеКонфигурацииОбъектаМДЛкс(ОбъектМД) <> Неопределено // 8.3.18 не поддерживает историю данных для таблиц из расширений http://www.hostedredmine.com/issues/881668
	Тогда
		Возврат;
	КонецЕсли; 
	ТекущиеДанные = ЭлементыФормы.ВерсииОбъекта.ТекущиеДанные;
	Если ТекущиеДанные <> Неопределено Тогда
		СтараяНомерВерсии = ТекущиеДанные.НомерВерсии;
	КонецЕсли; 
	ОтборВерсий = ирОбщий.СкопироватьКоллекциюЛкс(мОтборВерсий);
	ОтборВерсий.Вставить("Данные", КлючОбъекта);
	ТаблицаВерсий = ИсторияДанныхМоя.ВыбратьВерсии(ОтборВерсий,,"НомерВерсии Убыв" , 1000);
	ирОбщий.ПеревестиКолонкиСистемнойТаблицыЛкс(ТаблицаВерсий);
	ТаблицаВерсий.Колонки.Добавить("ИзмененныеПоля");
	ТаблицаВерсий.ЗаполнитьЗначения("?", "ИзмененныеПоля");
	фОбъект.ВерсииОбъекта.Загрузить(ТаблицаВерсий);
	Если СтараяНомерВерсии <> Неопределено Тогда
		НоваяТекущаяСтрока = ВерсииОбъекта.Найти(СтараяНомерВерсии, "НомерВерсии");
		Если НоваяТекущаяСтрока <> Неопределено Тогда
			ЭлементыФормы.ВерсииОбъекта.ТекущаяСтрока = НоваяТекущаяСтрока;
		КонецЕсли; 
	КонецЕсли; 

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

Процедура КоманднаяПанель_ВерсииОбновитьСписок(Кнопка)
	
	ОбновитьВерсииОбъекта();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

Функция ТаблицаВерсииОбъекта()
	
	ТаблицаНомераВерсий = фОбъект.ВерсииОбъекта.Выгрузить();
	Возврат ТаблицаНомераВерсий;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КП_СтраницыДвиженияДинамическойСписок(Кнопка)
	
	ОткрытьДинамичекийСписокДвижения(Истина);
	
КонецПроцедуры

Процедура КоманднаяПанельВерсииПереключательВеденияИстории(Кнопка)
	
	УстановитьПереключательВеденияИстории(Не ЭлементыФормы.КоманднаяПанельВерсии.Кнопки.ПереключательВеденияИстории.Пометка);
	
КонецПроцедуры

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

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

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

Функция МетаданныеТаблицыБД()
	
	ОбъектМД = ирКэш.ОбъектМДПоПолномуИмениЛкс(фОбъект.мПолноеИмяМД);
	Возврат ОбъектМД;

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

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

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

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

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

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

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

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

Процедура ВнешняяНавигационнаяСсылкаПриИзменении(Элемент)
	
	ОбновитьНавигационнуюСсылку();
	
КонецПроцедуры

Процедура НавигационнаяСсылкаОткрытие(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь; 
	Если Не ВнешняяНавигационнаяСсылка Тогда
		Возврат;
	КонецЕсли;
	Текст = "<a href=" + НавигационнаяСсылка + ">" + фОбъект.ВыбОбъект + "</a>";
	Форма = ирКлиент.ФормаПросмотраHTMLЛкс(Текст);
	Форма.ОткрытьМодально();
	
КонецПроцедуры

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

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

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

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

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

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

Процедура НаборЗаписейПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);
	
КонецПроцедуры

Процедура НаборЗаписейПриАктивизацииКолонки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивацииКолонкиЛкс(ЭтаФорма, Элемент);
	
КонецПроцедуры

Процедура ИскомыеСсылкиПередУдалением(Элемент, Отказ)
	
	Отказ = ТипЗнч(Элемент.ТекущаяСтрока.ИскомаяСсылка) = Тип("Строка");
	
КонецПроцедуры

Процедура ПриПовторномОткрытии(СтандартнаяОбработка)
	
	ОбработатьПараметрОткрытияИскомоеЗначение();
	
КонецПроцедуры

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

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

Процедура НаборЗаписейПриИзмененииФлажка(Элемент, Колонка)
	
	ирКлиент.ТабличноеПолеПриИзмененииФлажкаЛкс(ЭтаФорма, Элемент, Колонка);
	
КонецПроцедуры

Процедура РеквизитыТаблицаПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);

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

Процедура ПоискВОбъектеПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);

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

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

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

Процедура ИзмененияНаУзлахПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);

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

Процедура НайденныеСсылкиПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);

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

Процедура СтрокиТаблицыБДПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);

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

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

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

Процедура ВерсииОбъектаПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);

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

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

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

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

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

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

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

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

Процедура КонтекстныеМенюАнализПравДоступа(Кнопка)
	
	ОткрытьАнализПравДоступа(Истина);
	
КонецПроцедуры

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

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

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

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

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

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

Процедура КонтекстныеМенюНайтиВИсторииДанных(Кнопка)
	
	НайтиРеквизитВИсторииДанных();
	
КонецПроцедуры

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

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

Процедура СвязанныеДанныеИзбранноеПриИзменении(Элемент)

	СохранитьИзбранныеСвязи();

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

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

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

Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок) Экспорт 
	
	ирКлиент.ТабличноеПолеПриПолученииДанныхЛкс(ЭтаФорма, Элемент, ОформленияСтрок);

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

Процедура ОсновныеДействияФормыЗаписатьИЗакрыть(Кнопка)
	
	КнопкаЗаписатьНажатие();
	Закрыть();
	
КонецПроцедуры

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

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

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

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

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

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

Процедура ОсновныеДействияФормыОбучающееВидео(Кнопка)
	
	ЗапуститьПриложение("https://youtu.be/LxVyDFX-5dM");
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

Процедура ОтключитьОтборВерсий(Кнопка)
	мОтборВерсий = Новый Структура;
	ОбновитьВерсииОбъекта();
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КритерииОтбораПриАктивизацииСтроки(Элемент)
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);
	КП_СсылкиНаОбъектОбновить();
КонецПроцедуры

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

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

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

Процедура КонтекстныеМенюКолонкаБД(Кнопка = Неопределено)

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

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

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

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

Процедура ПорядокРеквизитовОчистка(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

Процедура КоманднаяПанельВерсииСравнитьСтроки(Кнопка)

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

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

Процедура КнопкаПараметрыПоискаНажатие(Кнопка)
	
	Форма = ирКлиент.ПолучитьФормуЛкс("Обработка.ирПлатформа.Форма.ПараметрыПоискаСсылок");
	РезультатФормы = Форма.ОткрытьМодально();
	Если РезультатФормы <> Неопределено Тогда
		ОбновитьКнопкуПараметровПоискаСсылок();
	КонецЕсли;
	
КонецПроцедуры

Процедура ОбновитьКнопкуПараметровПоискаСсылок()
	
	Кнопка = ЭлементыФормы.КП_СсылкиНаОбъект.Кнопки.ПараметрыПоиска;
	ирКлиент.ОбновитьКнопкуПараметровПоискаСсылокЛкс(Кнопка);

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

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирРедакторОбъектаБД.Форма.Форма");

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

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

