Дополнительные настройки / Форма настроек / Модуль формы

файл

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

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

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


#Область ОбработчикиСобытийЭлементовШапкиФормы

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

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


#Область ОбработчикиСобытийЭлементовТаблицыФормыНастройкаПорядка

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

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

&НаКлиенте
Процедура НастройкаПорядкаИспользуетсяПриИзменении(Элемент)
	
	УстановитьПометку();
	
КонецПроцедуры

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


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

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

&НаСервере
Процедура ЗаписатьИЗакрытьНаСервере()
	
	РегистрыСведений.ДополнительныеНастройкиЗарплатаКадры.УстановитьНастройки(Запись);
	
КонецПроцедуры

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьИспользованиеПодчиненных(Родитель, Используется)
	
	Для каждого ЭлементДерева Из Родитель.ПолучитьЭлементы() Цикл
		ЭлементДерева.Используется = Используется;
	КонецЦикла;
	
КонецПроцедуры

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

&НаСервере
Процедура ПроверитьВыбранные()
	
	Для каждого СтрокаНастройкаПорядка Из НастройкаПорядка.ПолучитьЭлементы() Цикл
		СформироватьПредставление(СтрокаНастройкаПорядка);
	КонецЦикла;
	
КонецПроцедуры

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

&НаКлиентеНаСервереБезКонтекста
Функция ОписаниеУпорядочивания(НастройкаПорядка, НастройкаУпорядочиванияСпискаСотрудников = Неопределено)
	
	НастройкаУпорядочиванияСпискаСотрудников = "";
	
	Описание = "";
	НомерПорядка = 1;
	Для каждого СтрокаНастройкиПорядка Из НастройкаПорядка.ПолучитьЭлементы() Цикл
		
		Если СтрокаНастройкиПорядка.Используется Тогда
			
			Описание = ?(ПустаяСтрока(Описание), "", Описание + Символы.ПС)
				+ НомерПорядка + ". " + СтрокаНастройкиПорядка.Представление;
			
			НомерПорядка = НомерПорядка + 1;
			
			Для каждого СтрокаПоляПорядка Из СтрокаНастройкиПорядка.ПолучитьЭлементы() Цикл
				
				Если СтрокаПоляПорядка.Используется Тогда
					НастройкаУпорядочиванияСпискаСотрудников = ?(ПустаяСтрока(НастройкаУпорядочиванияСпискаСотрудников), "", НастройкаУпорядочиванияСпискаСотрудников + ",")
						+ СтрокаНастройкиПорядка.Имя + "." +  СтрокаПоляПорядка.Имя;
				КонецЕсли;
					
			КонецЦикла;
			
		КонецЕсли; 
		
	КонецЦикла;
	
	Если ПустаяСтрока(Описание) Тогда
		Описание = НСтр("ru='Упорядочивание не используется'")
	КонецЕсли;
	
	Возврат Описание;
	
КонецФункции

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

Связанные материалы