Как отладить внешнюю обработку, запускаемую через COM-соединение в 1С?

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

В процессе разработки и поддержки интеграций, особенно при использовании сторонних решений (например, от компании Клеверенс), программисты часто сталкиваются с ситуацией, когда код внешней обработки, вызываемой через COM-соединение, отказывается «останавливаться» на точках останова. При этом само COM-соединение прекрасно видно в списке предметов отладки, и конфигуратор к нему успешно подключается. Разберем по шагам, почему это происходит и какими методами можно добиться стабильной работы отладчика в таких условиях.

Проблема сопоставления исходного кода

Проанализируем основную причину, по которой точки останова игнорируются. Когда 1С работает в режиме COM-сервера, она загружает внешнюю обработку в память. Для того чтобы отладчик сработал, конфигуратор должен сопоставить исполняемый в памяти код с конкретным файлом .epf, открытым в редакторе. Если обработка загружается программно (например, из двоичных данных), у нее может отсутствовать жестко заданный путь к файлу на диске. В этом случае отладчик просто «не узнает» обработку.

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

  1. Найти физический файл обработки в папке временных файлов профиля пользователя, под которым запущено COM-соединение.
  2. Открыть этот конкретный файл через Файл — Открыть в конфигураторе.
  3. Установить точки останова именно в этом открытом экземпляре файла.

Косвенная отладка через глобальные модули

Если прямое сопоставление файлов не помогает, применим более надежный метод перехвата управления. Суть метода заключается в том, что модули конфигурации (особенно глобальные) всегда сопоставлены с метаданными и отладчик в них работает стабильно. Посмотрим на пример реализации такого подхода:

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


// Код внутри внешней обработки
Процедура ВыполнитьДействие()
    // Вызываем пустую процедуру общего модуля для перехвата отладчика
    ОбщийМодульОтладка.ТочкаВхода(); 
    
    // Далее идет наш сложный код, который нужно проверить
    Данные = ПолучитьРезультатЗапроса();
    ...
КонецПроцедуры

В конфигурации создадим (или используем существующий) ОбщийМодульОтладка и установим точку останова внутри процедуры ТочкаВхода. Когда COM-соединение дойдет до этой строки, отладчик гарантированно остановится. После этого мы сможем войти «внутрь» (клавиша F11) или просто увидеть стек вызовов, из которого можно будет перейти в модуль внешней обработки.

Принудительная остановка через программный код

Выясним причину, если стандартные методы не дают результата. Иногда отладочные сообщения не доходят из-за особенностей сетевого окружения. В таких случаях можно использовать «агрессивные» методы остановки:

  1. Вызов исключения: Использование конструкции ВызватьИсключение. В настройках отладки конфигуратора (Сервис — Параметры — Отладка) установите флаг «Останавливаться по ошибке». Как только код дойдет до этой строки, выполнение прервется, и вы сможете проанализировать состояние переменных.
  2. Бесконечный цикл: Создадим искусственную паузу, чтобы успеть подключиться к сеансу.
    
    Пока ФайлНаДискеСуществует("C:\stop.txt") Цикл
        // Ждем, пока программист удалит файл, чтобы продолжить
    КонецЦикла;
    
    Это позволит «заморозить» выполнение серверного кода, спокойно найти нужный предмет отладки в списке и подключиться к нему.

Техническая настройка сервера 1С

Важно помнить, что никакие манипуляции с кодом не помогут, если сервер 1С:Предприятие не подготовлен к отладке. Проанализируем ситуацию с настройками службы сервера. Для клиент-серверного варианта (как в случае с УТ 11.2) служба 1C:Enterprise 8.3 Server Agent должна быть запущена с параметром -debug.

Проверить это можно в реестре Windows по пути: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3 Server Agent. В значении параметра ImagePath должна присутствовать строка вида:

"C:\Program Files\1cv8\8.3.12.xxxx\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo" -debug

Без этого параметра серверные вызовы, в том числе инициированные через COM, не будут доступны для отладки.

Переход на протокол HTTP

Начиная с версии 8.3.7, платформа поддерживает отладку по протоколу HTTP. Рассмотрим подробнее: этот режим часто работает стабильнее в сложных конфигурациях сети, где TCP-порты могут блокироваться фаерволами или антивирусами. Чтобы включить его, необходимо:

  1. Запустить сервер с параметром -http.
  2. В настройках конфигуратора (Параметры — Отладка) выбрать «Использовать протокол HTTP».
  3. Указать адрес сервера отладки (обычно это локальный компьютер или сервер 1С).

Именно в режиме HTTP отладчик лучше справляется с автоматическим подключением к новым COM-сессиям и фоновым заданиям.

Настройка COM+ и прав доступа

Если соединение устанавливается через компоненту V83.COMConnector, работающую в составе приложения COM+ (библиотека в Component Services), необходимо проверить настройки безопасности Windows. Пользователь, от имени которого запущен этот компонент, должен иметь права на отладку на сервере 1С. Также в свойствах приложения COM+ на вкладке «Параметры» рекомендуется проверить, не ограничено ли время жизни процесса, иначе сессия может завершиться раньше, чем вы успеете проанализировать код.

Подведем итог: для успешной отладки внешней обработки через COM-соединение необходимо обеспечить три условия: запуск сервера в режиме -debug, правильное сопоставление исходного файла (через открытие .epf по пути запуска) и, при необходимости, использование «якоря» в виде общего модуля для гарантированного перехвата управления отладчиком.

← На главную