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

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

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

Причина возникновения проблемы: технический анализ

Проблема была официально зарегистрирована фирмой «1С» под номером 10225139. Она проявляется преимущественно в релизах 3.1.14.208 и 3.1.15.40. Выясним причину такого поведения системы. Основной фактор — это глобальное изменение механизма хранения данных для расчета среднего заработка.

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

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

Проанализируем ситуацию, когда премии «троят» или «четверят». Это происходит, если в одном месяце сотруднику было начислено несколько премий (например, месячная и квартальная) или если начисление производилось документами разного типа (например, Премия и РазовоеНачисление). Система без привязки к документу-основанию просто суммирует все подходящие по периоду записи, игнорируя их уникальность.

Способ 1. Установка официального исправления (патча)

Самый быстрый и безопасный метод — это установка патча. Фирма «1С» выпустила исправление EF_10225139. Рассмотрим подробнее, что оно делает: патч вносит изменения в функции формирования данных для анализа премий. Он заставляет систему корректно сопоставлять записи даже с пустым реквизитом ИсходныйДокумент.

Чтобы установить патч, выполним следующие шаги:

  1. Перейдем в раздел Администрирование — Обслуживание.
  2. Откроем пункт Обновление программы — Установленные исправления (патчи).
  3. Если в списке нет патча с номером 10225139, нажмем кнопку Установить исправление (при наличии настроенной интернет-поддержки) или загрузим его вручную с портала ИТС.

Способ 2. Перепроведение документов (ручной метод)

Если по каким-то причинам установка патчей невозможна, можно посмотреть на ситуацию с точки зрения данных. При повторном проведении документа Премия в новом релизе, система автоматически заполняет реквизит ИсходныйДокумент в регистре сведений. После этого задвоение исчезает.

Важно понимать риски массового перепроведения документов за прошлые периоды (например, с 2019 года):

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

Способ 3. Использование внешней обработки (для программистов)

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

Посмотрим на пример программного кода, который можно использовать в такой обработке:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ДанныеОНачислениях.Регистратор КАК ДокументСсылка,
    |	ДанныеОНачислениях.НомерСтроки КАК НомерСтроки
    |ИЗ
    |	РегистрСведений.ДанныеОНачисленияхДляРасчетаСреднегоЗаработкаОбщий КАК ДанныеОНачислениях
    |ГДЕ
    |	ДанныеОНачислениях.ИсходныйДокумент = ЗНАЧЕНИЕ(Документ.Премия.ПустаяСсылка)";

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

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

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

Нюанс с копированием документов

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

Практический совет: старайтесь избегать копирования документов Премия или Разовое начисление. Если премий много, лучше использовать механизм «Заполнить показатели» в самом документе или загрузку из табличного документа (Excel), чем копирование старого документа прошлого месяца.

Итоги и рекомендации

Подводя итоги нашего разбора, сформулируем алгоритм действий при обнаружении задвоения премий:

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

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

← На главную