При выполнении тяжелых регламентных операций, таких как расчет себестоимости выпуска (РСВ), закрытие месяца или перепроведение документов, разработчики и администраторы часто сталкиваются с конфликтами блокировок данных. Если предприятие работает в нескольких часовых поясах, активность пользователей в утренние часы может прервать многочасовой ночной расчет. Возникает потребность изолировать базу от обычных пользователей, сохранив при этом возможность выполнения параллельных вычислений и записи проводок через фоновые задания.
Разберем, почему классические платформенные инструменты вызывают сложности в данном сценарии, выясним причины сбоев при длительных операциях и рассмотрим практические способы решения задачи.
Проанализируем базовое поведение платформы «1С:Предприятие» при попытке ограничить доступ к информационной базе:
УстановитьМонопольныйРежим(Истина) полностью блокирует не только подключение новых пользователей, но и запуск любых регламентных и фоновых заданий. Если процедура расчета себестоимости использует параллельные потоки для записи проводок по счетам учета, монопольный режим приведет к ошибке выполнения алгоритма./UC. При этом дочерние фоновые задания, порождаемые разрешенным сеансом, успешно стартуют (если в кластере не взведен флаг «Блокировка регламентных заданий включена»).Однако на практике длительный сеанс администратора, запущенный с параметром /UC, может внезапно прерваться через несколько часов с ошибкой «Начало сеансов с базой запрещено». Выясним, почему это происходит.
Рассмотрим скрытые факторы, приводящие к аварийному завершению сеанса при длительных операциях:
rphost). Расчет себестоимости потребляет значительный объем оперативной памяти. Если в настройках кластера серверов 1С заданы ограничения («Допустимый объем памяти на один процесс» или «Интервал перезапуска рабочих процессов»), сервер штатно перезапускает перегруженный рабочий процесс. Клиентский контекст сбрасывается, а повторная авторизация блокируется кластером.Рассмотрим вариант решения, предложенный автором: ограничение авторизации пользователей на уровне прикладного кода конфигурации без включения платформенной блокировки кластера.
Разберем по шагам логику реализации:
РСВ_МонопольныйРежим с типом данных Булево.Истина.ПередНачаломРаботыСистемы размещаем проверку прав и состояния константы.Посмотрим на пример кода в модуле приложения:
Процедура ПередНачаломРаботыСистемы(Отказ)
// Проверяем, включен ли режим блокировки для расчета
Если Константы.РСВ_МонопольныйРежим.Получить() Тогда
// Пользователям с полными правами вход разрешен
Если Не РолиДоступны("ПолныеПрава") Тогда
Отказ = Истина;
ПоказатьПредупреждение(, "Выполняется регламентный расчет себестоимости. Вход в базу временно ограничен.");
Возврат;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
После завершения расчета (а также в блоке обработки исключений Попытка ... Исключение) обязательно возвращаем значение константы в Ложь.
Важные ограничения данного метода:
ПередНачаломРаботыСистемы не перехватывает сеансы внешних подключений (COM-соединения), а также запросы через Web- и HTTP-сервисы.Проанализируем истинную причину конфликтов при расчете себестоимости. В большинстве случаев РСВ завершается ошибкой не из-за самого факта присутствия пользователей в базе, а из-за того, что параллельно проводятся документы задним числом в закрываемом учетном периоде.
Оптимальным решением является использование штатного механизма дат запрета:
Чтобы избежать обрыва расчета из-за сетевых сбоев между клиентом и сервером 1С, длительные процедуры не следует привязывать к клиентскому интерфейсу. Разберем правильную организацию фонового процесса:
ФоновыеЗадания.Выполнить() или регламентное задание.Если для регламентных работ действительно требуется полная изоляция базы, настроим блокировку сеансов с соблюдением требований стабильности:
SecretCode123).
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /IBName "MyBase" /UC "SecretCode123"
rphost во время пиковых нагрузок РСВ.