В процессе администрирования клиент-серверных баз данных на платформе 1С:Предприятие 8.3 специалисты часто сталкиваются со следующей проблемой: неожиданно «встает» регулярный обмен данными, перестает отправляться почта или зависают другие регламентные процедуры. При проверке свойств информационной базы в консоли кластера серверов обнаруживается, что параметр «Блокировка регламентных заданий включена» (в программной среде платформы — ScheduledJobsDenied) установлен в значение «Истина». При этом ни один из администраторов или пользователей эту блокировку вручную не включал.
Эта проблема характерна для баз под управлением типовых конфигураций (таких как Управление нашей фирмой, Бухгалтерия предприятия, ERP), использующих Библиотеку стандартных подсистем (БСП). В этой статье мы подробно разберем причины возникновения этой ошибки, методы диагностики с помощью Журнала регистрации и практические способы автоматического решения проблемы с помощью программного кода.
На самом деле, платформа или СУБД не меняют настройки базы без внешней команды. Флаг устанавливается программно. Проанализируем основные сценарии, при которых происходит несанкционированное включение блокировки:
rphost завершается аварийно (например, из-за нехватки оперативной памяти или сбоя СУБД), выполнение кода прерывается. Блок кода, отвечающий за снятие блокировки в конце процедуры, попросту не успевает выполниться, и база остается заблокированной.Чтобы точно определить, кто или что инициирует установку флага ScheduledJobsDenied, нам необходимо внедрить логирование этого процесса в Журнал регистрации. По умолчанию стандартные механизмы могут не фиксировать детали вызова. Рассмотрим, как дописать логирование непосредственно в код процедур, управляющих блокировкой.
Для этого нам потребуется внести изменения в общий модуль, отвечающий за администрирование параметров кластера (например, АдминистрированиеКластераКлиентСервер или аналогичный модуль вашей конфигурации, где вызывается установка параметров информационной базы). Найдем процедуру, устанавливающую свойства информационной базы, и добавим туда запись в Журнал регистрации с уникальным именем события:
Процедура ЗаписатьБлокировкуВЖурналРегистрации(ИмяБазы, СостояниеБлокировки) Экспорт
ТекстСобытия = "Изменение флага ScheduledJobsDenied для базы " + ИмяБазы + ". Новое значение: " + СостояниеБлокировки;
ЗаписатьВЖурналРегистрации(
"АдминистрированиеКластера.БлокировкаРегламентныхЗаданий",
УровеньЖурналаРегистрации.Предупреждение,
,
,
ТекстСобытия
);
КонецПроцедуры
Добавление уникального имени события "АдминистрированиеКластера.БлокировкаРегламентныхЗаданий" позволит легко отфильтровать Журнал регистрации. Проанализировав запись в момент сбоя, мы сможем увидеть:
Если в ходе анализа выяснилось, что блокировка зависает во время ночного резервного копирования, то лучшим решением для клиент-серверного варианта работы будет полное отключение встроенного механизма резервного копирования БСП.
Встроенный механизм 1С предназначен в первую очередь для файловых баз данных. На крупных клиент-серверных базах создание бэкапа средствами 1С создает избыточную нагрузку на сервер приложений и часто падает по таймауту или из-за нехватки оперативной памяти. Для баз SQL настройте резервное копирование силами самой СУБД (например, планы обслуживания в MS SQL Server или утилиту pg_dump для PostgreSQL). Это работает в десятки раз быстрее, надежнее и не требует установки монопольного доступа и блокировки работы регламентных заданий.
Если быстро устранить первопричину сбоев (например, падение рабочих процессов сервера 1С) не удается, в качестве временного решения («костыля») можно использовать скрипт автоконтроля. Мы можем написать обработку, которая будет запускаться по расписанию из другой, гарантированно работающей базы данных, либо использовать внешнее решение.
Рассмотрим пример кода на встроенном языке 1С, который подключается к кластеру серверов через COMConnector, проверяет состояние флага блокировки регламентных заданий для конкретной базы (в примере — база с именем "unf") и принудительно отключает блокировку, если она включена:
// Создаем объект внешнего соединения для работы с кластером
Коннектор = Новый COMОбъект("V83.ComConnector");
// Подключаемся к агенту сервера 1С на локальном хосте (замените "localhost" при необходимости)
Агент = Коннектор.ConnectAgent("localhost");
// Получаем первый доступный кластер серверов
Кластер = Агент.GetClusters().GetValue(0);
// Авторизуемся в кластере (если заданы имя администратора кластера и пароль)
Агент.Authenticate(Кластер, "", "");
// Получаем список рабочих процессов кластера
Процессы = Агент.GetWorkingProcesses(Cluster);
Для Каждого РабочийПроцесс Из Процессы Цикл
Если РабочийПроцесс.Running И РабочийПроцесс.IsEnable Тогда
// Формируем строку соединения с рабочим процессом
СтрокаСоединенияСРабочимПроцессом = РабочийПроцесс.HostName + ":" + Формат(РабочийПроцесс.MainPort, "ЧГ=");
СоединениеСРабочимПроцессом = Коннектор.ConnectWorkingProcess(СтрокаСоединенияСРабочимПроцессом);
// Авторизуемся на рабочем процессе (указываем логин и пароль администратора кластера)
СоединениеСРабочимПроцессом.AddAuthentication("логин_администратора", "пароль_администратора");
// Получаем список информационных баз рабочего процесса
Базы = СоединениеСРабочимПроцессом.GetInfoBases();
Для Каждого База Из Базы Цикл
// Ищем нужную информационную базу по ее имени в кластере
Если ВРег(База.Name) = "UNF" Тогда
// Если блокировка регламентных заданий включена - выключаем ее
Если База.ScheduledJobsDenied Тогда
База.ScheduledJobsDenied = Ложь;
// Записываем обновленные свойства информационной базы в кластер
СоединениеСРабочимПроцессом.UpdateInfoBase(База);
// Опционально: можно зафиксировать факт авторазблокировки в лог-файл или ЖР
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
// Очищаем COM-объекты для освобождения памяти
Коннектор = Неопределено;
Этот код можно оформить в виде внешней обработки и запускать с помощью планировщика задач операционной системы Windows через запуск тонкого/толстого клиента 1С в режиме предприятия под управлением специально созданной служебной базы. Также этот скрипт можно переписать на язык сценариев OneScript или реализовать аналогичную логику через утилиту администрирования rac (работающую через RAS), что позволит избежать привязки к технологиям COM, которые постепенно устаревают и могут нестабильно работать на 64-битных операционных системах.
Для того чтобы минимизировать риски аварийного завершения работы процессов 1С и зависания блокировок в будущем, выполните следующие профилактические настройки на сервере:
V83.COMConnector) к REST API или консольной утилите rac, работающей совместно со службой ras (сервер администрирования кластера). Это более отказоустойчивый и платформонезависимый подход.