// Выполняет формирование таблицы значений для загрузки ее в табличную часть Начисления // Параметры: // Начисления - выборка результатат запроса // ПериодЗаполнения - дата периода для которого выполняем заполнение документа // // Возвращаемое значение: // таблица значений // Функция СформироватьТаблицуНачислений(Начисления, ОкончаниеПериодаЗаполнения, ВремТЗНачисления, МассивВалютСНезаданнымКурсом) ТЗНачисления = Новый ТаблицаЗначений(); ТЗНачисления.Колонки.Добавить("Сотрудник"); ТЗНачисления.Колонки.Добавить("Физлицо"); ТЗНачисления.Колонки.Добавить("ВидРасчета"); ТЗНачисления.Колонки.Добавить("КодВычета"); ТЗНачисления.Колонки.Добавить("Основное"); // Признак основного начисления ТЗНачисления.Колонки.Добавить("Показатель1"); ТЗНачисления.Колонки.Добавить("Показатель2"); ТЗНачисления.Колонки.Добавить("Показатель3"); ТЗНачисления.Колонки.Добавить("Показатель4"); ТЗНачисления.Колонки.Добавить("Показатель5"); ТЗНачисления.Колонки.Добавить("Показатель6"); ТЗНачисления.Колонки.Добавить("Размер"); ТЗНачисления.Колонки.Добавить("ДатаНачала", ОбщегоНазначения.ПолучитьОписаниеТиповДаты(ЧастиДаты.ДатаВремя)); ТЗНачисления.Колонки.Добавить("ДатаНачалаСобытия", ОбщегоНазначения.ПолучитьОписаниеТиповДаты(ЧастиДаты.ДатаВремя)); ТЗНачисления.Колонки.Добавить("ДатаОкончания", ОбщегоНазначения.ПолучитьОписаниеТиповДаты(ЧастиДаты.ДатаВремя)); ТЗНачисления.Колонки.Добавить("ПодразделениеОрганизации"); // для заполнения графика и вида учета времени ТЗНачисления.Колонки.Добавить("ГрафикРаботы"); ТЗНачисления.Колонки.Добавить("СуммированныйУчетРабочегоВремени"); ТЗНачисления.Колонки.Добавить("СпособРасчета"); ТЗНачисления.Колонки.Добавить("ВидВремени"); // Билет 9 ++ ТЗНачисления.Колонки.Добавить("ВидАттестата"); // Билет 9 -- // Массив незакрытых строк таблицы значений, т.е. тех, которым не проставлена дата окончания НезакрытыеСтроки = Новый Массив; // Текущие значения полей выборки для отслеживания изменения работника и даты назначения ТекущийСотрудник = Справочники.СотрудникиОрганизаций.ПустаяСсылка(); ТекущаяДатаНазначения = '00010101'; ТекущаяЧасоваяСтавкаОсновногоНачисления = 0; // признаки того, что вечерние или ночные часы введены по плановым начислениям ЕстьПлановаяДоплатаЗаНочные = Ложь; ЕстьПлановаяДоплатаЗаВечерние = Ложь; СтрокиНачисленийТекущегоНазначения = Новый Массив; СтрокиВечернихТекущегоНазначения = Новый Массив; СтрокиНочныхТекущегоНазначения = Новый Массив; ДоплатыЗаНочныеВечерниеЧасы = ПолучитьДоплатыЗаНочныеВечерние(); ДоплатаЗаНочные = ДоплатыЗаНочныеВечерниеЧасы.ДоплатаЗаНочныеЧасы; ДоплатаЗаВечерние = ДоплатыЗаНочныеВечерниеЧасы.ДоплатаЗаВечерниеЧасы; ПроцентДоплатыЗаНочныеЧасы = ДоплатыЗаНочныеВечерниеЧасы.ПроцентДоплатыЗаНочныеЧасы; ПроцентДоплатыЗаВечерниеЧасы = ДоплатыЗаНочныеВечерниеЧасы.ПроцентДоплатыЗаВечерниеЧасы; Пока Начисления.Следующий() Цикл Если Начисления.Сотрудник <> ТекущийСотрудник Тогда // закрываем незакрытые строки начислений предыдущего работника концом месяца ЗакрытьСтроки(ТЗНачисления, НезакрытыеСтроки, ОкончаниеПериодаЗаполнения); Если ЕстьПлановаяДоплатаЗаНочные Тогда // удаляем те строки ночных часов, которые введены на основании табеля Для Каждого Строка Из СтрокиНочныхТекущегоНазначения Цикл ТЗНачисления.Удалить(Строка); КонецЦикла; КонецЕсли; Если ЕстьПлановаяДоплатаЗаВечерние Тогда // удаляем те строки вечерних часов, которые введены на основании табеля Для Каждого Строка Из СтрокиВечернихТекущегоНазначения Цикл ТЗНачисления.Удалить(Строка); КонецЦикла; КонецЕсли; // меняется текущий работник и дата его движения ТекущийСотрудник = Начисления.Сотрудник; ТекущаяДатаНазначения = Начисления.ПериодРаботники; ТекущаяЧасоваяСтавкаОсновногоНачисления = 0; СтрокиНачисленийТекущегоНазначения.Очистить(); СтрокиВечернихТекущегоНазначения.Очистить(); СтрокиНочныхТекущегоНазначения.Очистить(); ЕстьПлановаяДоплатаЗаНочные = Ложь; ЕстьПлановаяДоплатаЗаВечерние = Ложь; ИначеЕсли Начисления.ПериодРаботники <> ТекущаяДатаНазначения И (Начисления.НачисляетсяВЦеломЗаМесяц = Null Или (НЕ Начисления.НачисляетсяВЦеломЗаМесяц)) Тогда Для каждого СтрокаТекущегоНазначения Из СтрокиНачисленийТекущегоНазначения Цикл ИндексСтроки = 0; Для каждого СтрокаМассива Из НезакрытыеСтроки Цикл Если СтрокаМассива = СтрокаТекущегоНазначения Тогда НезакрытыеСтроки.Удалить(ИндексСтроки); Прервать; Иначе ИндексСтроки = ИндексСтроки + 1; КонецЕсли; КонецЦикла; КонецЦикла; // закрываем все строки предыдущего назначения датой предшествующей новому назначению ЗакрытьСтроки(ТЗНачисления, СтрокиНачисленийТекущегоНазначения, Начисления.ПериодРаботники - 1); // меняется текущая дата движения работника ТекущаяДатаНазначения = Начисления.ПериодРаботники; КонецЕсли; Если НЕ Начисления.Подходит ИЛИ Начисления.УжеПроведен Тогда // пропускаем такие записи: они уже введена другими документами или соответствуют окончанию назначения работника Продолжить; КонецЕсли; Если Начисления.Действие <> Перечисления.ВидыДействияСНачислением.Прекратить Тогда Для Сч = 1 По 6 Цикл Если ЗначениеЗаполнено(Начисления["Валюта"+Сч]) И (Начисления["КурсВалюты"+Сч] = NULL ИЛИ Начисления["КурсВалюты"+Сч] = 0) Тогда МассивВалютСНезаданнымКурсом[Начисления["Валюта"+ Сч]] = Истина; КонецЕсли; КонецЦикла; КонецЕсли; // Расчет размера начисления // для вечерних и ночных часов размер в регистре плановых начислений сожержит процент оплаты от тарифа/оклада Если Начисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ДоплатаЗаВечерниеЧасы ИЛИ Начисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ДоплатаЗаНочныеЧасы ИЛИ Начисления.ВидРасчета = ДоплатаЗаНочные ИЛИ Начисления.ВидРасчета = ДоплатаЗаВечерние Тогда Показатель1 = Начисления.Показатель1 / 100 * ТекущаяЧасоваяСтавкаОсновногоНачисления; Показатель2 = 0; Показатель3 = 0; Показатель4 = 0; Показатель5 = 0; Показатель6 = 0; Иначе // расчета не требуется Показатель1 = Начисления.Показатель1; Показатель2 = Начисления.Показатель2; Показатель3 = Начисления.Показатель3; Показатель4 = Начисления.Показатель4; Показатель5 = Начисления.Показатель5; Показатель6 = Начисления.Показатель6; КонецЕсли; // признак того, что вечерние и/или ночные часы введены по плановым начислениям Если Начисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ДоплатаЗаВечерниеЧасы Тогда ЕстьПлановаяДоплатаЗаВечерние = Истина; // удалим строки с веченими начислениями, введенными на основании графика, из // всех массивос строк Для Каждого Строка Из СтрокиВечернихТекущегоНазначения Цикл Для Счетчик = 0 По НезакрытыеСтроки.ВГраница() Цикл Если ТЗНачисления.Индекс(НезакрытыеСтроки[Счетчик]) = ТЗНачисления.Индекс(Строка) Тогда // нашли строку с вечерними, введенными на основании графика НезакрытыеСтроки.Удалить(Счетчик); Прервать; КонецЕсли; КонецЦикла; Для Счетчик = 0 По СтрокиНачисленийТекущегоНазначения.ВГраница() Цикл Если ТЗНачисления.Индекс(СтрокиНачисленийТекущегоНазначения[Счетчик]) = ТЗНачисления.Индекс(Строка) Тогда // нашли строку с вечерними, введенными на основании графика СтрокиНачисленийТекущегоНазначения.Удалить(Счетчик); Прервать; КонецЕсли; КонецЦикла; ТЗНачисления.Удалить(Строка); КонецЦикла; СтрокиВечернихТекущегоНазначения.Очистить(); КонецЕсли; Если Начисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ДоплатаЗаНочныеЧасы Тогда ЕстьПлановаяДоплатаЗаНочные = Истина; // удалим строки с ночными начислениями, введенными на основании графика, из // всех массивос строк Для Каждого Строка Из СтрокиНочныхТекущегоНазначения Цикл Для Счетчик = 0 По НезакрытыеСтроки.ВГраница() Цикл Если ТЗНачисления.Индекс(НезакрытыеСтроки[Счетчик]) = ТЗНачисления.Индекс(Строка) Тогда // нашли строку с вечерними, введенными на основании графика НезакрытыеСтроки.Удалить(Счетчик); Прервать; КонецЕсли; КонецЦикла; Для Счетчик = 0 По СтрокиНачисленийТекущегоНазначения.ВГраница() Цикл Если ТЗНачисления.Индекс(СтрокиНачисленийТекущегоНазначения[Счетчик]) = ТЗНачисления.Индекс(Строка) Тогда // нашли строку с вечерними, введенными на основании графика СтрокиНачисленийТекущегоНазначения.Удалить(Счетчик); Прервать; КонецЕсли; КонецЦикла; ТЗНачисления.Удалить(Строка); КонецЦикла; СтрокиНочныхТекущегоНазначения.Очистить(); КонецЕсли; // Сохраним размер основного начисления для расчета размера оплаты ночных и вечерних часов // (основное начисление в выборке должно идти раньше других видов расчета) Если Начисления.ОсновноеНачисление и Начисления.ВидРасчета <> Неопределено Тогда ТекущаяЧасоваяСтавкаОсновногоНачисления = Начисления.ЧасоваяТарифнаяСтавка; КонецЕсли; // Найдем такой же вид расчета среди незакрытых строк с целью завершения его действия Строки = Новый Массив; Если Начисления.ВидРасчета <> ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ДоплатаЗаКвалификацию Тогда // Билет 9 НайтиСредиНезакрытых(НезакрытыеСтроки, Начисления.ОсновноеНачисление, Начисления.ВидРасчета, Строки); КонецЕсли; // Билет 9 ПрерватьОбход = Ложь; Если Строки.Количество() > 0 Тогда // нашли Для Каждого Строка Из Строки Цикл Если Строка.ДатаНачала = Начисления.Период Тогда Если Начисления.Действие = Перечисления.ВидыДействияСНачислением.Прекратить Тогда ИндексСтроки = НезакрытыеСтроки.Найти(Строка); НезакрытыеСтроки.Удалить(ИндексСтроки); ИндексСтроки = 0; Для каждого СтрокаМассива Из СтрокиНачисленийТекущегоНазначения Цикл Если СтрокаМассива = Строка Тогда СтрокиНачисленийТекущегоНазначения.Удалить(ИндексСтроки); Прервать; Иначе ИндексСтроки = ИндексСтроки + 1; КонецЕсли; КонецЦикла; ТЗНачисления.Удалить(Строка); Иначе // если дата та же - новую строку в формируемую таблицу значений не вводим, а меняем данные // и оставляем строку "незакрытой" Строка.ВидРасчета = Начисления.ВидРасчета;// вид расчета необходимо переопределять для основного начисления Строка.ПодразделениеОрганизации = Начисления.ПодразделениеОрганизации; Строка.СпособРасчета = Начисления.СпособРасчета; Строка.ГрафикРаботы = Начисления.ГрафикРаботы; Строка.ДатаНачалаСобытия = Начисления.ДатаНачалаСобытия; Строка.СуммированныйУчетРабочегоВремени = Начисления.СуммированныйУчетРабочегоВремени; Строка.Показатель1 = Показатель1; Строка.Показатель2 = Показатель2; Строка.Показатель3 = Показатель3; Строка.Показатель4 = Показатель4; Строка.Показатель5 = Показатель5; Строка.Показатель6 = Показатель6; Если Начисления.ОсновноеНачисление Тогда // если это ОсновноеНачисление, то нужно подменить данные и в тех строках // ночных и вечерних, которые введены не основании графика Для Каждого СтрокаДоплаты Из СтрокиВечернихТекущегоНазначения Цикл Для Каждого НезакрытаяСтрока Из НезакрытыеСтроки Цикл Если ТЗНачисления.Индекс(НезакрытаяСтрока) = ТЗНачисления.Индекс(СтрокаДоплаты) Тогда // нашли строку с вечерними, введенными на основании графика СтрокаДоплаты.Показатель1 = (Начисления.ЧасоваяТарифнаяСтавка * ПроцентДоплатыЗаВечерниеЧасы) / 100; КонецЕсли; КонецЦикла; КонецЦикла; Для Каждого СтрокаДоплаты Из СтрокиНочныхТекущегоНазначения Цикл Для Каждого НезакрытаяСтрока Из НезакрытыеСтроки Цикл Если ТЗНачисления.Индекс(НезакрытаяСтрока) = ТЗНачисления.Индекс(СтрокаДоплаты) Тогда // нашли строку с ночными, введенными на основании графика СтрокаДоплаты.Показатель1 = (Начисления.ЧасоваяТарифнаяСтавка * ПроцентДоплатыЗаНочныеЧасы) / 100; КонецЕсли; КонецЦикла; КонецЦикла; КонецЕсли; КонецЕсли; ПрерватьОбход = Истина; ИначеЕсли Начисления.НачисляетсяВЦеломЗаМесяц = Null Или (НЕ Начисления.НачисляетсяВЦеломЗаМесяц) Тогда Если Не ЗначениеЗаполнено(Строка.ДатаОкончания) Или Строка.ДатаОкончания > Начисления.Период-1 Тогда Строка.ДатаОкончания = Начисления.Период-1; КонецЕсли; ИндексСтроки = НезакрытыеСтроки.Найти(Строка); НезакрытыеСтроки.Удалить(ИндексСтроки); Если Начисления.ОсновноеНачисление Тогда // если это ОсновноеНачисление, то нужно закрыть и те строки // ночных и вечерних, которые введены не основании графика Для Каждого СтрокаДоплаты Из СтрокиВечернихТекущегоНазначения Цикл Для Каждого НезакрытаяСтрока Из НезакрытыеСтроки Цикл Если ТЗНачисления.Индекс(НезакрытаяСтрока) = ТЗНачисления.Индекс(СтрокаДоплаты) Тогда // нашли строку с вечерними, введенными на основании графика Если Не ЗначениеЗаполнено(СтрокаДоплаты.ДатаОкончания) Или СтрокаДоплаты.ДатаОкончания > Начисления.Период-1 Тогда СтрокаДоплаты.ДатаОкончания = Начисления.Период-1; КонецЕсли; ИндексСтроки = НезакрытыеСтроки.Найти(СтрокаДоплаты); НезакрытыеСтроки.Удалить(ИндексСтроки); КонецЕсли; КонецЦикла; КонецЦикла; Для Каждого СтрокаДоплаты Из СтрокиНочныхТекущегоНазначения Цикл Для Каждого НезакрытаяСтрока Из НезакрытыеСтроки Цикл Если ТЗНачисления.Индекс(НезакрытаяСтрока) = ТЗНачисления.Индекс(СтрокаДоплаты) Тогда // нашли строку с ночными, введенными на основании графика Если Не ЗначениеЗаполнено(СтрокаДоплаты.ДатаОкончания) Или СтрокаДоплаты.ДатаОкончания > Начисления.Период-1 Тогда СтрокаДоплаты.ДатаОкончания = Начисления.Период-1; КонецЕсли; ИндексСтроки = НезакрытыеСтроки.Найти(СтрокаДоплаты); НезакрытыеСтроки.Удалить(ИндексСтроки); КонецЕсли; КонецЦикла; КонецЦикла; КонецЕсли; ИначеЕсли Начисления.ПериодНачисления = Начисления.Период Тогда Строка.ДатаОкончания = ОкончаниеПериодаЗаполнения; // удаляем из массива незакрытых - если пользователем был изменен размер начисления Если Начисления.Действие = Перечисления.ВидыДействияСНачислением.Изменить Тогда ИндексСтроки = НезакрытыеСтроки.Найти(Строка); НезакрытыеСтроки.Удалить(ИндексСтроки); КонецЕсли; Если Начисления.ОсновноеНачисление Тогда // если это ОсновноеНачисление, то нужно закрыть и те строки // ночных и вечерних, которые введены не основании графика Для Каждого СтрокаДоплаты Из СтрокиВечернихТекущегоНазначения Цикл Для Каждого НезакрытаяСтрока Из НезакрытыеСтроки Цикл Если ТЗНачисления.Индекс(НезакрытаяСтрока) = ТЗНачисления.Индекс(СтрокаДоплаты) Тогда // нашли строку с вечерними, введенными на основании графика СтрокаДоплаты.ДатаОкончания = ОкончаниеПериодаЗаполнения; // удаляем из массива незакрытых - если пользователем был изменен размер начисления Если Начисления.Действие = Перечисления.ВидыДействияСНачислением.Изменить Тогда ИндексСтроки = НезакрытыеСтроки.Найти(СтрокаДоплаты); НезакрытыеСтроки.Удалить(ИндексСтроки); КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; Для Каждого СтрокаДоплаты Из СтрокиНочныхТекущегоНазначения Цикл Для Каждого НезакрытаяСтрока Из НезакрытыеСтроки Цикл Если ТЗНачисления.Индекс(НезакрытаяСтрока) = ТЗНачисления.Индекс(СтрокаДоплаты) Тогда // нашли строку с ночными, введенными на основании графика СтрокаДоплаты.ДатаОкончания = ОкончаниеПериодаЗаполнения; // удаляем из массива незакрытых - если пользователем был изменен размер начисления Если Начисления.Действие = Перечисления.ВидыДействияСНачислением.Изменить Тогда ИндексСтроки = НезакрытыеСтроки.Найти(СтрокаДоплаты); НезакрытыеСтроки.Удалить(ИндексСтроки); КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; КонецЕсли; Иначе ПрерватьОбход = Истина; КонецЕсли; КонецЦикла; КонецЕсли; Если ПрерватьОбход Или Начисления.Действие = Перечисления.ВидыДействияСНачислением.Прекратить Тогда Продолжить; ИначеЕсли Начисления.НачисляетсяВЦеломЗаМесяц Тогда // проверем не введено ли данное начисление уже СтрокаПоиска= Новый Структура; СтрокаПоиска.Вставить("Сотрудник", Начисления.Сотрудник); СтрокаПоиска.Вставить("ВидРасчета", Начисления.ВидРасчета); НайденныеСтроки = ТЗНачисления.НайтиСтроки(СтрокаПоиска); Если НайденныеСтроки.Количество() > 0 Тогда Продолжить; КонецЕсли; КонецЕсли; // Добавим новую строку начислений НоваяСтрока = ТЗНачисления.Добавить(); НоваяСтрока.Сотрудник = Начисления.Сотрудник; НоваяСтрока.Физлицо = Начисления.Физлицо; НоваяСтрока.ВидРасчета = Начисления.ВидРасчета; НоваяСтрока.КодВычета = Начисления.КодВычета; // Билет 9 ++ НоваяСтрока.ВидАттестата = Начисления.ВидАттестата; // Билет 9 -- Если ПроведениеРасчетов.ЭтоРасчетСеверныхНадбавок(Начисления.СпособРасчета) И Начисления.ДатаРегистрацииСеверногоСтажа <> Null Тогда // получим массив процентов северных надбавок с датами их действия для нашего периода ПроцентыСевернойНадбавки = ПроведениеРасчетов.ПолучитьПроцентыСевернойНадбавкиЗаПериод( Начисления.ДатаРегистрацииСеверногоСтажа, Начисления.ПорядокНачисленияСеверныхНадбавок, Начисления.НачальныйПроцентСевернойНадбавки, Начисления.СеверныйСтажМесяцев, Начисления.СеверныйСтажДней, Начисления.Период, ОкончаниеПериодаЗаполнения); НоваяСтрока.Показатель1 = ПроцентыСевернойНадбавки[0].Процент; ИначеЕсли ПроведениеРасчетов.ЭтоРасчетОтСтажа(Начисления.СпособРасчета) Тогда Если Начисления.КоэффициентСтажа = Null Тогда КоэффициентСтажа = 0; ОбщегоНазначения.КомментарийРасчета("Для " + Начисления.СотрудникНаименование + ", вид расчета """ + Начисления.ВидРасчетаНаименование+ """ не подобран размер начисления в зависимости от стажа """ + Начисления.ВидРасчетаВидСтажа + """ Размер принят равным нулю.", , Начисления.ФизЛицо, Начисления.ФизЛицо, Перечисления.ВидыСообщений.Ошибка); Иначе КоэффициентСтажа = Начисления.КоэффициентСтажа; КонецЕсли; НоваяСтрока.Показатель1 = КоэффициентСтажа; Иначе НоваяСтрока.Показатель1 = Показатель1; НоваяСтрока.Показатель2 = Показатель2; НоваяСтрока.Показатель3 = Показатель3; НоваяСтрока.Показатель4 = Показатель4; НоваяСтрока.Показатель5 = Показатель5; НоваяСтрока.Показатель6 = Показатель6; КонецЕсли; НоваяСтрока.Основное = Начисления.ОсновноеНачисление; НоваяСтрока.ДатаНачала = Начисления.Период; НоваяСтрока.ДатаНачалаСобытия = Начисления.ДатаНачалаСобытия; Если Начисления.НачисляетсяВЦеломЗаМесяц Тогда НоваяСтрока.ДатаОкончания = ОкончаниеПериодаЗаполнения; КонецЕсли; НоваяСтрока.ПодразделениеОрганизации = Начисления.ПодразделениеОрганизации; НоваяСтрока.СпособРасчета = Начисления.СпособРасчета; НоваяСтрока.ВидВремени = Начисления.ВидВремени; НоваяСтрока.ГрафикРаботы = Начисления.ГрафикРаботы; НоваяСтрока.СуммированныйУчетРабочегоВремени = Начисления.СуммированныйУчетРабочегоВремени; Если Не Начисления.НачисляетсяВЦеломЗаМесяц Тогда НезакрытыеСтроки.Добавить(НоваяСтрока); СтрокиНачисленийТекущегоНазначения.Добавить(НоваяСтрока); КонецЕсли; // Добавим начисления по ночным и вечерним, если требуется и если это - основной вид расчета Если Начисления.ОсновноеНачисление И Начисления.ЕстьНочные И НЕ ЕстьПлановаяДоплатаЗаНочные Тогда НоваяСтрока = ТЗНачисления.Добавить(); НоваяСтрока.Сотрудник = Начисления.Сотрудник; НоваяСтрока.Физлицо = Начисления.Физлицо; НоваяСтрока.ВидРасчета = ДоплатаЗаНочные; НоваяСтрока.Показатель1 = (Начисления.ЧасоваяТарифнаяСтавка * ПроцентДоплатыЗаНочныеЧасы) / 100; НоваяСтрока.Основное = Ложь; НоваяСтрока.ДатаНачала = Начисления.Период; НоваяСтрока.ПодразделениеОрганизации = Начисления.ПодразделениеОрганизации; НоваяСтрока.СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ДоплатаЗаНочныеЧасы; НоваяСтрока.ВидВремени = Перечисления.ВидыУчетаВремени.ПоНочнымЧасам; НоваяСтрока.ГрафикРаботы = Начисления.ГрафикРаботы; НоваяСтрока.СуммированныйУчетРабочегоВремени = Начисления.СуммированныйУчетРабочегоВремени; НезакрытыеСтроки.Добавить(НоваяСтрока); СтрокиНачисленийТекущегоНазначения.Добавить(НоваяСтрока); СтрокиНочныхТекущегоНазначения.Добавить(НоваяСтрока); КонецЕсли; Если Начисления.ОсновноеНачисление И Начисления.ЕстьВечерние И НЕ ЕстьПлановаяДоплатаЗаВечерние Тогда НоваяСтрока = ТЗНачисления.Добавить(); НоваяСтрока.Сотрудник = Начисления.Сотрудник; НоваяСтрока.Физлицо = Начисления.Физлицо; НоваяСтрока.ВидРасчета = ДоплатаЗаВечерние; НоваяСтрока.Показатель1 = (Начисления.ЧасоваяТарифнаяСтавка * ПроцентДоплатыЗаВечерниеЧасы) / 100; НоваяСтрока.Основное = Ложь; НоваяСтрока.ДатаНачала = Начисления.Период; НоваяСтрока.ПодразделениеОрганизации = Начисления.ПодразделениеОрганизации; НоваяСтрока.СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ДоплатаЗаВечерниеЧасы; НоваяСтрока.ВидВремени = Перечисления.ВидыУчетаВремени.ПоВечернимЧасам; НоваяСтрока.ГрафикРаботы = Начисления.ГрафикРаботы; НоваяСтрока.СуммированныйУчетРабочегоВремени = Начисления.СуммированныйУчетРабочегоВремени; НезакрытыеСтроки.Добавить(НоваяСтрока); СтрокиНачисленийТекущегоНазначения.Добавить(НоваяСтрока); СтрокиВечернихТекущегоНазначения.Добавить(НоваяСтрока); КонецЕсли; Если Начисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ДоплатаЗаВечерниеЧасы ИЛИ Начисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ДоплатаЗаНочныеЧасы ИЛИ Начисления.ВидРасчета = ДоплатаЗаНочные ИЛИ Начисления.ВидРасчета = ДоплатаЗаВечерние Тогда СтрокаДоплаты = НоваяСтрока; Отбор = Новый Структура(); Отбор.Вставить("Сотрудник", Начисления.Сотрудник); Отбор.Вставить("Физлицо", Начисления.Физлицо); Отбор.Вставить("ОсновноеНачисление", Истина); Строки = ВремТЗНачисления.НайтиСтроки(Отбор); ОтборДоплаты = Новый Структура(); ОтборДоплаты.Вставить("Сотрудник", Начисления.Сотрудник); ОтборДоплаты.Вставить("Физлицо", Начисления.Физлицо); ОтборДоплаты.Вставить("ВидРасчета", Начисления.ВидРасчета); СтрокиДоплаты = ВремТЗНачисления.НайтиСтроки(ОтборДоплаты); Если Строки.Количество() > 1 И СтрокиДоплаты.Количество() < 2 Тогда КоличествоСтрок = Строки.Количество(); НомерСтр = 0; ДатаНачала = СтрокаДоплаты.ДатаНачала; Для Каждого СтрокаТЗНачисления Из Строки Цикл НомерСтр = НомерСтр + 1; Если НомерСтр > 1 Тогда Если ДатаНачала >= СтрокаТЗНачисления.Период Тогда ИндексСтрокиНезакрытые = НезакрытыеСтроки.Найти(СтрокаДоплаты); НезакрытыеСтроки.Удалить(ИндексСтрокиНезакрытые); ИндексСтрокиТекНазнач = СтрокиНачисленийТекущегоНазначения.Найти(СтрокаДоплаты); СтрокиНачисленийТекущегоНазначения.Удалить(ИндексСтрокиТекНазнач); ИндексСтроки = ТЗНачисления.Найти(СтрокаДоплаты); ТЗНачисления.Удалить(ИндексСтроки); ИначеЕсли НомерСтр = 2 Тогда // если не удаляем строку доплаты, то "закроем" ее (ставим дату окончания) СтрокаДоплаты.ДатаОкончания = СтрокаТЗНачисления.Период - 1; ИндексСтрокиНезакрытые = НезакрытыеСтроки.Найти(СтрокаДоплаты); НезакрытыеСтроки.Удалить(ИндексСтрокиНезакрытые); КонецЕсли; СтрокаДоплаты = ТЗНачисления.Добавить(); СтрокаДоплаты.Сотрудник = СтрокаТЗНачисления.Сотрудник; СтрокаДоплаты.Физлицо = СтрокаТЗНачисления.Физлицо; СтрокаДоплаты.ВидРасчета = Начисления.ВидРасчета; СтрокаДоплаты.КодВычета = Начисления.КодВычета; СтрокаДоплаты.Показатель1 = Начисления.Показатель1 / 100 * СтрокаТЗНачисления.ЧасоваяТарифнаяСтавка; СтрокаДоплаты.Основное = Начисления.ОсновноеНачисление; СтрокаДоплаты.ДатаНачала = СтрокаТЗНачисления.Период; СтрокаДоплаты.ДатаНачалаСобытия = СтрокаТЗНачисления.ДатаНачалаСобытия; СтрокаДоплаты.ПодразделениеОрганизации = СтрокаТЗНачисления.ПодразделениеОрганизации; СтрокаДоплаты.СпособРасчета = Начисления.СпособРасчета; СтрокаДоплаты.ВидВремени = Начисления.ВидВремени; СтрокаДоплаты.ГрафикРаботы = Начисления.ГрафикРаботы; СтрокаДоплаты.СуммированныйУчетРабочегоВремени = Начисления.СуммированныйУчетРабочегоВремени; ДатаНачала = СтрокаДоплаты.ДатаНачала; НезакрытыеСтроки.Добавить(СтрокаДоплаты); СтрокиНачисленийТекущегоНазначения.Добавить(СтрокаДоплаты); КонецЕсли; КонецЦикла; ИначеЕсли Строки.Количество() > 1 Тогда Для Каждого СтрокаТЗДопНачисления Из СтрокиДоплаты Цикл Если СтрокаТЗДопНачисления.Период = НоваяСтрока.ДатаНачала Тогда Для Каждого СтрокаТЗНачисления Из Строки Цикл Если СтрокаТЗНачисления.Период = НоваяСтрока.ДатаНачала Тогда НоваяСтрока.Показатель1 = Начисления.Показатель1 / 100 * СтрокаТЗНачисления.ЧасоваяТарифнаяСтавка; КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; Если ПроведениеРасчетов.ЭтоРасчетОтСтажа(Начисления.СпособРасчета) И Начисления.ДеньСменыКоэффициентаСтажа <> Null Тогда // установим дату окончания предыдущего расчета от стажа Если День(КонецМесяца(Начисления.Период)) >= Начисления.ДеньСменыКоэффициентаСтажа Тогда ДатаСменыКоэффициентаСтажа = Дата(Год(Начисления.Период), Месяц(Начисления.Период), Начисления.ДеньСменыКоэффициентаСтажа) - 1; Если ДатаСменыКоэффициентаСтажа > НоваяСтрока.ДатаНачала Тогда НоваяСтрока.ДатаОкончания = ДатаСменыКоэффициентаСтажа; // ... и введем еще один ДопНоваяСтрока = ТЗНачисления.Добавить(); ДопНоваяСтрока.Сотрудник = Начисления.Сотрудник; ДопНоваяСтрока.Физлицо = Начисления.Физлицо; ДопНоваяСтрока.ВидРасчета = Начисления.ВидРасчета; ДопНоваяСтрока.КодВычета = Начисления.КодВычета; ДопНоваяСтрока.Показатель1 = Начисления.СледКоэффициентСтажа; ДопНоваяСтрока.Основное = Начисления.ОсновноеНачисление; ДопНоваяСтрока.ДатаНачала = ДатаСменыКоэффициентаСтажа + 1; ДопНоваяСтрока.ДатаНачалаСобытия = Начисления.ДатаНачалаСобытия; ДопНоваяСтрока.ПодразделениеОрганизации = Начисления.ПодразделениеОрганизации; ДопНоваяСтрока.СпособРасчета = Начисления.СпособРасчета; ДопНоваяСтрока.ГрафикРаботы = Начисления.ГрафикРаботы; ДопНоваяСтрока.СуммированныйУчетРабочегоВремени = Начисления.СуммированныйУчетРабочегоВремени; НезакрытыеСтроки.Добавить(ДопНоваяСтрока); СтрокиНачисленийТекущегоНазначения.Добавить(ДопНоваяСтрока); Иначе // период записи начиался после дня изменения коэффициента стажа - запишем в ту же запись новое значение НоваяСтрока.Показатель1 = Начисления.СледКоэффициентСтажа; КонецЕсли; КонецЕсли; ИначеЕсли ПроведениеРасчетов.ЭтоРасчетСеверныхНадбавок(Начисления.СпособРасчета) И Начисления.ДатаРегистрацииСеверногоСтажа <> Null Тогда Если ПроцентыСевернойНадбавки.Количество() > 1 Тогда Если ПроцентыСевернойНадбавки[0].Процент <= 0 Тогда НоваяСтрока.ДатаНачала = Дата(Год(Начисления.Период), Месяц(Начисления.Период), День(ПроцентыСевернойНадбавки[1].Период)); НоваяСтрока.Показатель1 = ПроцентыСевернойНадбавки[1].Процент; Иначе // установим дату окончания предыдущего расчета от стажа НоваяСтрока.ДатаОкончания = Дата(Год(Начисления.Период), Месяц(Начисления.Период), День(ПроцентыСевернойНадбавки[1].Период)) - 1; // ... и введем дополнительную // предполагаем, что в течение одного расчетного периода (месяца) не может произойти несколько // изменений процента северной надбавки ДопНоваяСтрока = ТЗНачисления.Добавить(); ДопНоваяСтрока.Сотрудник = Начисления.Сотрудник; ДопНоваяСтрока.Физлицо = Начисления.Физлицо; ДопНоваяСтрока.ВидРасчета = Начисления.ВидРасчета; ДопНоваяСтрока.КодВычета = Начисления.КодВычета; ДопНоваяСтрока.Показатель1 = ПроцентыСевернойНадбавки[1].Процент; ДопНоваяСтрока.Основное = Начисления.ОсновноеНачисление; ДопНоваяСтрока.ДатаНачала = Дата(Год(Начисления.Период), Месяц(Начисления.Период), День(ПроцентыСевернойНадбавки[1].Период)); ДопНоваяСтрока.ДатаНачалаСобытия = Начисления.ДатаНачалаСобытия; ДопНоваяСтрока.ПодразделениеОрганизации = Начисления.ПодразделениеОрганизации; ДопНоваяСтрока.СпособРасчета = Начисления.СпособРасчета; ДопНоваяСтрока.ГрафикРаботы = Начисления.ГрафикРаботы; ДопНоваяСтрока.СуммированныйУчетРабочегоВремени = Начисления.СуммированныйУчетРабочегоВремени; НезакрытыеСтроки.Добавить(ДопНоваяСтрока); СтрокиНачисленийТекущегоНазначения.Добавить(ДопНоваяСтрока); КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; // закрываем незакрытые строки по последнему работнику концом месяца ЗакрытьСтроки(ТЗНачисления, НезакрытыеСтроки, ОкончаниеПериодаЗаполнения); Возврат ТЗНачисления; КонецФункции //СформироватьТаблицуНачислений