При переходе на новые релизы программного продукта 1С:Зарплата и Управление Персоналом (ЗУП) версии 3.1 пользователи и технические специалисты столкнулись с неприятной ситуацией: при расчете отпускных или командировочных суммы начисленных премий начали некорректно попадать в расчет среднего заработка. Вместо одной фактически выплаченной суммы программа подтягивает две, три или даже четыре одинаковые записи. В этой статье мы подробно разберем причины этого явления, проанализируем техническую сторону проблемы и рассмотрим несколько эффективных способов ее решения.
Проблема была официально зарегистрирована фирмой «1С» под номером 10225139. Она проявляется преимущественно в релизах 3.1.14.208 и 3.1.15.40. Выясним причину такого поведения системы. Основной фактор — это глобальное изменение механизма хранения данных для расчета среднего заработка.
Ранее данные собирались динамически из различных регистров расчета. В новых версиях 1С перешла на использование специализированного регистра сведений ДанныеОНачисленияхДляРасчетаСреднегоЗаработкаОбщий. При обновлении информационной базы программа должна была корректно перенести старые записи в новый регистр, однако возник программный нюанс:
ИсходныйДокумент.ИсходныйДокумент не заполнен, система не может идентифицировать уникальность записи и считает одну и ту же премию дважды: как «старые данные» и как «новые данные».Проанализируем ситуацию, когда премии «троят» или «четверят». Это происходит, если в одном месяце сотруднику было начислено несколько премий (например, месячная и квартальная) или если начисление производилось документами разного типа (например, Премия и РазовоеНачисление). Система без привязки к документу-основанию просто суммирует все подходящие по периоду записи, игнорируя их уникальность.
Самый быстрый и безопасный метод — это установка патча. Фирма «1С» выпустила исправление EF_10225139. Рассмотрим подробнее, что оно делает: патч вносит изменения в функции формирования данных для анализа премий. Он заставляет систему корректно сопоставлять записи даже с пустым реквизитом ИсходныйДокумент.
Чтобы установить патч, выполним следующие шаги:
Если по каким-то причинам установка патчей невозможна, можно посмотреть на ситуацию с точки зрения данных. При повторном проведении документа Премия в новом релизе, система автоматически заполняет реквизит ИсходныйДокумент в регистре сведений. После этого задвоение исчезает.
Важно понимать риски массового перепроведения документов за прошлые периоды (например, с 2019 года):
Перерасчеты. Это приведет к тому, что программа предложит пересчитать зарплату в текущем месяце за старые периоды.Чтобы минимизировать негативные последствия, рекомендуем после массового перепроведения воспользоваться обработкой «Доначисление, пересчеты» и просто удалить все возникшие записи о необходимости перерасчетов, если вы уверены в неизменности сумм.
Для тех, у кого в базе тысячи документов и перепроводить их «страшно», разберем по шагам более изящный метод. Можно написать простую обработку, которая напрямую запишет ссылку на документ в регистр сведений, не затрагивая сами документы и не инициируя механизмы перерасчета.
Посмотрим на пример программного кода, который можно использовать в такой обработке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеОНачислениях.Регистратор КАК ДокументСсылка,
| ДанныеОНачислениях.НомерСтроки КАК НомерСтроки
|ИЗ
| РегистрСведений.ДанныеОНачисленияхДляРасчетаСреднегоЗаработкаОбщий КАК ДанныеОНачислениях
|ГДЕ
| ДанныеОНачислениях.ИсходныйДокумент = ЗНАЧЕНИЕ(Документ.Премия.ПустаяСсылка)";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
МенеджерЗаписи = РегистрыСведений.ДанныеОНачисленияхДляРасчетаСреднегоЗаработкаОбщий.СоздатьМенеджерЗаписи();
// Здесь необходимо заполнить все измерения ключа записи
// Для краткости примера опустим заполнение всех измерений
МенеджерЗаписи.ИсходныйДокумент = ВыборкаДетальныеЗаписи.ДокументСсылка;
МенеджерЗаписи.Записать();
КонецЦикла;
Проанализируем этот подход. Основное преимущество здесь в том, что мы работаем только со вспомогательным регистром ДанныеОНачисленияхДляРасчетаСреднегоЗаработкаОбщий. Это не вызывает цепочку событий «ПриЗаписи» в основном документе, а значит, база остается «чистой» с точки зрения перерасчетов. Однако перед выполнением таких операций обязательно создайте резервную копию и «потренируйтесь на кошках» (тестовой базе).
Как упоминалось в обсуждении на форуме, 1С также указывала на ошибку при создании документов Премия копированием. Выясним, почему это происходит: при копировании могут наследоваться скрытые идентификаторы связей, которые в новых алгоритмах среднего заработка вызывают конфликты.
Практический совет: старайтесь избегать копирования документов Премия или Разовое начисление. Если премий много, лучше использовать механизм «Заполнить показатели» в самом документе или загрузку из табличного документа (Excel), чем копирование старого документа прошлого месяца.
Подводя итоги нашего разбора, сформулируем алгоритм действий при обнаружении задвоения премий:
Данные о начислениях для расчета среднего заработка (общий). Если колонка Исходный документ пуста — используйте групповое перепроведение или специализированную обработку для заполнения этого поля.Отпуск нажатием кнопки «Пересчитать сотрудника» после внесения правок.Совместными усилиями мы рассмотрели все аспекты этой технической сложности. Данный подход позволит вам сохранить корректность учета и избежать претензий со стороны сотрудников из-за завышенных или заниженных сумм отпускных.