Почему в 1С:ЗУП 3 после переноса данных неправильно рассчитываются календарные дни для среднего заработка и как это исправить?

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

При переносе данных из старых конфигураций (например, «1С:Зарплата и Кадры 7.7» или «1С:ЗУП 2.5») в современную программу «1С:Зарплата и управление персоналом 3.1» программисты и расчетчики часто сталкиваются с необъяснимым поведением системы при расчете среднего заработка. Самая частая проблема — это искажение количества отработанных календарных дней в месяцах расчетного периода.

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

29,3 * 19 / 31 = 17,96 дней

Однако на практике система может выдать неожиданный результат, посчитав отработанными 50 календарных дней (то есть прибавив к реальным 19 дням еще 31 день полного месяца). При этом самое удивительное — если удалить запись в документе Перенос данных и вбить те же цифры вручную, расчет становится абсолютно верным. Давайте разберем по шагам, почему возникает эта «магия» и как решить проблему системно для всех сотрудников.

Архитектура учета времени для среднего заработка в ЗУП 3.1

Для того чтобы понять природу этой ошибки, проанализируем, как устроена подсистема учета времени для расчета среднего заработка в программе. Система использует связку из двух ключевых регистров:

  1. Регистр накопления ДанныеОВремениДляРасчетаСреднегоОбщий. Сюда при проведении начислений или документов переноса записываются фактические данные об отработанном времени (дни, часы, календарные дни).
  2. Регистр сведений ДанныеОВремениДляРасчетаОбщегоСреднегоЗаработкаКорректировка. Это вспомогательный независимый регистр сведений, который система использует для «выравнивания» баланса времени. Записи в нем появляются автоматически, когда программа обнаруживает расхождения между фактически начисленной зарплатой (данными регистра расчета Начисления) и зарегистрированным временем.

При расчете среднего заработка в документе «Отпуск» или «Командировка» программа выполняет сложение показателей из этих двух регистров. Если в корректировочном регистре сведений содержатся некорректные записи, математика расчета ломается, приводя к завышению календарных дней.

Выясняем причину возникновения автоматических корректировок

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

Дело в том, что при переносе данных обработкой формируются документы Перенос данных (обычно с кодом ЗП_СЗО), которые напрямую заполняют регистр накопления ДанныеОВремениДляРасчетаСреднегоОбщий. Однако у программы отсутствует история вытеснения начислений за эти прошлые периоды в том виде, в котором её «ожидает» ЗУП 3.1.

Как только пользователь пытается вручную скорректировать документ Перенос данных или пересчитать сотрудника, система видит расхождение между «чистым» временем и результатами начислений. Модуль проведения документов автоматически генерирует корректировочную запись в регистр сведений ДанныеОВремениДляРасчетаОбщегоСреднегоЗаработкаКорректировка со знаком «плюс» или «минус».

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

19 дней (из регистра накопления) + 31 день (из автоматически созданной корректировки) = 50 дней

Способ 1. Полная очистка корректирующего регистра (Рекомендуемый метод)

Если данные за прошлые периоды уже перенесены и проверены, самым простым и эффективным способом решения проблемы является полная очистка регистра сведений ДанныеОВремениДляРасчетаОбщегоСреднегоЗаработкаКорректировка по перенесенным периодам.

Поскольку этот регистр является независимым, в пользовательском интерфейсе нет штатной кнопки для его очистки. Для решения этой задачи программисту необходимо использовать обработку «Групповое изменение реквизитов» либо написать короткий скрипт для удаления записей.

Рассмотрим пример кода на встроенном языке 1С для очистки записей данного регистра за определенный период:


НаборЗаписей = РегистрыСведений.ДанныеОВремениДляРасчетаОбщегоСреднегоЗаработкаКорректировка.СоздатьНаборЗаписей();
// При необходимости можно установить отбор по конкретному сотруднику или периоду
// НаборЗаписей.Отбор.Сотрудник.Установить(ВыбранныйСотрудник);
НаборЗаписей.Записать(); // Записываем пустой набор для очистки данных

После полной очистки этого регистра программа перестанет «приплюсовывать» виртуальные дни к реальным данным, и расчет среднего будет строиться исключительно на корректных показателях регистра накопления ДанныеОВремениДляРасчетаСреднегоОбщий.

Способ 2. Доработка правил переноса данных

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

Проанализируем алгоритм работы загрузки. Необходимо настроить процесс переноса таким образом, чтобы при заполнении регистра накопления ДанныеОВремениДляРасчетаСреднегоОбщий параллельно очищались или принудительно не создавались корректировочные записи в регистре сведений. Процесс программного добавления записей при переносе должен быть полностью идентичен вашему ручному добавлению строки в документ корректировки (при котором данные ложатся без конфликтов).

Способ 3. Сброс ручных изменений в расчете среднего заработка

Если проблема носит единичный характер и обнаружилась в конкретном документе расчета среднего заработка (например, в документе «Отпуск» по одному сотруднику), можно воспользоваться механизмом пересчета в самом документе:

  1. Откройте форму расчета среднего заработка (нажав на кнопку с зеленым карандашом рядом с полем «Средний заработок»).
  2. В открывшемся окне нажмите кнопку Еще в правом верхнем углу.
  3. Выберите пункт Очистить ручные изменения.
  4. После этого нажмите Еще — Перечитать.

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

Таким образом, мы выяснили, что «магия» с лишними днями — это результат конфликта между регистром накопления общего времени и независимым корректировочным регистром сведений. Применяя описанные методы очистки и настройки правил переноса, вы сможете гарантировать абсолютно точный расчет среднего заработка для ваших сотрудников.

← На главную