При программном создании расчетных документов в конфигурации 1С:Зарплата и управление персоналом 3.1 (таких как Премия, Разовое начисление, Начисление зарплаты и взносов) разработчики часто сталкиваются со скрытой ошибкой: документ успешно проводится без системных исключений, однако движения в регистре расчета Начисления формируются с незаполненным реквизитом ИдентификаторСтроки. В дальнейшем это приводит к серьезным сбоям при расчете среднего заработка, больничных листов и отпусков — система некорректно определяет отработанное время и исключает дни начислений из расчетного периода.
Разберем детально, для чего предназначен этот реквизит, как устроена связность данных в расчетных подсистемах и как правильно заполнять его в программном коде.
Проанализируем структуру расчетных документов. В типовой конфигурации данные по начислениям сотрудников распределены по нескольким табличным частям одного документа:
Начисления).Показатели, ЗначенияПоказателейДляРазовыхНачислений).Для того чтобы связать между собой строки разных табличных частей в рамках одного документа, стандартного поля НомерСтроки недостаточно: при интерактивном удалении, вставке или сортировке строк номер пересчитывается, что привело бы к разрыву связей между начислением и его показателями. В качестве постоянного суррогатного ключа связи выступает числовой реквизит ИдентификаторСтрокиВидаРасчета в табличных частях документа.
При проведении документа значение реквизита ИдентификаторСтрокиВидаРасчета напрямую транслируется в реквизит ИдентификаторСтроки регистра расчета Начисления и сопутствующих регистров накопления.
Выясним причину сбоя при расчете пособий. Модули расчета среднего заработка и учета вытеснений в ЗУП 3.1 соединяют записи регистра расчета Начисления с регистрами учета отработанного времени и распределения по составному ключу (Регистратор, ИдентификаторСтроки).
Если при программной записи документа реквизит остался равным 0 или NULL, механизм соединения таблиц перестает корректно сопоставлять периоды действия начислений и данные о фактическом рабочем времени. В результате алгоритм сбора базы среднего заработка признает такие записи некорректными и исключает дни действия начислений из расчета.
Важно понимать разницу в использовании идентификаторов в различных блоках конфигурации:
Премия, Разовое начисление, Материальная помощь) и регистре расчета Начисления реквизиты ИдентификаторСтрокиВидаРасчета и ИдентификаторСтроки имеют тип Число.Ведомость в банк, Ведомость в кассу) и регистре Зарплата к выплате поле ИдентификаторСтроки имеет тип Строка (или GUID). Там решается задача связывания строк ведомости с первичными документами-основаниями.Рассмотрим, как правильно формировать табличные части документов программно, чтобы исключить ошибки в движениях регистра расчета.
ИдентификаторСтрокиВидаРасчета необходимо явно присваивать положительное целое число. Нумерация начинается с единицы и увеличивается на единицу для каждой новой строки.ИдентификаторСтрокиВидаРасчета в строке показателя должно в точности совпадать с идентификатором соответствующей строки начисления.1, 2, 3....Посмотрим на практический пример кода обработки для создания документа РазовоеНачисление:
ДокументОбъект = Документы.РазовоеНачисление.СоздатьДокумент();
ДокументОбъект.Дата = ТекущаяДатаСеанса();
ДокументОбъект.Организация = ВыбраннаяОрганизация;
ДокументОбъект.ПериодРегистрации = НачалоМесяца(ТекущаяДатаСеанса());
СчетчикИдентификаторов = 0;
Для Каждого СтрДанных Из ТаблицаДанных Цикл
СчетчикИдентификаторов = СчетчикИдентификаторов + 1;
// Заполняем основную строку начисления
НоваяСтрокаНачисления = ДокументОбъект.Начисления.Добавить();
НоваяСтрокаНачисления.ИдентификаторСтрокиВидаРасчета = СчетчикИдентификаторов;
НоваяСтрокаНачисления.Сотрудник = СтрДанных.Сотрудник;
НоваяСтрокаНачисления.Начисление = СтрДанных.Начисление;
НоваяСтрокаНачисления.ДатаНачала = СтрДанных.ДатаНачала;
НоваяСтрокаНачисления.ДатаОкончания = СтрДанных.ДатаОкончания;
НоваяСтрокаНачисления.Результат = СтрДанных.Сумма;
// Если начисление требует заполнения показателей
Если СтрДанных.Свойство("Показатель") И ЗначениеЗаполнено(СтрДанных.Показатель) Тогда
НоваяСтрокаПоказателя = ДокументОбъект.Показатели.Добавить();
// Связываем строку показателя со строкой начисления по идентификатору
НоваяСтрокаПоказателя.ИдентификаторСтрокиВидаРасчета = СчетчикИдентификаторов;
НоваяСтрокаПоказателя.Показатель = СтрДанных.Показатель;
НоваяСтрокаПоказателя.Значение = СтрДанных.ЗначениеПоказателя;
КонецЕсли;
КонецЦикла;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Соблюдение данного правила гарантирует корректное формирование движений в регистре расчета Начисления и исключает ошибки при последующих расчетах межрасчетных выплат, больничных и отпускных.