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