Штатное расписание / Модуль менеджера

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
//
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

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

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

// СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов

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

	Возврат БлокируемыеРеквизиты;	
	
КонецФункции	

// Конец СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов

// СтандартныеПодсистемы.Печать

// Заполняет список команд печати.
// 
// Параметры:
//   КомандыПечати - ТаблицаЗначений - состав полей см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати.
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
	Если ОбщегоНазначения.ПодсистемаСуществует("ЗарплатаКадрыКорпоративнаяПодсистемы.КадровыйУчет.ДолжностнаяИнструкция") Тогда
		МодульПечатьДолжностнойИнструкции = ОбщегоНазначения.ОбщийМодуль("Обработки.ПечатьДолжностнойИнструкции");
		МодульПечатьДолжностнойИнструкции.ДобавитьКомандыПечати(КомандыПечати);
	КонецЕсли;
	
	Если ПравоДоступа("Чтение", Метаданные.РегистрыСведений.КадроваяИсторияСотрудников) Тогда
		
		КомандаПечати = КомандыПечати.Добавить();
		КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
		КомандаПечати.Идентификатор = "ШтатноеРасписаниеНаПодпись";
		КомандаПечати.Представление = НСтр("ru = 'Штатное расписание на подпись'");
		КомандаПечати.СписокФорм = "ФормаСписка";
		КомандаПечати.Обработчик = "УправлениеШтатнымРасписаниемКлиент.ОткрытьОтчетШтатноеРасписание";
		КомандаПечати.Порядок = 20;
		
		КомандаПечати = КомандыПечати.Добавить();
		КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
		КомандаПечати.Идентификатор = "СоблюдениеШтатногоРасписания";
		КомандаПечати.Представление = НСтр("ru = 'Соблюдение штатного расписания'");
		КомандаПечати.СписокФорм = "ФормаСписка";
		КомандаПечати.Обработчик = "УправлениеШтатнымРасписаниемКлиент.ОткрытьОтчетСостояниеШтатногоРасписания";
		КомандаПечати.Порядок = 30;
		
		КомандаПечати = КомандыПечати.Добавить();
		КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
		КомандаПечати.Идентификатор = "АнализШтатногоРасписания";
		КомандаПечати.Представление = НСтр("ru = 'Анализ штатного расписания'");
		КомандаПечати.СписокФорм = "ФормаСписка";
		КомандаПечати.Обработчик = "УправлениеШтатнымРасписаниемКлиент.ОткрытьОтчетСостояниеШтатногоРасписания";
		КомандаПечати.Порядок = 40;
		
		ФОИспользоватьВилкуСтавокВШтатномРасписании = ПолучитьФункциональнуюОпцию("ИспользоватьВилкуСтавокВШтатномРасписании");
		Если ПравоДоступа("Чтение", Метаданные.РегистрыСведений.ИсторияНачисленийПоШтатномуРасписанию) Тогда
			
			КомандаПечати = КомандыПечати.Добавить();
			КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
			КомандаПечати.Идентификатор = "Т3";
			КомандаПечати.Представление = НСтр("ru = 'Штатное расписание (Т-3)'");
			КомандаПечати.СписокФорм = "ФормаСписка";
			КомандаПечати.Обработчик = "УправлениеШтатнымРасписаниемКлиент.ОткрытьОтчетШтатноеРасписаниеНачисления";
			КомандаПечати.Порядок = 10;
			
			Если ФОИспользоватьВилкуСтавокВШтатномРасписании Тогда
				
				КомандаПечати = КомандыПечати.Добавить();
				КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
				КомандаПечати.Идентификатор = "НачисленияПозицийШтатногоРасписанияИспользуетсяВилкаСтавок";
				КомандаПечати.Представление = НСтр("ru = 'Начисления позиций штатного расписания'");
				КомандаПечати.СписокФорм = "ФормаСписка";
				КомандаПечати.Обработчик = "УправлениеШтатнымРасписаниемКлиент.ОткрытьОтчетШтатноеРасписаниеНачисления";
				КомандаПечати.Порядок = 50;
				
				КомандаПечати = КомандыПечати.Добавить();
				КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
				КомандаПечати.Идентификатор = "ШтатноеРасписаниеКроссТаблицаИспользуетсяВилкаСтавок";
				КомандаПечати.Представление = НСтр("ru = 'Оклады, надбавки и ФОТ по штатному расписанию'");
				КомандаПечати.СписокФорм = "ФормаСписка";
				КомандаПечати.Обработчик = "УправлениеШтатнымРасписаниемКлиент.ОткрытьОтчетШтатноеРасписаниеНачисления";
				КомандаПечати.Порядок = 60;
				
			Иначе
				
				КомандаПечати = КомандыПечати.Добавить();
				КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
				КомандаПечати.Идентификатор = "НачисленияПозицийШтатногоРасписания";
				КомандаПечати.Представление = НСтр("ru = 'Начисления позиций штатного расписания'");
				КомандаПечати.СписокФорм = "ФормаСписка";
				КомандаПечати.Обработчик = "УправлениеШтатнымРасписаниемКлиент.ОткрытьОтчетШтатноеРасписаниеНачисления";
				КомандаПечати.Порядок = 50;
				
				КомандаПечати = КомандыПечати.Добавить();
				КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
				КомандаПечати.Идентификатор = "ШтатноеРасписаниеКроссТаблица";
				КомандаПечати.Представление = НСтр("ru = 'Оклады, надбавки и ФОТ по штатному расписанию'");
				КомандаПечати.СписокФорм = "ФормаСписка";
				КомандаПечати.Обработчик = "УправлениеШтатнымРасписаниемКлиент.ОткрытьОтчетШтатноеРасписаниеНачисления";
				КомандаПечати.Порядок = 60;
				
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

