При расчете аванса (зарплаты за первую половину месяца) в конфигурации 1С:Зарплата и Управление Персоналом 2.5 типовой механизм документа НачислениеЗарплатыРаботникамОрганизаций автоматически заполняет табличную часть всеми плановыми начислениями, которые назначены сотрудникам. В отличие от редакции 3.1, где в карточке начисления присутствует штатный флаг «Начисляется при расчете первой половины месяца», в редакции 2.5 выборочный расчет основных начислений без изменения плановых данных сотрудников штатно не предусмотрен.
Рассмотрим, как решить эту задачу разработчику с помощью внешней обработки заполнения табличной части, а также разберем важные нюансы работы с зависимыми видами расчета, такими как районный коэффициент.
Разберем по шагам алгоритм работы внешней обработки. Идея заключается в том, чтобы отфильтровать список видов расчета, оставив в табличной части Начисления только необходимые (например, оклад, тарифные ставки и другие базовые вычисления), после чего очистить связанные табличные части удержаний и выполнить метод РассчитатьВсе().
Посмотрим на пример процедурного кода обработки заполнения:
Процедура Инициализировать(Объект, ТЧЗарплата, ТабличноеПолеОбъекта) Экспорт
Если Объект.ЭтоНовый() Тогда
Объект.Записать();
КонецЕсли;
Если Объект.Модифицированность() Тогда
Объект.Записать();
КонецЕсли;
Если Объект.Проведен Тогда
Объект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
КонецЕсли;
// Формируем массив разрешенных основных начислений
МассивНач = Новый Массив;
МассивНач.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОкладПоДням);
МассивНач.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОкладПоЧасам);
МассивНач.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ТарифДневной);
МассивНач.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ТарифЧасовой);
МассивНач.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ДоплатаЗаНочныеЧасы);
МассивНач.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОплатаСверхурочных);
МассивНач.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОплатаПоСреднему);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Начисления.Ссылка,
| Начисления.НомерСтроки,
| Начисления.Сотрудник,
| Начисления.Физлицо,
| Начисления.ВидРасчета,
| Начисления.ДатаНачала,
| Начисления.ДатаОкончания,
| Начисления.Показатель1,
| Начисления.Показатель2,
| Начисления.Показатель3,
| Начисления.Показатель4,
| Начисления.Показатель5,
| Начисления.Показатель6,
| Начисления.Результат,
| Начисления.ДополнительныйРезультат,
| Начисления.ПодразделениеОрганизации,
| Начисления.ОтработаноДней,
| Начисления.ОтработаноЧасов,
| Начисления.ОтработаноДнейПоПятидневке,
| Начисления.НормаДней,
| Начисления.НормаЧасов,
| Начисления.НормаДнейПоПятидневке,
| Начисления.ПериодРасчетаСреднегоЗаработкаНачало,
| Начисления.ПериодРасчетаСреднегоЗаработкаОкончание,
| Начисления.ДатаНачалаСобытия,
| Начисления.Сторно,
| Начисления.Авторасчет,
| Начисления.ОплачиватьЧасов,
| Начисления.ОплаченоДнейЧасов,
| Начисления.ОтработаноЧасовПоПятидневке,
| Начисления.НормаЧасовПоПятидневке,
| Начисления.СторнируемыйДокумент,
| Начисления.РасчетнаяБазаЗаЕдиницуНормыВремени
|ИЗ
| Документ.НачислениеЗарплатыРаботникамОрганизаций.Начисления КАК Начисления
|ГДЕ
| Начисления.Ссылка = &Ссылка
| И Начисления.ВидРасчета В(&ВидРасчета)";
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
Запрос.УстановитьПараметр("ВидРасчета", МассивНач);
Рез = Запрос.Выполнить().Выгрузить();
// Перезаполняем и очищаем лишние ТЧ
Объект.Начисления.Загрузить(Рез);
Объект.Удержания.Очистить();
Объект.ДоговорыНаВыполнениеРабот.Очистить();
Объект.ПогашениеЗаймов.Очистить();
Объект.НДФЛ.Очистить();
Объект.Записать(РежимЗаписиДокумента.Запись);
Объект.РассчитатьВсе();
Объект.Записать();
КонецПроцедуры
Проанализируем частую проблему: почему при простой подстановке вида расчета РайонныйКоэффициент в массив отбора расчет суммы не происходит.
Вид расчета «Районный коэффициент» является зависимым начислением вторичного расчета. Метод объекта РассчитатьВсе() работает только по тем строкам, которые уже присутствуют в табличной части Начисления, опираясь на расчетную базу (базовые виды расчета, такие как оклад или тарифная ставка).
Выясним причину проблемы и варианты ее устранения:
Чтобы корректно рассчитать Районный коэффициент вместе с окладом, рекомендуется использовать двухэтапную схему обработки:
РассчитатьВсе() для формирования результатов.Начисления и удалить только те строки, виды расчета которых НЕ входят в список разрешенных для первой половины месяца.Удержания, НДФЛ) и выполнить повторную запись документа.