В задаче администрирования систем 1С часто возникает потребность оперативно узнавать о блокировке информационной базы, чтобы уведомить ответственных сотрудников. Однако, понятие "блокировка базы" может означать совершенно разные процессы. Прежде чем искать решение, необходимо четко определить, какой именно тип блокировки нас интересует. Разберем основные сценарии и способы их отслеживания.
Проанализируем две основные категории блокировок:
Рассмотрим способы отслеживания для каждого типа.
Это самый частый сценарий, когда требуется уведомление. Например, администратор заблокировал базу для обновления, и нужно сообщить об этом ключевым пользователям. Способы отлова зависят от варианта работы с базой.
В клиент-серверном варианте у нас есть несколько надежных способов отследить установку блокировки. Стоит отметить, что если ваши серверы работают на ОС Linux, то для управления процессом пригодится специальная обработка для установки и снятия блокировок у БД на сервере под Linux.
Способ 1: Анализ журнала регистрации
Это самый правильный и "внутренний" метод. При установке и снятии блокировки в консоли администрирования кластера серверов 1С в журнал регистрации записываются соответствующие события. Наша задача — настроить их автоматический отлов. Чтобы не писать систему уведомлений с нуля, можно применить готовый инструмент для рассылки e-mail уведомлений по записям журнала регистрации, который позволяет гибко настраивать отборы.
Разберем по шагам, как это реализовать самостоятельно:
ВыборкаЖурналаРегистрации, установив фильтр по событию и периоду.Посмотрим на пример кода для серверного модуля:
Процедура МониторингБлокировкиБазы() Экспорт
// Определяем период для анализа (например, последние 5 минут)
ДатаОкончания = ТекущаяДата();
ДатаНачала = ДатаОкончания - 300; // 300 секунд = 5 минут
// Настраиваем отбор
Отбор = Новый Структура;
Отбор.Вставить("Событие", "Установка блокировки соединений с информационной базой");
// Получаем записи из журнала регистрации
Выборка = ПолучитьЗаписиЖурналаРегистрации(Отбор, ДатаНачала, ДатаОкончания);
// Проверяем, были ли события
Если Выборка.Количество() > 0 Тогда
// Если найдено событие блокировки, значит, базу заблокировали
// Здесь размещаем код для отправки почтового сообщения
ОтправитьУведомление("Информационная база была заблокирована для работы пользователей.");
КонецЕсли;
КонецПроцедуры
Функция ПолучитьЗаписиЖурналаРегистрации(Отбор, ДатаНачала, ДатаОкончания)
МассивСобытий = Новый Массив;
МассивСобытий.Добавить(ПланыВидовХарактеристик.ИменаСобытийЖурналаРегистрации.НайтиПоНаименованию(Отбор.Событие));
ОтборЖР = Новый Структура;
ОтборЖР.Вставить("Событие", МассивСобытий);
Возврат ВыгрузитьЖурналРегистрации(ОтборЖР, , ДатаНачала, ДатаОкончания);
КонецФункции
Важный момент: этот код необходимо разместить в общем модуле с установленными флагами "Сервер" и "Внешнее соединение" и вызывать его из регламентного задания.
Способ 2: Метод пробного соединения
Этот подход не требует программирования внутри 1С. Его суть — периодическая попытка подключения к базе извне. Если база заблокирована, попытка соединения завершится с характерной ошибкой.
Этот метод хорош тем, что он не зависит от работоспособности регламентных заданий в самой блокируемой базе.
Способ 3: Проверка блокировки для обновления конфигурации
Если вам нужно отловить только тот вид блокировки, который устанавливается для обновления конфигурации, можно воспользоваться готовой функцией из Библиотеки стандартных подсистем (БСП). Эта функция проверяет наличие и параметры блокировки, предназначенной именно для динамического или монопольного обновления.
Функция находится в общем модуле ОбновлениеИнформационнойБазыСлужебный:
ОбновлениеИнформационнойБазыСлужебный.ИнформационнаяБазаЗаблокированаДляОбновления()
Она возвращает Истина, если база заблокирована для обновления. Ее также можно вызывать в регламентном задании для мониторинга.
В файловом варианте механизм блокировки устроен проще. При установке блокировки в каталоге с информационной базой создается специальный служебный файл 1Cv8.cdn. Как только блокировка снимается, этот файл удаляется.
Это позволяет организовать мониторинг очень просто:
1Cv8.cdn в папке с файловой базой.Это надежный и простой способ для файловых баз.
Если под "блокировкой" вы понимаете проблемы производительности — длительные ожидания или взаимные блокировки (deadlocks), — то для их отлова нужен более мощный инструмент, такой как замер производительности контура 1С и поиск узких мест.
Основной инструмент — Технологический журнал (ТЖ)
Технологический журнал 1С — это система сбора низкоуровневой информации о работе платформы. Он позволяет отловить практически любые проблемы, включая конфликты блокировок. Также в дополнение к ТЖ бывает крайне полезно провести анализ SQL сервера глазами 1С-ника, чтобы увидеть картину происходящего на уровне СУБД.
Шаг 1: Настройка технологического журнала
Настройка выполняется через конфигурационный файл logcfg.xml, который должен находиться в каталоге conf папки с бинарными файлами сервера 1С (например, C:\Program Files\1cv8\conf).
Для отлова блокировок нас интересуют следующие события:
TLOCK — конфликт блокировок на уровне СУБД.TTIMEOUT — превышение времени ожидания на блокировке (тайм-аут).TDEADLOCK — возникновение ситуации взаимной блокировки.Пример файла logcfg.xml для отслеживания этих событий:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\1C\Logs\TLogs" history="168">
<event>
<eq property="name" value="TLOCK"/>
</event>
<event>
<eq property="name" value="TTIMEOUT"/>
</event>
<event>
<eq property="name" value="TDEADLOCK"/>
</event>
<property name="all"/>
</log>
</config>
Важно: После создания или изменения файла logcfg.xml необходимо перезапустить службу Агента сервера 1С:Предприятия.
Шаг 2: Анализ и реагирование
Технологический журнал будет записывать подробную информацию о каждой проблеме с блокировкой в текстовые файлы в указанный каталог. В этих файлах содержится вся необходимая информация для анализа: имя пользователя, контекст кода, текст запроса, таблицы и ресурсы, на которых произошел конфликт.
Для автоматического реагирования необходимо:
TTIMEOUT или TDEADLOCK скрипт должен "распарсить" эту запись, извлекая из нее ключевую информацию.Этот метод требует более глубоких технических знаний, но является самым эффективным способом борьбы с проблемами производительности, связанными с блокировками.
Как мы выяснили, задача "отловить блокировку базы" не имеет одного универсального решения. Первый и самый важный шаг — определить, о какой именно блокировке идет речь. Для административных блокировок отлично подходит анализ Журнала регистрации или внешние проверки. Если же баз в вашей ответственности много, стоит рассмотреть специализированную конфигурацию для администрирования большого количества баз. А для проблем с транзакционными блокировками незаменимым инструментом является Технологический журнал. Выбрав правильный метод, вы сможете настроить надежную систему уведомлений и оперативно реагировать на важные события в жизни вашей информационной базы.