Как отлаживать правила обмена в универсальном формате (КД 3.0) в 1С?

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

При разработке и сопровождении интеграций на базе технологии Конвертация данных 3.0 (EnterpriseData) разработчики часто сталкиваются с необходимостью пошаговой отладки обработчиков правил конвертации объектов (ПКО) и правил обработки данных (ПОД). Ранее классический сценарий отладки заключался в подключении внешней обработки с модулем менеджера обмена напрямую к узлу плана обмена. Однако в современных версиях Библиотеки стандартных подсистем (БСП) и типовых конфигурациях (1С:ERP, 1С:Комплексная автоматизация, 1С:Управление торговлей, 1С:Бухгалтерия предприятия) этот механизм изменился: обработка помещается во временное хранилище, а обмен выполняется в фоновом задании на стороне сервера. В результате точки останова в исходном файле внешней обработки перестают срабатывать.

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

Выясним причину: почему не срабатывают точки останова

Проанализируем механизм, который платформа и БСП используют при запуске синхронизации:

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

Способ 1. Создание внешней обработки менеджера обмена и прямая загрузка

Рассмотрим, как подготовить внешнюю обработку для отладки логики обмена:

  1. В Конфигураторе выберем пункт меню Файл → Новый → Внешняя обработка.
  2. Откроем модуль объекта созданной обработки и скопируем в него исходный код: либо сгенерированный модуль из конфигурации Конвертация данных 3.0, либо текст типового общего модуля МенеджерОбменаЧерезУниверсальныйФормат (или МенеджерОбменаЧерезУниверсальныйФормат13 в зависимости от версии).
  3. Сохраним файл обработки на диске. Важно: при клиент-серверной архитектуре файл должен располагаться по сетевому пути (UNC-путь), к которому имеет права доступа учетная запись службы сервера 1С (обычно usr1cv8).
  4. В режиме 1С:Предприятие откроем настройки синхронизации данных, перейдем в форму узла обмена, через меню Ещё → Изменить форму включим скрытую страницу Служебная информация и укажем путь к файлу в поле Путь к менеджеру обмена.

Чтобы платформа не копировала обработку во временное хранилище и исполняла код напрямую из файла, скорректируем код получения менеджера обмена в модуле плана обмена СинхронизацияДанныхЧерезУниверсальныйФормат (или переопределим его через расширение):


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

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

Способ 2. Отладка с использованием расширения конфигурации (без снятия с поддержки)

Наиболее современным и надежным методом является перенос отлаживаемых алгоритмов в расширение конфигурации. Это позволяет избежать проблем с путями к файлам и правами службы сервера.

Разберем по шагам, как настроить отладку через расширение:

  1. Создадим новое расширение конфигурации и снимем в его свойствах флаги Безопасный режим и Защита от опасных действий.
  2. Добавим в расширение общий модуль МенеджерОбменаЧерезУниверсальныйФормат (или модуль ОбменДаннымиXDTOСервер).
  3. В модуле расширения с помощью аннотаций &Вместо или &ИзменениеИКонтроль переопределим интересующие обработчики правил конвертации (например, ПКО_Документ_РеализацияТоваровУслуг_ПриОтправкеДанных или процедуры отложенного заполнения).
  4. Установим точки останова прямо в модуле расширения внутри Конфигуратора. Так как расширение скомпилировано в составе метаданных текущей базы, платформа гарантированно остановится на нужной строке кода.

Если требуется принудительно перенаправить выбор менеджера обмена на внешнюю обработку для конкретного узла, переопределим функцию ВерсииФорматаОбмена в общем модуле ОбменДаннымиXDTOСервер через аннотацию &Вместо:


&Вместо("ВерсииФорматаОбмена")
Функция Расш_ВерсииФорматаОбмена(УзелИнформационнойБазы)
    // Подменяем получение встроенного общего модуля на создание объекта внешней обработки,
    // путь к которой прочитан из реквизитов узла плана обмена
    Результат = ПродолжитьВызов(УзелИнформационнойБазы);
    
    ПутьКОбработке = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УзелИнформационнойБазы, "ПутьКМенеджеруОбмена");
    Если ЗначениеЗаполнено(ПутьКОбработке) Тогда
        // Возвращаем менеджер обмена из внешней обработки
        Менеджер = ВнешниеОбработки.Создать(ПутьКОбработке, Ложь);
        Возврат Менеджер;
    КонецЕсли;
    
    Возврат Результат;
КонецФункции

Способ 3. Настройка отладки фоновых заданий на сервере

Для корректного перехвата точек останова при серверном обмене выполним обязательную настройку среды:

  1. Убедимся, что служба сервера «1С:Предприятия» запущена в режиме отладки с ключом -debug (при отладке по TCP) или с активным протоколом HTTP-отладки.
  2. В Конфигураторе откроем главное меню Отладка → Подключение..., нажмем кнопку Настройка автоматического подключения и обязательно установим флаг Фоновые задания.
  3. Запустим сеанс «1С:Предприятия» и выполним операцию обмена. Отладчик автоматически подключится к созданному серверному потоку и приостановит выполнение на установленных контрольных точках.

Важная особенность: инициализация версий формата

При отладке обмена между базами с разными версиями формата EnterpriseData (например, источник поддерживает формат 1.0 и 1.2, а приемник — 1.0, 1.2 и 1.3) возможна ситуация, когда при первом сеансе обработчики выборки берутся из внешней обработки, а сопоставление и загрузка — из встроенного модуля конфигурации.

Чтобы избежать расхождения модулей, выполним следующий порядок действий:

  1. Перед началом тестирования снимем с регистрации все изменения объектов на узле обмена.
  2. Выполним один-два пустых цикла синхронизации, чтобы базы обменялись служебными заголовками и зафиксировали единую максимальную версию формата.
  3. После согласования версий зарегистрируем тестовые объекты и приступим к пошаговой отладке.
← На главную