Ситуация, когда в программе «1С:Зарплата и управление персоналом 3.1» (ЗУП) внезапно перестает верно рассчитываться оклад сотрудника, является довольно распространенной. Особенно часто пользователи сталкиваются с тем, что процедура «Тестирование и исправление» (ТиИ) помогает восстановить корректный расчет, но через несколько дней проблема возвращается снова. Проанализируем причины такого поведения системы и разберем пошаговый алгоритм окончательного исправления ошибки.
В отличие от предыдущих редакций (например, 2.5), в ЗУП 3.1 реализована «хитрая» технология учета времени. Для того чтобы расчет зарплаты выполнялся быстро, программа не вычисляет отработанное время «на лету» прямо в документе НачислениеЗарплатыИВзносов. Вместо этого она использует вспомогательный регистр накопления ДанныеОВремениДляРасчетаЗарплаты.
Проанализируем ситуацию: когда вы меняете график работы, вводите документ Табель или регистрируете отсутствие (например, БольничныйЛист), программа должна обновить записи в этом регистре. Если в коде релиза есть ошибка (а в старых версиях, таких как 3.1.6, их было немало) или происходит программный сбой, в регистре могут появиться «битые» записи или дубли. ТиИ временно решает проблему, так как при пересчете итогов таблицы регистра перестраиваются, но сама причина появления некорректных данных не устраняется.
Даже если в вашей базе не используется документ Табель, программа все равно опирается на данные графиков. Рассмотрим подробнее, как это работает. Существует регистр сведений ГрафикиРаботыПоВидамВремени. Если записи в нем не соответствуют настройкам самого справочника ГрафикиРаботыСотрудников, расчет оклада будет искажен. Выясним причину: часто это происходит из-за редактирования графиков «задним числом» без последующего пересчета графиков всех сотрудников, к ним привязанных.
В современных версиях ЗУП 3.1 многие операции по расчету времени вынесены в фоновые задания. Рассмотрим подробнее механизм:
ОбновлениеДанныхОВремени в фоновом режиме пересчитывает показатели.
Если регламентное задание завершается с ошибкой или «зависает» (что часто случалось на платформе 8.3.12), данные для расчета оклада остаются неактуальными. Запуск Конфигуратора для проведения ТиИ принудительно обрывает все фоновые сеансы и очищает временные таблицы, что и дает временный эффект исправления.
Рассмотрим технический аспект работы платформы 1С. Версия 8.3.12.1529 является морально устаревшей. В ней зафиксированы ошибки работы менеджера временных таблиц при использовании СУБД (особенно MS SQL Server). При выполнении сложных запросов в механизме расчета зарплаты, 1С создает множество временных таблиц. В случае сбоя, данные из одной сессии расчета могут «просачиваться» в другую или не очищаться вовремя. Рекомендуется обновить платформу минимум до версии 8.3.15 или выше, где механизмы управления кэшем и временными таблицами были значительно оптимизированы.
Если ТиИ помогает лишь временно, выполним следующие действия для глубокой очистки базы:
Прежде всего, необходимо исключить локальные проблемы на рабочих местах. Проанализируем состояние файлов базы. Если база файловая, используем утилиту chdbfl.exe (находится в папке bin установленной платформы). В отличие от ТиИ в конфигураторе, эта утилита проверяет физическую структуру файла .1CD.
Затем очистим кэш пользователя. Для этого удалим базу из списка в стартере 1С и добавим её заново, либо вручную очистим папки в %AppData%\1C\1Cv8.
Вместо полного ТиИ, попробуем использовать специализированные инструменты внутри самой программы. В интерфейсе «Функции для технического специалиста» (ранее «Все функции») найдем и запустим обработку ОбновлениеДанныхОВремени. Это заставит систему пересчитать регистры, отвечающие за явку и начисления. Если после этой обработки оклад начал считаться верно — значит, проблема была именно в фоновых заданиях.
Иногда ошибка кроется не в самом времени, а в плановых начислениях. Посмотрим на ситуацию со стороны регистра ПлановыеНачисления. Попробуем выполнить следующую последовательность действий:
Это обновит записи в регистре сведений ДанныеОФОТДляКарточкиСотрудника и сопутствующих таблицах, которые также участвуют в алгоритмах расчета.
В ЗУП 3.1 работает мощный механизм вытеснения (например, оклад вытесняется больничным). Проанализируем ситуацию, когда документ-вытеснитель был удален некорректно. В регистрах расчета могут остаться записи о «пустом» вытеснении. В режиме ТиИ в Конфигураторе обратим внимание на конкретный пункт: «Очистка записей в таблицах итогов, для которых нет соответствующих записей в основных таблицах». Именно этот пункт чаще всего является «спасительным» в вашей ситуации. Его выполнение удаляет «фантомные» записи, мешающие расчету.
Если проблема повторяется, программисту стоит вмешаться в процесс расчета с помощью отладчика. Разберем, какой программный модуль отвечает за сбор данных. Посмотрим на функцию в общем модуле ПроведениеРасчетов (или аналогичных в зависимости от версии), где формируется запрос к данным о времени.
Пример кода, который можно проанализировать в момент расчета для понимания, какие данные система видит в регистре:
// Пример упрощенного запроса для проверки данных регистра времени
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеОВремени.Сотрудник,
| ДанныеОВремени.ВидУчетаВремени,
| ДанныеОВремени.ОтработаноЧасов
|ИЗ
| РегистрНакопления.ДанныеОВремениДляРасчетаЗарплаты КАК ДанныеОВремени
|ГДЕ
| ДанныеОВремени.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
| И ДанныеОВремени.Сотрудник = &Сотрудник";
Запрос.УстановитьПараметр("ДатаНачала", Объект.ПериодРегистрации);
Запрос.УстановитьПараметр("ДатаОкончания", КонецМесяца(Объект.ПериодРегистрации));
Запрос.УстановитьПараметр("Сотрудник", ТекущийСотрудник);
Результат = Запрос.Выполнить().Выгрузить();
Если в Результат вы видите странные цифры или дублирующиеся строки по одному и тому же виду времени — причина найдена. Это означает сбой транзакции при записи документов.
Ваша текущая версия конфигурации 3.1.6.38 крайне нестабильна. На портале технической поддержки зарегистрировано сотни ошибок для этого релиза. Самым правильным решением будет обновление конфигурации до актуального релиза (на момент написания — ветка 3.1.27 или 3.1.30). Разработчики «1С» внесли множество правок именно в механизм «Данных о времени», сделав его более устойчивым к сбоям и ошибкам платформы.
Резюме: Регулярная необходимость ТиИ — это симптом «битых» итогов или некорректной работы фоновых заданий на старой платформе. Чтобы решить проблему навсегда: