При работе с информационными системами на платформе 1С:Предприятие 8.3 пользователи могут столкнуться с критической проблемой: зависанием или падением сервера 1С во время выполнения фоновых регламентных заданий. Это может привести к недоступности базы данных для всех пользователей, потере данных и значительным простоям. В этой статье мы подробно рассмотрим, как выявить причины таких зависаний, какие инструменты использовать для диагностики и какие шаги предпринять для устранения проблемы.
Когда регламентное задание запускается в фоновом режиме, оно работает в контексте рабочего процесса сервера 1С (rphost). Если в коде задания есть ошибки, неэффективные запросы, утечки памяти или слишком длительные транзакции, это может привести к чрезмерному потреблению ресурсов, блокировкам или краху рабочего процесса, что в конечном итоге сказывается на работе всего сервера 1С. Разберем, как последовательно подойти к решению этой задачи.
Прежде всего, проанализируем сам код регламентного задания. Часто причиной зависаний является неэффективная работа с данными или ресурсами.
ВЫБРАТЬ *), если вам не нужны все данные; выбирайте только те поля, которые действительно необходимы. Чем меньше данных мы выбираем и обрабатываем, тем быстрее работает запрос и тем меньше ресурсов потребляется.
БольшаяТаблицаЗначений = ПолучитьДанныеДляОбработки();
// ... логика обработки БольшойТаблицыЗначений ...
БольшаяТаблицаЗначений = Неопределено; // Освобождаем память
Отлаживать фоновое задание напрямую в 1С:Предприятии достаточно сложно, так как оно выполняется без интерактивного интерфейса и привязки к сеансу отладки. Поэтому мы активно используем механизм внутреннего логирования.
ЗаписьЖурналаРегистрации: Внедрите в код вашего регламентного задания вызовы функции ЗаписьЖурналаРегистрации в ключевых точках выполнения. Это позволит отслеживать ход выполнения задания, даже когда оно работает в фоне. Мы можем записывать информацию о начале и конце выполнения, об обработке определенных порций данных, о критических шагах или возможных ошибках. Это бесценный инструмент для понимания того, на каком этапе происходит зависание или аномальное поведение.
// В начале процедуры регламентного задания
ЗаписьЖурналаРегистрации(НСтр("ru='Начало выполнения регламентного задания ''МояВыгрузкаДанных'''"), УровеньВажностиЖурналаСобытий.Информация, , , "МоеРегламентноеЗадание.Выполнить");
// Внутри цикла, после обработки каждой порции данных
КоличествоОбработанныхЗаписей = 100; // Примерное значение
ЗаписьЖурналаРегистрации(НСтр("ru='Обработано '") + КоличествоОбработанныхЗаписей + НСтр("ru=' записей'"), УровеньВажностиЖурналаСобытий.Информация, , , "МоеРегламентноеЗадание.Выполнить");
// В конце процедуры
ЗаписьЖурналаРегистрации(НСтр("ru='Завершение выполнения регламентного задания ''МояВыгрузкаДанных'''"), УровеньВажностиЖурналаСобытий.Информация, , , "МоеРегламентноеЗадание.Выполнить");
Для более глубокой диагностики мы будем использовать системные инструменты 1С и операционной системы.
rphost). Если мы наблюдаем постоянный рост потребления памяти у процесса, который соответствует нашему регламентному заданию, и эта память не освобождается, это является явным признаком утечки памяти. Регулярный мониторинг поможет выявить процессы-потребители ресурсов.
// Пример кода в модуле формы внешней обработки
Процедура ВыполнитьРегламентноеЗаданиеНапрямую() Экспорт
// Предполагаем, что процедура регламентного задания находится в общем модуле
ОбщиеМодули.МоеРегламентноеЗадание.Выполнить();
КонецПроцедуры
Технологический журнал (ТЖ) 1С — это самый мощный и детальный инструмент для диагностики проблем с производительностью и стабильностью сервера 1С. Мы используем его для сбора максимально подробной информации о происходящих событиях на сервере.
logcfg.xml, который находится в каталоге установки сервера 1С (обычно C:\Program Files\1cv8\srvinfo\conf). В этом файле мы указываем, какие события нас интересуют и с каким уровнем детализации.
Мы рекомендуем настроить сбор информации по следующим типам событий:
MEMORY: Для отслеживания потребления и утечек памяти рабочими процессами rphost.CALL: Для детализации вызовов процедур и функций в коде 1С, что позволит увидеть, какие именно фрагменты кода выполняются и как долго.DBMSSQL (или соответствующий для вашей СУБД): Для анализа запросов к базе данных, их длительности и контекста выполнения.TLOCK: Для выявления блокировок транзакций.EXCP: Для регистрации исключений и ошибок.Пример настройки секции <log> в файле logcfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\1C_Logs" history="10" max_size="1024">
<event>
<eq property="p:processName" value="rphost"/>
<any>
<eq property="Type" value="MEMORY"/>
<eq property="Type" value="CALL"/>
<eq property="Type" value="DBMSSQL"/>
<eq property="Type" value="TLOCK"/>
<eq property="Type" value="EXCP"/>
</any>
</event>
<log type="MEMORY">
<event>
<eq property="Proc" value="rphost"/>
<property name="MemoryPeak" level="50000000"/> <!-- 50MB пикового потребления -->
<property name="MemoryLeak" level="10000000"/> <!-- 10MB утечки за период -->
</event>
</log>
<log type="CALL">
<event>
<like property="Name" value="ОбщиеМодули.МоеРегламентноеЗадание.Выполнить"/> <!-- Отслеживаем вызовы нашей процедуры -->
<property name="Duration" level="1000000"/> <!-- Вызовы дольше 1 секунды -->
</event>
</log>
<log type="DBMSSQL">
<event>
<like property="Context" value="МоеРегламентноеЗадание.Выполнить"/> <!-- Контекст, из которого выполняется запрос -->
<property name="Duration" level="2000000"/> <!-- Запросы дольше 2 секунд (2 млн мкс) -->
</event>
</log>
</log>
</config>
В этом примере мы настраиваем логирование для процесса rphost по нескольким типам событий. Особое внимание уделено:
MemoryPeak и MemoryLeak: Позволяют фиксировать превышение пикового потребления памяти и обнаружение утечек.Name в событии CALL: Мы можем указать конкретное имя процедуры, которое выполняется регламентным заданием, чтобы сузить область поиска.Duration для CALL и DBMSSQL: Позволяет выявлять операции, которые выполняются дольше заданного порога, что указывает на "узкие места".После изменения файла logcfg.xml обязательно перезапустите службу сервера 1С, чтобы изменения вступили в силу.
C:\1C_Logs). Мы будем искать записи, которые предшествовали зависанию или содержат информацию о превышении порогов по памяти, длительности вызовов или SQL-запросов. Специализированные утилиты для анализа ТЖ (например, Log Analyzer от 1С или сторонние инструменты) значительно упрощают этот процесс, позволяя визуализировать данные, строить графики и фильтровать события по различным критериям.
Помимо вышеописанных методов, мы также рекомендуем обратить внимание на следующие моменты:
Применяя комплексный подход, включающий оптимизацию кода, внутреннее логирование, мониторинг через консоль кластера и детальный анализ технологического журнала, мы сможем эффективно диагностировать и устранить причины зависаний сервера 1С, вызванных фоновыми регламентными заданиями, значительно повысив стабильность и производительность всей системы.