Зависание системы в процессе обмена данными в распределенной информационной базе (РИБ) — одна из самых сложных задач для разработчика 1С. Ситуация осложняется тем, что стандартный отладчик часто оказывается бесполезным: если код уходит в бесконечный цикл или сталкивается с блокировкой на уровне файловой системы, точка останова может просто не сработать, а замер производительности не покажет результат, пока процедура не завершится. Рассмотрим подробно, как диагностировать и устранять подобные проблемы на примере 1С:Управление торговлей 10.3.
Разберем типичную ситуацию: при загрузке файла обмена процесс 1cv8.exe начинает потреблять стабильно 25% ресурсов процессора (что соответствует полной загрузке одного ядра на четырехъядерном процессоре). При этом объем потребляемой памяти практически не меняется. Это классический признак бесконечного цикла в программном коде или зацикливания при чтении XML.
Проблема замера производительности в данном случае заключается в том, что он фиксирует данные только после завершения выполнения функции или процедуры. Если выполнение не прерывается, замер не выдаст никакой информации о текущем «зависшем» участке. Проанализируем методы, которые помогут нам выйти из этой ситуации.
Если стандартный замер не помогает, попробуем использовать его более эффективно. Рассмотрим алгоритм действий:
Shift + F5).Обратите внимание на колонку «Количество вызовов». Если вы видите, что какой-то оператор или мелкая процедура выполняются тысячи раз за короткий промежуток времени, это и есть место зацикливания. Часто это происходит в механизмах подписок на события, например, ПередЗаписью или ПриЗаписью, где программный код может вызывать сам себя или другие процедуры, приводящие к повторному срабатыванию события.
Для файловой базы данных это самый надежный способ «заглянуть под капот» платформы. Технологический журнал фиксирует события на уровне платформы, даже если встроенный язык 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. Процедура, на которой обрывается лог, и является виновником проблемы.
Если работа с ТЖ кажется слишком сложной, проанализируем состояние процесса с помощью утилиты Process Explorer от Microsoft. Это позволит понять, чем занята программа на уровне системных библиотек.
1cv8.exe.Посмотрим на содержимое стека. Если вы видите постоянные обращения к библиотекам типа dbeng8.dll (работа с файловой БД) или v8xml.dll (парсинг XML), это означает, что платформа застряла на низкоуровневой операции. Если же мелькают названия, связанные с вычислениями прав или RLS, причину нужно искать в настройках доступа.
Выясним, не является ли причиной зависания конкретный объект в файле обмена. Если файл весит немного (например, 295 Кб), мы можем применить метод «деления пополам»:
Проанализируем возможную причину: часто это рекурсия родителя в справочниках. Например, у элемента «Товар А» родителем назначен «Группа Б», а у «Группы Б» родителем является «Товар А». При попытке записать такой элемент через РИБ платформа может уйти в бесконечный цикл при попытке построить дерево иерархии или проверить права доступа.
В файловых базах зависание может быть вызвано разрушением индексов. Даже если вы недавно делали Тестирование и исправление, выполните проверку утилитой chdbfl.exe, которая находится в папке bin платформы 1С. Она проверяет физическую структуру файла .1CD более глубоко.
Также важным моментом в УТ 10.3 является механизм RLS (ограничение прав на уровне записей). Если обмен выполняется под пользователем с ограниченными правами, платформа при записи каждого объекта выполняет сложные запросы для проверки прав. В файловом варианте это происходит крайне медленно и может имитировать зависание.
Рекомендация: Всегда выполняйте загрузку данных РИБ под пользователем с полными правами, у которого в настройках отключены любые ограничения доступа. Это исключит влияние механизмов защиты на процесс записи данных.
Если ваша 1С зависла при обмене, не спешите сразу убивать процесс. Сначала проанализируйте загрузку процессора: стабильные 25%, 50% или 100% (в зависимости от ядер) говорят о цикле. Попробуйте метод разделения данных обмена, чтобы локализовать «битый» объект. Если это не помогает, настройте Технологический журнал на событие CALL — это даст стопроцентный результат в поиске конкретной строки кода, на которой спотыкается система. Помните, что в файловых базах решающее значение имеет физическая целостность файла, поэтому регулярная проверка chdbfl.exe должна стать обязательной процедурой обслуживания.