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