В версиях 1С:Зарплата и управление персоналом 3.1.18.х и 3.1.19.х пользователи массово столкнулись с неприятной ситуацией: при расчете документов-отклонений (командировки, больничные, отпуска) показатель ВремяВДняхЧасах внезапно обнуляется. Это приводит к тому, что сумма начисления становится равной нулю. Примечательно, что ошибка проявляется только после записи документа в базу данных — в новом, еще не сохраненном документе, расчет может проходить корректно.
В рамках данной статьи мы подробно разберем причины этого поведения системы, проанализируем взаимосвязь документов и найдем способы решения проблемы, основываясь на опыте практикующих специалистов и особенностях нового механизма учета времени.
Начиная с релизов 3.1.18.216, разработчики 1С внедрили так называемый «новый механизм учета времени». Главная идея этого изменения заключалась в оптимизации производительности и повышении точности учета «внутрисменных» отклонений. Однако на практике это привело к конфликтам при расчете времени «на лету».
Разберем ситуацию подробно. Когда мы создаем документ, например, Командировка, программа должна определить, сколько рабочих дней или часов приходится на период отсутствия сотрудника. В старых версиях программа просто обращалась к графику работы. Теперь же система пытается анализировать данные из специальных регистров оперативного учета времени. Если в периоде есть «переходящие» документы (например, отпуск, начавшийся в сентябре и закончившийся в октябре), алгоритм определения остатка времени может дать сбой, так как записи в регистрах еще не обновились или конфликтуют между собой.
Проанализируем типичный сценарий ошибки:
Как было отмечено в ходе обсуждения проблемы, наиболее быстрым и действенным (хотя и не всегда удобным) способом является создание и проведение документа Табель за месяц, в котором происходит расчет. Рассмотрим, почему это помогает.
Дело в том, что документ Табель при проведении делает жесткие записи в регистры учета времени. Когда расчетный документ (командировка) обращается к данным, он видит уже готовую структуру времени, а не пытается рассчитать ее динамически. Если в вашей организации табели заполняются автоматически, попробуйте провести Табель перед расчетом командировки. Если расчет прошел успешно — значит, проблема именно в «динамическом» определении времени.
Однако, если табели загружаются из внешних систем или ведутся только в конце месяца, этот вариант может не подойти. В таком случае перейдем к следующим методам.
Иногда корень проблемы кроется в настройках самих начислений. Нам необходимо проверить, как программа понимает, какое начисление должно «вытеснять» другое. Рассмотрим алгоритм проверки:
Командировка.Вид времени указан корректно (например, Командировка), а не выбран ошибочный вариант, дублирующий основную явку.Если в списке приоритетов отсутствуют необходимые виды расчетов, система может запутаться при распределении часов, что приведет к обнулению показателя ВремяВДняхЧасах.
Поскольку проблема носит массовый характер и признана разработчиками 1С, для релизов ветки 3.1.18/3.1.19 выпускались специальные исправления (патчи). Проанализируем действия по их установке:
Зайдем в раздел Администрирование — Обслуживание — Обновление программы. Выберем пункт Установленные исправления (патчи). Нам необходимо убедиться, что установлены патчи, исправляющие ошибки расчета времени. Одним из таких патчей в свое время был EF_60000133. Если патчи установлены, но не помогают, попробуйте их временно отключить и проверить расчет — иногда возникают конфликты между несколькими исправлениями.
Для программистов 1С существует возможность временного обхода ошибки через расширение конфигурации. В обсуждении упоминается возможность «закомментировать строку», которая отвечает за проверку времени при записи документа. Рассмотрим пример логики, которую часто используют в таких случаях в модулях расчета:
// В модуле управления расчетом времени часто встречается проверка
// на наличие записанных данных в оперативных регистрах.
// Если мы принудительно заставим систему считать время по графику, а не по регистрам:
Если ЭтоНовыйОбъект Тогда
// Расчет идет по графику - работает корректно
Иначе
// Система пытается взять данные из записанных регистров - тут возникает ОШИБКА
// Временное решение: заставить систему всегда считать по алгоритму для нового объекта
// РезультатРасчета = РасчитатьПоГрафику(Параметры);
КонецЕсли;
Важно: Прямое редактирование типового кода крайне не рекомендуется. Лучшим решением будет создание расширения, которое перехватывает процедуру расчета времени и корректирует поведение системы без изменения основной конфигурации.
Разберем еще несколько моментов, которые могут влиять на результат:
Графики работы сотрудников, открыть текущий график и нажать кнопку Заполнить. Даже если визуально всё верно, это пересчитает внутренние кэшированные данные о времени в базе.Таким образом, мы проанализировали ситуацию с обнулением показателя ВремяВДняхЧасах и выяснили, что проблема вызвана особенностями записи данных в регистры оперативного учета времени в новых релизах. Наиболее стабильным «быстрым» решением остается временное использование документа Табель, а стратегическим — установка актуальных патчей или обновление конфигурации до стабильных сборок.