Как найти место и причину зависания 1С при загрузке данных РИБ

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет
← На главную

Зависание системы в процессе обмена данными в распределенной информационной базе (РИБ) — одна из самых сложных задач для разработчика 1С. Ситуация осложняется тем, что стандартный отладчик часто оказывается бесполезным: если код уходит в бесконечный цикл или сталкивается с блокировкой на уровне файловой системы, точка останова может просто не сработать, а замер производительности не покажет результат, пока процедура не завершится. Рассмотрим подробно, как диагностировать и устранять подобные проблемы на примере 1С:Управление торговлей 10.3.

Анализ симптомов: когда отладка «уходит в пустоту»

Разберем типичную ситуацию: при загрузке файла обмена процесс 1cv8.exe начинает потреблять стабильно 25% ресурсов процессора (что соответствует полной загрузке одного ядра на четырехъядерном процессоре). При этом объем потребляемой памяти практически не меняется. Это классический признак бесконечного цикла в программном коде или зацикливания при чтении XML.

Проблема замера производительности в данном случае заключается в том, что он фиксирует данные только после завершения выполнения функции или процедуры. Если выполнение не прерывается, замер не выдаст никакой информации о текущем «зависшем» участке. Проанализируем методы, которые помогут нам выйти из этой ситуации.

Метод 1: Тонкая настройка замера производительности

Если стандартный замер не помогает, попробуем использовать его более эффективно. Рассмотрим алгоритм действий:

  1. Включите замер производительности в конфигураторе непосредственно перед началом обмена.
  2. Подождите некоторое время (5–10 минут).
  3. Попробуйте остановить выполнение (кнопка «Прервать» или Shift + F5).
  4. Если удалось прервать выполнение, замер покажет количество итераций.

Обратите внимание на колонку «Количество вызовов». Если вы видите, что какой-то оператор или мелкая процедура выполняются тысячи раз за короткий промежуток времени, это и есть место зацикливания. Часто это происходит в механизмах подписок на события, например, ПередЗаписью или ПриЗаписью, где программный код может вызывать сам себя или другие процедуры, приводящие к повторному срабатыванию события.

Метод 2: Диагностика через Технологический журнал (ТЖ)

Для файловой базы данных это самый надежный способ «заглянуть под капот» платформы. Технологический журнал фиксирует события на уровне платформы, даже если встроенный язык 1С перестал отвечать. Для настройки ТЖ создадим файл logcfg.xml в каталоге conf (обычно это C:\Program Files\1cv8\conf).

Рассмотрим пример настройки для отслеживания текущих методов:


<config xmlns="http://v8.1c.ru/7.4/config/logcfg">
  <log location="C:\Logs\1C_Trace" history="24">
    <event>
      <eq property="Name" value="CALL"/>
    </event>
    <event>
      <eq property="Name" value="PROC"/>
    </event>
    <event>
      <eq property="Name" value="EXCP"/>
    </event>
    <property name="All"/>
  </log>
</config>

Поясним назначение событий:

После настройки ТЖ запустите обмен. Как только система зависнет, откройте последний файл лога. Ищите последние записи событий CALL. Процедура, на которой обрывается лог, и является виновником проблемы.

Метод 3: Использование Process Explorer и анализ стека потоков

Если работа с ТЖ кажется слишком сложной, проанализируем состояние процесса с помощью утилиты Process Explorer от Microsoft. Это позволит понять, чем занята программа на уровне системных библиотек.

  1. Запустите Process Explorer и найдите процесс 1cv8.exe.
  2. Откройте свойства процесса (двойной клик) и перейдите на вкладку Threads (Потоки).
  3. Найдите поток, который максимально загружает процессор.
  4. Нажмите кнопку Stack.

Посмотрим на содержимое стека. Если вы видите постоянные обращения к библиотекам типа dbeng8.dll (работа с файловой БД) или v8xml.dll (парсинг XML), это означает, что платформа застряла на низкоуровневой операции. Если же мелькают названия, связанные с вычислениями прав или RLS, причину нужно искать в настройках доступа.

Метод 4: Тестирование данных через разделение файла обмена

Выясним, не является ли причиной зависания конкретный объект в файле обмена. Если файл весит немного (например, 295 Кб), мы можем применить метод «деления пополам»:

  1. Сделайте копию информационной базы.
  2. В исходном узле (откуда идет выгрузка) попробуйте убрать из регистрации часть объектов (например, сначала все регистры накопления, потом регистры сведений).
  3. Сформируйте файл обмена. Если загрузка прошла успешно — проблема в исключенных объектах.
  4. Постепенно сужайте круг поиска, пока не найдете конкретный документ или запись регистра, вызывающую сбой.

Проанализируем возможную причину: часто это рекурсия родителя в справочниках. Например, у элемента «Товар А» родителем назначен «Группа Б», а у «Группы Б» родителем является «Товар А». При попытке записать такой элемент через РИБ платформа может уйти в бесконечный цикл при попытке построить дерево иерархии или проверить права доступа.

Метод 5: Проверка физической целостности и RLS

В файловых базах зависание может быть вызвано разрушением индексов. Даже если вы недавно делали Тестирование и исправление, выполните проверку утилитой chdbfl.exe, которая находится в папке bin платформы 1С. Она проверяет физическую структуру файла .1CD более глубоко.

Также важным моментом в УТ 10.3 является механизм RLS (ограничение прав на уровне записей). Если обмен выполняется под пользователем с ограниченными правами, платформа при записи каждого объекта выполняет сложные запросы для проверки прав. В файловом варианте это происходит крайне медленно и может имитировать зависание.

Рекомендация: Всегда выполняйте загрузку данных РИБ под пользователем с полными правами, у которого в настройках отключены любые ограничения доступа. Это исключит влияние механизмов защиты на процесс записи данных.

Резюме по решению задачи

Если ваша 1С зависла при обмене, не спешите сразу убивать процесс. Сначала проанализируйте загрузку процессора: стабильные 25%, 50% или 100% (в зависимости от ядер) говорят о цикле. Попробуйте метод разделения данных обмена, чтобы локализовать «битый» объект. Если это не помогает, настройте Технологический журнал на событие CALL — это даст стопроцентный результат в поиске конкретной строки кода, на которой спотыкается система. Помните, что в файловых базах решающее значение имеет физическая целостность файла, поэтому регулярная проверка chdbfl.exe должна стать обязательной процедурой обслуживания.

← На главную