В процессе работы с конфигурацией 1С:Зарплата и управление персоналом 3.1 (особенно на релизах ветки 3.1.8) пользователи часто сталкиваются с крайне странным поведением системы. При нажатии на кнопку Провести и закрыть документ визуально меняет статус на «Проведен», однако данные в отчетах не обновляются. Стоит зайти в этот же документ и провести его повторно — данные магическим образом появляются в регистрах и отчетах. Проанализируем причины этой технической аномалии и разберем по шагам методы её устранения.
Разберем ситуацию, которая часто возникала в релизе 3.1.8.112. В этой версии разработчики внедрили механизмы оптимизации расчета, которые призваны ускорить работу системы. Однако на практике возник побочный эффект: система ошибочно определяет состояние данных как «чистое» (не измененное). Выясним причину этого поведения.
Когда вы открываете документ, система фиксирует состояние объекта. Если в процессе заполнения или автоматического фонового пересчета данные обновились, но кэш формы не успел синхронизироваться с базой, возникает конфликт. При первом нажатии кнопки Провести система фактически выполняет лишь синхронизацию данных и запись самого объекта «Документ», пропуская этап формирования движений по регистрам накопления и расчета, так как считает, что они не изменились. Второе проведение уже работает с актуальным состоянием объекта и корректно записывает движения.
Проанализируем влияние платформы. Использование версии 8.3.12.1616 в связке с серверной базой данных (MS SQL Server) накладывает свои особенности. Существовал известный баг платформы, связанный с управлением блокировками. Рассмотрим подробнее механизм возникновения ошибки:
НачисленияУдержанияПоСотрудникам или ВзаиморасчетыССотрудниками) «зависает» или тихо откатывается из-за внутренних конфликтов платформы при управлении блокировками.В этом случае помогает только принудительная инициация повторного проведения, которая создает новую транзакцию в уже «прогретой» области памяти сервера.
Посмотрим на пример работы документа Начисление зарплаты и взносов. В ЗУП 3.1 реализован механизм фонового пересчета зарплаты. Если в момент проведения документа система обнаруживает, что по сотрудникам в документе изменились кадровые данные или графики работы в других сеансах, запускается фоновое задание. Это задание может конфликтовать с процессом записи движений. Первое нажатие Провести лишь «усмиряет» фоновый процесс, а второе — реально фиксирует результат.
Прежде чем приступать к обновлению, проверим, что именно происходит в базе при первом проведении. Выполним следующие действия:
Если движения отсутствуют, попробуем применить временное решение, предложенное опытными администраторами: сначала Отменить проведение, а затем снова нажать Провести. Это гарантированно очищает старые записи и инициализирует новый цикл проведения.
Рассмотрим технические шаги для системного администратора. Часто проблема кроется в «засорении» папок сеансовых данных на сервере 1С. Разберем процедуру очистки:
1C:Enterprise 8.3 Server Agent.C:\Program Files\1cv8\srvinfo).snccntx и conf. Это удалит некорректные кэшированные данные сеансов.Для серверных баз на MS SQL Server крайне рекомендуется включить режим READ_COMMITTED_SNAPSHOT. Это позволит избежать блокировок при чтении данных во время их записи. Выполним SQL-скрипт:
ALTER DATABASE [Имя_Вашей_Базы] SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;
Как показывает практика, наиболее стабильным решением является уход с «сырого» релиза 3.1.8.112. Выясним, на какие версии стоит ориентироваться:
ОбработкаПроведения для исключения прерывания транзакции при закрытии формы.Проанализировав проблему, мы можем составить краткий алгоритм действий для устранения ошибки проведения: