///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

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

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

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

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

#КонецОбласти
