#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
Если НЕ ПолучитьФункциональнуюОпциюФормы("ИспользоватьКадровыйУчет")
И НЕ ПолучитьФункциональнуюОпциюФормы("ИспользоватьНачислениеЗарплаты")Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
ДоступноИзменениеНастроек = ПравоДоступа("Изменение", Метаданные.РегистрыСведений.ДополнительныеНастройкиЗарплатаКадры);
ЗаполнитьЗначенияСвойств(Запись, РегистрыСведений.ДополнительныеНастройкиЗарплатаКадры.ВсеНастройки());
УстановитьДерево();
ПроверитьВыбранные();
СписокСотрудниковУпорядочивается = ОписаниеУпорядочивания(НастройкаПорядка);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура ЗаписатьИЗакрыть(Команда)
ЗаписатьИЗакрытьНаСервере();
ОбновитьПовторноИспользуемыеЗначения();
Закрыть();
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыНастройкаПорядка
&НаКлиенте
Процедура НастройкаПорядкаПриИзменении(Элемент)
СписокСотрудниковУпорядочивается = ОписаниеУпорядочивания(НастройкаПорядка, Запись.НастройкаУпорядочиванияСпискаСотрудников);
КонецПроцедуры
&НаКлиенте
Процедура НастройкаПорядкаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если ДоступноИзменениеНастроек Тогда
ТекущиеДанные = Элементы.НастройкаПорядка.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено И ТекущиеДанные.Уровень > 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='Упорядочивание не используется'")
КонецЕсли;
Возврат Описание;
КонецФункции
#КонецОбласти