Перем Колонки;

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

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

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

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

Процедура ЗагрузитьДанныеСтрокиБезПараметров()
	
	ЗагрузитьДанныеСтроки();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ПриЗакрытии()
	
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);

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

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

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

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

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

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

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

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

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

Процедура ДействияФормыСледующаяСтрока(Кнопка)
	ТабличноеПоле = КлючУникальности; // РасширениеТабличногоПоляТаблицыЗначений
	Если ТабличноеПоле.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ИндексТекущейСтроки = ТабличноеПоле.Значение.Индекс(ТабличноеПоле.ТекущаяСтрока);
	Если ИндексТекущейСтроки < ТабличноеПоле.Значение.Количество() - 1 Тогда
		ИндексТекущейСтроки = ИндексТекущейСтроки + 1;
		ТабличноеПоле.ТекущаяСтрока = ТабличноеПоле.Значение[ИндексТекущейСтроки];
	КонецЕсли;
КонецПроцедуры

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

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