// Формирует печатные формы.
//
// Параметры:
//  МассивОбъектов - Массив - ссылки на объекты, которые нужно распечатать;
//  ПараметрыПечати - Структура - дополнительные настройки печати;
//  КоллекцияПечатныхФорм - ТаблицаЗначений - сформированные табличные документы (выходной параметр)
//  ОбъектыПечати - СписокЗначений - значение - ссылка на объект;
//                                   представление - имя области, в которой был выведен объект (выходной параметр);
//  ПараметрыВывода - Структура - дополнительные параметры сформированных табличных документов (выходной параметр).
//
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
КонецПроцедуры

// Конец СтандартныеПодсистемы.Печать

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

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

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

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
	УправлениеШтатнымРасписаниемВызовСервера.ОбработкаПолученияДанныхВыбораСправочникаШтатноеРасписание(ДанныеВыбора, Параметры, СтандартнаяОбработка);	
КонецПроцедуры

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

#Область СлужебныйПрограммныйИнтерфейс

// ЗарплатаКадрыРасширеннаяПодсистемы.ПодключаемыеХарактеристики

// Возвращает имя плана видов характеристик, 
// в котором хранятся подключаемые характеристики экземпляров этого типа.
//
// Возвращаемое значение:
//  Строка - имя плана видов характеристик.
//
Функция ИмяПланаВидовПодключаемыхХарактеристикЗарплатаКадры() Экспорт
	Возврат "ШтатноеРасписаниеПодключаемыеХарактеристики";
КонецФункции

// Конец ЗарплатаКадрыРасширеннаяПодсистемы.ПодключаемыеХарактеристики

// Описание позиции штатного расписания.
//
Функция ДанныеПозицииШтатногоРасписания(ПозицияШтатногоРасписания) Экспорт
	
	ДанныеПозиции = Новый Структура(
		"Должность,
		|Организация,
		|Подразделение,
		|ФОТ");
	
	Запрос = Новый Запрос(
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ШтатноеРасписание.Ссылка КАК Ссылка,
		|	ШтатноеРасписание.Должность КАК Должность,
		|	ШтатноеРасписание.Владелец КАК Организация,
		|	ШтатноеРасписание.Подразделение КАК Подразделение,
		|	ШтатноеРасписание.ФОТ КАК ФОТ
		|ИЗ
		|	Справочник.ШтатноеРасписание КАК ШтатноеРасписание
		|ГДЕ
		|	ШтатноеРасписание.Ссылка = &Позиция");
		
	Запрос.УстановитьПараметр("Позиция", ПозицияШтатногоРасписания);
	
	Выборка = Запрос.Выполнить().Выбрать();
	Выборка.Следующий();
	
	ЗаполнитьЗначенияСвойств(ДанныеПозиции, Выборка);
	
	Если ОбщегоНазначения.ПодсистемаСуществует("ЗарплатаКадрыПриложения.ОрганизационнаяСтруктура") Тогда
		МодульОрганизационнаяСтруктура = ОбщегоНазначения.ОбщийМодуль("ОрганизационнаяСтруктура");
		МодульОрганизационнаяСтруктура.ДополнитьДанныеПозицииШтатногоРасписания(ДанныеПозиции, ПозицияШтатногоРасписания);
	КонецЕсли;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("ЗарплатаКадрыКорпоративнаяПодсистемы.ХарактеристикиПерсонала") Тогда
		МодульХарактеристикиПерсонала = ОбщегоНазначения.ОбщийМодуль("ХарактеристикиПерсонала");
		МодульХарактеристикиПерсонала.ДополнитьДанныеПозицииШтатногоРасписания(ДанныеПозиции, ПозицияШтатногоРасписания);
	КонецЕсли;
	
	Возврат ДанныеПозиции;
	
КонецФункции

// используется при загрузке данных
Процедура РассчитатьФОТПозиции(ПозицияОбъект) Экспорт

	КоллекцияПозиций     = УправлениеШтатнымРасписанием.ПустаяТаблицаКоллекцииПозицийДляРасчетаФОТ();
	КоллекцияНачислений  = УправлениеШтатнымРасписанием.ПустаяТаблицаКоллекцииНачисленийДляРасчетаФОТ();
	КоллекцияПоказателей = УправлениеШтатнымРасписанием.ПустаяТаблицаКоллекцииПоказателейДляРасчетаФОТ();

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

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

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

Процедура ОбновитьСтруктуруШтатногоРасписанияПослеОбменаДанными(Организация = Неопределено, Подразделение = Неопределено) Экспорт
	
	ОбновитьСтруктуруШтатногоРасписания(Организация, Подразделение);
	
КонецПроцедуры

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

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

#Область ОбработчикиПравилРегистрации

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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