При работе в конфигурациях на базе старого движка расчета зарплаты (таких как Зарплата и кадры бюджетного учреждения 1.0 или Зарплата и управление персоналом 2.5) пользователи часто сталкиваются с неприятным эффектом. При создании документа-исправления за прошлый период показатели времени в начислениях с произвольной формулой внезапно удваиваются. Это ведет к некорректному расчету сумм, особенно в таких начислениях, как «Доплата до МРОТ».
В данной статье мы подробно разберем, почему возникает эта ошибка, проанализируем внутренние механизмы работы системы и предложим два эффективных способа решения проблемы: через изменение настроек начисления и через корректировку программного кода.
Проанализируем ситуацию: когда мы нажимаем кнопку «Исправить» в документе начисления зарплаты, система создает новый документ в текущем периоде регистрации, но с периодом действия, равным исправляемому месяцу. В этот момент в базе данных существуют две записи: первичная (которую мы исправляем, она сторнируется) и новая (исправляющая).
Проблема кроется в использовании показателя ОтработаноВремениВЧасах. Этот показатель является динамическим. В момент расчета система обращается к регистру расчета и собирает данные обо всех записях, которые помечены как «рабочее время» за указанный период. Ошибка в типовом коде конфигурации приводит к тому, что при сборе данных система не разделяет записи по периоду регистрации должным образом. В результате она суммирует время и из сторнируемого документа, и из текущего исправляющего документа. Именно так получается «двойное» время.
Рассмотрим официальный статус этой проблемы. В списках ошибок 1С этот баг проходил под номером 10116246. Несмотря на признание ошибки, во многих релизах старых конфигураций она так и не была исправлена в типовом коде, что требует от администраторов и программистов ручного вмешательства.
Самый простой и безопасный метод, не требующий изменения конфигурации и снятия программы с поддержки — это замена одного показателя на другой. Выясним, в чем разница между похожими на первый взгляд переменными.
Для исправления ситуации выполним следующие действия:
1. Откроем список начислений организации и найдем проблемный вид расчета (например, «Доплата до МРОТ»).
2. Перейдем на вкладку «Расчеты» и нажмем кнопку «Редактировать формулу».
3. В тексте формулы заменим показатель ОтработаноВремениВЧасах на ВремяВЧасах.
Рассмотрим, как должна выглядеть типичная формула для доплаты до МРОТ после правки:
Результат = ?(РасчетнаяБаза < МРОТ * ВремяВЧасах / НормаВремениВЧасах,
МРОТ * ВремяВЧасах / НормаВремениВЧасах - РасчетнаяБаза, 0)
Важный момент: использование связки ВремяВЧасах / НормаВремениВЧасах гарантирует, что расчет будет производиться строго пропорционально времени, отработанному сотрудником, без учета «мусорных» данных из других документов того же периода.
Если в вашей базе настроено очень много видов начислений с произвольными формулами и менять каждый вручную трудозатратно, можно прибегнуть к исправлению первопричины на уровне кода. Этот способ подходит для программистов 1С.
Нам необходимо изменить условие в запросе, который формирует временную таблицу фактически отработанного времени. Рассмотрим алгоритм действий:
1. Зайдем в конфигуратор и найдем общий модуль ПроведениеРасчетов.
2. Найдем процедуру ДописатьАлгоритмВЗапрос.
3. Внутри этой процедуры локализуем блок формирования временной таблицы ВТВсегоОтработаноВремени.
4. Проанализируем условие связи. В типовом коде часто встречается условие:
И Основной.ПериодРегистрации >= Вспомогательный.ПериодРегистрации
Именно оператор >= (больше или равно) заставляет систему подтягивать данные из всех документов, начиная с исправляемого. Нам нужно ограничить выборку только текущим документом. Для этого заменим условие на строгое равенство:
И Основной.ПериодРегистрации = Вспомогательный.ПериодРегистрации
После сохранения изменений и обновления конфигурации базы данных, расчет в документах-исправлениях начнет выполняться корректно. Показатель ОтработаноВремениВЧасах перестанет удваиваться, так как система будет видеть только те записи, которые относятся к текущему периоду регистрации.
Посмотрим на ситуацию шире. Иногда проблемы с расчетом времени возникают из-за некорректных настроек вытеснения. Если вы меняете показатели, обязательно проверьте вкладку «Прочее» в настройках начисления:
Также стоит помнить, что в современных версиях программ (например, ЗУП 3.1) архитектура хранения данных о времени была полностью изменена. Там используются регистры сведений и регистры накопления для учета времени, что исключает подобные ошибки «на лету». Если же вы продолжаете использовать ЗиК БУ 1.0, то описанные выше методы являются единственным способом обеспечить точность расчетов.
Подведем итог: использование показателя ВремяВЧасах вместо ОтработаноВремениВЧасах является наиболее стабильным решением, которое рекомендуют специалисты технической поддержки 1С на ресурсах ИТС. Это позволяет избежать как внутренних ошибок платформы, так и сложностей с поддержкой измененного кода конфигурации.