Как решить проблему самопроизвольного включения блокировки регламентных заданий в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе администрирования клиент-серверных баз данных на платформе 1С:Предприятие 8.3 специалисты часто сталкиваются со следующей проблемой: неожиданно «встает» регулярный обмен данными, перестает отправляться почта или зависают другие регламентные процедуры. При проверке свойств информационной базы в консоли кластера серверов обнаруживается, что параметр «Блокировка регламентных заданий включена» (в программной среде платформы — ScheduledJobsDenied) установлен в значение «Истина». При этом ни один из администраторов или пользователей эту блокировку вручную не включал.

Эта проблема характерна для баз под управлением типовых конфигураций (таких как Управление нашей фирмой, Бухгалтерия предприятия, ERP), использующих Библиотеку стандартных подсистем (БСП). В этой статье мы подробно разберем причины возникновения этой ошибки, методы диагностики с помощью Журнала регистрации и практические способы автоматического решения проблемы с помощью программного кода.

Выясняем причины: почему блокировка включается «сама по себе»

На самом деле, платформа или СУБД не меняют настройки базы без внешней команды. Флаг устанавливается программно. Проанализируем основные сценарии, при которых происходит несанкционированное включение блокировки:

  1. Аварийное завершение ночных процедур обслуживания (БСП). Наиболее частая причина. В типовых конфигурациях встроен механизм автоматического резервного копирования. Перед началом создания копии БСП программно подключается к кластеру, завершает сеансы пользователей и устанавливает блокировку регламентных заданий. Это необходимо для того, чтобы во время выгрузки данных не запустились фоновые процессы, способные нарушить согласованность данных. Если в этот момент рабочий процесс rphost завершается аварийно (например, из-за нехватки оперативной памяти или сбоя СУБД), выполнение кода прерывается. Блок кода, отвечающий за снятие блокировки в конце процедуры, попросту не успевает выполниться, и база остается заблокированной.
  2. Сбои при обновлении конфигурации или выполнении отложенных обработчиков. Во время обновления базы данных система временно блокирует регламентные задания во избежание конфликтов блокировок таблиц СУБД. В случае падения процесса обновления в самый неподходящий момент, признак блокировки зависает.
  3. Механизм защиты от копирования БСП. БСП отслеживает параметры подключения к СУБД и имя сервера. Если база данных была перенесена на другой сервер или восстановилась из резервной копии под другим именем, система расценивает ее как тестовую копию. Чтобы предотвратить нежелательную отправку писем реальным клиентам или отправку данных во внешние системы интеграции, БСП блокирует выполнение регламентных заданий.
  4. Сторонние скрипты автоматизации администраторов. Часто системные администраторы настраивают в планировщике задач Windows скрипты автоматического завершения сеансов и резервного копирования. Некорректно обработанные исключения в этих скриптах могут приводить к тому, что блокировка устанавливается, но не снимается обратно при возникновении ошибок на промежуточных этапах.

Шаг 1. Локализация проблемы с помощью Журнала регистрации

Чтобы точно определить, кто или что инициирует установку флага ScheduledJobsDenied, нам необходимо внедрить логирование этого процесса в Журнал регистрации. По умолчанию стандартные механизмы могут не фиксировать детали вызова. Рассмотрим, как дописать логирование непосредственно в код процедур, управляющих блокировкой.

Для этого нам потребуется внести изменения в общий модуль, отвечающий за администрирование параметров кластера (например, АдминистрированиеКластераКлиентСервер или аналогичный модуль вашей конфигурации, где вызывается установка параметров информационной базы). Найдем процедуру, устанавливающую свойства информационной базы, и добавим туда запись в Журнал регистрации с уникальным именем события:


Процедура ЗаписатьБлокировкуВЖурналРегистрации(ИмяБазы, СостояниеБлокировки) Экспорт
    ТекстСобытия = "Изменение флага ScheduledJobsDenied для базы " + ИмяБазы + ". Новое значение: " + СостояниеБлокировки;
    
    ЗаписатьВЖурналРегистрации(
        "АдминистрированиеКластера.БлокировкаРегламентныхЗаданий",
        УровеньЖурналаРегистрации.Предупреждение,
        ,
        ,
        ТекстСобытия
    );
КонецПроцедуры

Добавление уникального имени события "АдминистрированиеКластера.БлокировкаРегламентныхЗаданий" позволит легко отфильтровать Журнал регистрации. Проанализировав запись в момент сбоя, мы сможем увидеть:

  1. Имя пользователя, под которым была запущена сессия (зачастую это будет служебный пользователь, под которым выполняется фоновое резервное копирование).
  2. Приложение (например, Фоновое задание или Тонкий клиент).
  3. Точное время происшествия, что позволит сопоставить сбой с системными логами операционной системы и СУБД.

Шаг 2. Отключение встроенного резервного копирования БСП

Если в ходе анализа выяснилось, что блокировка зависает во время ночного резервного копирования, то лучшим решением для клиент-серверного варианта работы будет полное отключение встроенного механизма резервного копирования БСП.

Встроенный механизм 1С предназначен в первую очередь для файловых баз данных. На крупных клиент-серверных базах создание бэкапа средствами 1С создает избыточную нагрузку на сервер приложений и часто падает по таймауту или из-за нехватки оперативной памяти. Для баз SQL настройте резервное копирование силами самой СУБД (например, планы обслуживания в MS SQL Server или утилиту pg_dump для PostgreSQL). Это работает в десятки раз быстрее, надежнее и не требует установки монопольного доступа и блокировки работы регламентных заданий.

Шаг 3. Реализация скрипта автоматического сброса блокировки

Если быстро устранить первопричину сбоев (например, падение рабочих процессов сервера 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С

Для того чтобы минимизировать риски аварийного завершения работы процессов 1С и зависания блокировок в будущем, выполните следующие профилактические настройки на сервере:

  1. Настройте перезапуск рабочих процессов rphost. В свойствах кластера серверов 1С задайте параметры периодического перезапуска рабочих процессов (например, раз в сутки в период наименьшей активности пользователей) и установите лимиты по расходу оперативной памяти на один процесс. Это предотвратит утечки памяти и внезапные падения процессов из-за перегрузки.
  2. Используйте современные механизмы управления кластером. По возможности переходите от использования COM-соединений (V83.COMConnector) к REST API или консольной утилите rac, работающей совместно со службой ras (сервер администрирования кластера). Это более отказоустойчивый и платформонезависимый подход.
  3. Организуйте мониторинг. Настройте внешние системы мониторинга сервера (например, Zabbix или Prometheus) на отслеживание активности фонового процесса выполнения регламентных заданий. При обнаружении простоя критически важных обменов более заданного времени (например, 1 часа), система должна мгновенно отправлять уведомление администратору.
← На главную