Как правильно заполнять реквизит ИдентификаторСтроки в документах и регистрах 1С:ЗУП 3.1

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом Управленческий учет IT и автоматизация бизнеса
← На главную

При программном создании расчетных документов в конфигурации 1С:Зарплата и управление персоналом 3.1 (таких как Премия, Разовое начисление, Начисление зарплаты и взносов) разработчики часто сталкиваются со скрытой ошибкой: документ успешно проводится без системных исключений, однако движения в регистре расчета Начисления формируются с незаполненным реквизитом ИдентификаторСтроки. В дальнейшем это приводит к серьезным сбоям при расчете среднего заработка, больничных листов и отпусков — система некорректно определяет отработанное время и исключает дни начислений из расчетного периода.

Разберем детально, для чего предназначен этот реквизит, как устроена связность данных в расчетных подсистемах и как правильно заполнять его в программном коде.

Назначение реквизита и архитектура связей в ЗУП 3.1

Проанализируем структуру расчетных документов. В типовой конфигурации данные по начислениям сотрудников распределены по нескольким табличным частям одного документа:

  1. Основная табличная часть (например, Начисления).
  2. Табличные части показателей расчета (Показатели, ЗначенияПоказателейДляРазовыхНачислений).
  3. Распределение по бухучету, статьям финансирования, удержаниям и НДФЛ.

Для того чтобы связать между собой строки разных табличных частей в рамках одного документа, стандартного поля НомерСтроки недостаточно: при интерактивном удалении, вставке или сортировке строк номер пересчитывается, что привело бы к разрыву связей между начислением и его показателями. В качестве постоянного суррогатного ключа связи выступает числовой реквизит ИдентификаторСтрокиВидаРасчета в табличных частях документа.

При проведении документа значение реквизита ИдентификаторСтрокиВидаРасчета напрямую транслируется в реквизит ИдентификаторСтроки регистра расчета Начисления и сопутствующих регистров накопления.

Почему незаполненный идентификатор ломает расчет среднего заработка и больничных

Выясним причину сбоя при расчете пособий. Модули расчета среднего заработка и учета вытеснений в ЗУП 3.1 соединяют записи регистра расчета Начисления с регистрами учета отработанного времени и распределения по составному ключу (Регистратор, ИдентификаторСтроки).

Если при программной записи документа реквизит остался равным 0 или NULL, механизм соединения таблиц перестает корректно сопоставлять периоды действия начислений и данные о фактическом рабочем времени. В результате алгоритм сбора базы среднего заработка признает такие записи некорректными и исключает дни действия начислений из расчета.

Различие типов идентификаторов по подсистемам конфигурации

Важно понимать разницу в использовании идентификаторов в различных блоках конфигурации:

  1. Подсистема начисления зарплаты: В расчетных документах (Премия, Разовое начисление, Материальная помощь) и регистре расчета Начисления реквизиты ИдентификаторСтрокиВидаРасчета и ИдентификаторСтроки имеют тип Число.
  2. Подсистема выплаты зарплаты: В документах выплаты (Ведомость в банк, Ведомость в кассу) и регистре Зарплата к выплате поле ИдентификаторСтроки имеет тип Строка (или GUID). Там решается задача связывания строк ведомости с первичными документами-основаниями.

Правила программного заполнения расчетных документов

Рассмотрим, как правильно формировать табличные части документов программно, чтобы исключить ошибки в движениях регистра расчета.

  1. Сквозная числовая нумерация: Для каждой строки основной расчетной табличной части реквизиту ИдентификаторСтрокиВидаРасчета необходимо явно присваивать положительное целое число. Нумерация начинается с единицы и увеличивается на единицу для каждой новой строки.
  2. Связывание с подчиненными строками: Если в документе заполняются подчиненные табличные части с показателями, значение ИдентификаторСтрокиВидаРасчета в строке показателя должно в точности совпадать с идентификатором соответствующей строки начисления.
  3. Причина появления «больших номеров» при ручном вводе: В интерактивном режиме форма документа генерирует следующий номер путем поиска максимального значения в таблице плюс один. При программном заполнении с нуля достаточно использовать простую последовательность 1, 2, 3....

Пример программного заполнения документа

Посмотрим на практический пример кода обработки для создания документа РазовоеНачисление:


ДокументОбъект = Документы.РазовоеНачисление.СоздатьДокумент();
ДокументОбъект.Дата = ТекущаяДатаСеанса();
ДокументОбъект.Организация = ВыбраннаяОрганизация;
ДокументОбъект.ПериодРегистрации = НачалоМесяца(ТекущаяДатаСеанса());

СчетчикИдентификаторов = 0;

Для Каждого СтрДанных Из ТаблицаДанных Цикл
    
    СчетчикИдентификаторов = СчетчикИдентификаторов + 1;
    
    // Заполняем основную строку начисления
    НоваяСтрокаНачисления = ДокументОбъект.Начисления.Добавить();
    НоваяСтрокаНачисления.ИдентификаторСтрокиВидаРасчета = СчетчикИдентификаторов;
    НоваяСтрокаНачисления.Сотрудник = СтрДанных.Сотрудник;
    НоваяСтрокаНачисления.Начисление = СтрДанных.Начисление;
    НоваяСтрокаНачисления.ДатаНачала = СтрДанных.ДатаНачала;
    НоваяСтрокаНачисления.ДатаОкончания = СтрДанных.ДатаОкончания;
    НоваяСтрокаНачисления.Результат = СтрДанных.Сумма;
    
    // Если начисление требует заполнения показателей
    Если СтрДанных.Свойство("Показатель") И ЗначениеЗаполнено(СтрДанных.Показатель) Тогда
        НоваяСтрокаПоказателя = ДокументОбъект.Показатели.Добавить();
        // Связываем строку показателя со строкой начисления по идентификатору
        НоваяСтрокаПоказателя.ИдентификаторСтрокиВидаРасчета = СчетчикИдентификаторов;
        НоваяСтрокаПоказателя.Показатель = СтрДанных.Показатель;
        НоваяСтрокаПоказателя.Значение = СтрДанных.ЗначениеПоказателя;
    КонецЕсли;
    
КонецЦикла;

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

Соблюдение данного правила гарантирует корректное формирование движений в регистре расчета Начисления и исключает ошибки при последующих расчетах межрасчетных выплат, больничных и отпускных.

← На главную