Рассмотрим весьма распространенную ситуацию, с которой сталкиваются пользователи и администраторы конфигурации 1С:Бухгалтерия предприятия 3.0 (и других решений на платформе 1С:Предприятие 8.3). Один пользователь открыл важный документ и неспешно редактирует его в течение половины рабочего дня. В этот же момент другой сотрудник (например, заместитель главного бухгалтера) запускает процедуру ЗакрытиеМесяца или регламентное групповое перепроведение документов.
Документ, открытый у первого пользователя, успешно проводится фоновым заданием. Но когда первый пользователь наконец нажимает кнопку «Записать», программа выдает критическую ошибку: «Версия открытого документа неактуальна». В результате данные, которые кропотливо вводились часами, оказываются потеряны, а документ просто закрывается. Разберем по шагам, почему так происходит, и выясним причину такого поведения системы.
Проанализируем техническую сторону вопроса. То, что мы описали выше — это классическое срабатывание механизма платформы, который называется «Оптимистическая блокировка».
Когда пользователь открывает форму документа, платформа 1С считывает данные из базы и запоминает текущую версию объекта, которая хранится во внутреннем поле DataVersion. В этот момент жестких запретов на изменение документа в базе нет. Если затем запускается фоновое закрытие месяца, процедура группового перепроведения перезаписывает этот документ в базе данных. При этом платформа генерирует для документа новую версию DataVersion.
Когда наш первый пользователь наконец нажимает на кнопку записи, платформа 1С сравнивает ту версию объекта, которую пользователь скачал при открытии формы, с той, что в данный момент лежит в базе данных. Видя расхождение (версии не совпадают), платформа останавливает процесс записи и выдает ошибку, чтобы старые (возможно, уже неактуальные) данные пользователя не затерли новые движения и статусы, сформированные регламентной операцией. Это сделано для сохранения целостности учета.
Посмотрим на важный нюанс платформы 1С. Почему вообще регламентная процедура смогла перепровести документ, если он был открыт у пользователя? Здесь кроется разница между простым просмотром и фактическим редактированием.
Модифицированность = Истина. В этот момент платформа накладывает жесткую (пессимистическую) блокировку базы данных.Если бы документ был заблокирован пессимистической блокировкой (то есть пользователь начал вносить изменения ДО того, как до документа добралось закрытие месяца), то групповое перепроведение вообще не смогло бы его провести. Фоновое задание «споткнулось» бы об этот документ, прождало бы таймаут и выдало ошибку блокировки данных инициатору закрытия месяца.
Потеря данных происходит именно тогда, когда документ долго висел открытым без изменений, затем успешно перепровелся фоном, и лишь после этого пользователь начал в нем что-то менять, попытавшись затем его сохранить.
Организационные меры в духе «отгонять палкой от компьютера всех, когда идет закрытие месяца» работают плохо. Рассмотрим штатные инструменты 1С:Предприятие 8.3, которые позволяют решить эту проблему системно.
Это самый правильный и технически грамотный подход. Тот, кто выполняет закрытие месяца или запускает тяжелое групповое перепроведение, должен сначала ограничить доступ к базе. Для этого:
Эта обработка рассылает всем активным пользователям предупреждение о предстоящих регламентных работах, через заданное время корректно и безопасно завершает их сеансы и временно запрещает вход в базу всем, кроме администратора или главного бухгалтера.
Еще один полезный инструмент, который упоминался в обсуждении — это ДатаЗапретаРедактирования. Если вы закрыли прошлый период (например, месяц), сразу же устанавливайте дату запрета по пользователям или в целом по организации. Это защитит закрытый период от шаловливых ручек. Даже если кто-то откроет старый документ, платформа не позволит его модифицировать, тем самым исключив риск случайного повреждения учета.
Если худшее уже случилось и пользователь получил ошибку о неактуальной версии, его труд не обязательно потерян безвозвратно. В современных релизах платформы 1С 8.3 реализована функция автосохранения несохраненных данных (работает с кэшем). При повторном открытии того же самого документа программа обнаружит наличие несохраненной версии и предложит восстановить данные. Рекомендуем обучить пользователей обращать внимание на это системное сообщение.
Чтобы иметь возможность разобраться в любой конфликтной ситуации, включите механизм истории изменений.
Это позволит в любой момент посмотреть, как выглядел документ до того, как по нему «проехалось» регламентное задание, кто именно внес изменения, и при необходимости откатиться к корректной предыдущей версии.
Применяя эти простые инструменты администратора, вы сможете навсегда исключить потерю данных и нервов ваших пользователей при проведении тяжелых регламентных операций в 1С!