Перем мВыборкаРезультатаСтрокиТаблицы;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ПеречитатьДанные(Знач СохранятьИдентификаторСсылки = Ложь, ТолькоМакет = Ложь)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ОбновитьТипЗначенияСсылки()

	ЭлементыФормы.ВыбОбъект.Значение = фОбъект.ВыбОбъект;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КП_ОтборУпорядочитьПоПредставлению(Кнопка)
	
	РеквизитыТаблица.Сортировать("Порядок, ПредставлениеРеквизита");
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	ирОбщий.ПриПолученииДанныхДоступныхПолейКомпоновкиЛкс(ОформленияСтрок);

КонецПроцедуры // ПриПолученииДанныхДоступныхПолей()


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ОбновитьЗаголовкиСтраниц()
	
	// В обычной форме это происходит через событие ОбновлениеОтображения
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КоманднаяПанель_ОткрытьОтчетПоВерсии(Кнопка = Неопределено)
	
	ТекущиеДанные = ЭлементыФормы.ВерсииОбъекта.ТекущиеДанные;
	ОткрытьФорму("sysForm:DataHistoryVersionData", Новый Структура("Data, VersionNumber", ПолучитьКлючОбъекта(Истина), ТекущиеДанные.НомерВерсии));
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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