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