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