Почему не срабатывает обработчик При обработке в ПОД Конвертации данных 3.0 и как это исправить

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

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

Анализ механизма вызова обработчиков в КД 3.0

В отличие от КД 2.0, где код обработчиков часто помещался непосредственно в XML-файл правил, в Конвертации данных 3.0 весь код исполняется внутри Модуля менеджера обмена. Когда мы выгружаем правила из конфигурации «Конвертация данных 3.0», система генерирует программный код на языке 1С, который затем нужно вставить в соответствующий модуль вашей информационной базы.

Проанализируем структуру типичного правила обработки данных (ПОД), созданного в КД 3.0:


Процедура ДобавитьПОД_Документ_СчетНаОплатуПокупателю_Отправка(ПравилаОбработкиДанных)
    ПравилоОбработки = ПравилаОбработкиДанных.Добавить();
    ПравилоОбработки.Имя = "Документ_СчетНаОплатуПокупателю_Отправка";
    ПравилоОбработки.ОбъектВыборкиМетаданные = Метаданные.Документы.CRM_СчетНаОплатуПокупателю;
    // Указание имени процедуры-обработчика
    ПравилоОбработки.ПриОбработке = "ПОД_Документ_СчетНаОплатуПокупателю_Отправка_ПриОбработке"; 
    ПравилоОбработки.ОчисткаДанных = Ложь;
    ПравилоОбработки.ИспользуемыеПКО.Добавить("Документ_СчетНаОплатуПокупателю_Отправка");
КонецПроцедуры

Здесь важно понимать: строка ПравилоОбработки.ПриОбработке = "ИмяПроцедуры" — это всего лишь текстовое название. Само по себе наличие этой строки и наличие одноименной процедуры в модуле менеджера не гарантирует вызов. Выясним причину, заглянув глубже в механизм обмена.

Диспетчерская процедура: связующее звено

Для того чтобы движок обмена (библиотека стандартных подсистем) мог вызвать вашу процедуру по ее текстовому имени, в модуле менеджера существует специальная «диспетчерская» функция — ВыполнитьПроцедуруМодуляМенеджера(). Именно она является входной точкой для всех событий правил.

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


Процедура ВыполнитьПроцедуруМодуляМенеджера(ИмяПроцедуры, Параметры) Экспорт
    
    // ... существующий код диспетчера ...

    Если ИмяПроцедуры = "ПОД_Документ_СчетНаОплатуПокупателю_Отправка_ПриОбработке" Тогда 
        ПОД_Документ_СчетНаОплатуПокупателю_Отправка_ПриОбработке(
            Параметры.ДанныеИБ, 
            Параметры.ИспользованиеПКО, 
            Параметры.КомпонентыОбмена
        );
    КонецЕсли;

КонецПроцедуры

Важный момент: Если вы редактируете модуль менеджера вручную или переносите код из КД 3.0 фрагментами, вы могли пропустить этот блок. Без регистрации в ВыполнитьПроцедуруМодуляМенеджера система просто не найдет вашу процедуру, даже если она объявлена как Экспорт.

Особенности отладки в КД 3.0

Если код на месте, диспетчер настроен, но отладчик всё равно не «заходит» в процедуру, проанализируем технические аспекты процесса отладки:

  1. Фоновые задания. Обмен данными в современных конфигурациях почти всегда выполняется в фоновом задании. Обычная точка останова не сработает, если в настройках конфигуратора (Сервис -> Параметры -> Отладка) не включена «Автоматическая установка отладки в фоновых заданиях».
  2. Серверная отладка. Поскольку код обмена выполняется на стороне сервера, убедитесь, что сервер 1С:Предприятия запущен с ключом -debug.
  3. Метод Выполнить(). Иногда вызовы в недрах БСП происходят через оператор Выполнить(). В этом случае прямая точка останова внутри процедуры может игнорироваться. Попробуйте использовать пошаговую отладку (клавиша F11) с того момента, где начинается цикл обхода объектов для выгрузки.

Проверка регистрации изменений

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

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

Использование параметров в обработчике

Посмотрим на сигнатуру самой процедуры. В КД 3.0 состав параметров строго регламентирован. Убедитесь, что ваша процедура выглядит именно так:


Процедура ПОД_Документ_СчетНаОплатуПокупателю_Отправка_ПриОбработке(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена) Экспорт
    // Здесь ваша логика отбора или модификации
    // Например, если мы хотим отменить выгрузку по условию:
    Если ДанныеИБ.СуммаДокумента < 100 Тогда
        ИспользованиеПКО = Ложь;
    КонецЕсли;
КонецПроцедуры

Обратите внимание на параметр ИспользованиеПКО. Это ключевой флаг. Если в каком-то другом (предшествующем) обработчике ему уже было присвоено значение Ложь, выгрузка объекта прекратится, и ваш код может быть пропущен.

Рекомендации по обновлению правил

Чтобы избежать ошибок с «забытыми» процедурами в диспетчере, рекомендуется использовать стандартный механизм обновления модуля менеджера:

  1. В конфигурации «Конвертация данных 3.0» используйте кнопку «Выгрузить модуль».
  2. Полученный текст модуля полностью копируйте в вашу рабочую базу (заменяя старое содержимое).
  3. Это гарантирует, что все связи между строковыми именами событий и реальными процедурами будут обновлены автоматически, включая и процедуру ВыполнитьПроцедуруМодуляМенеджера.

Подведем итог: если процедура в КД 3.0 не вызывается, проверьте в первую очередь регистрацию объекта в плане обмена, затем наличие вызова в диспетчерской процедуре модуля менеджера и, наконец, настройки отладки фоновых заданий на сервере. Для оперативной проверки и изменения состава выгружаемых данных можно использовать расширение для регистрации или удаления объектов из плана обмена напрямую с формы.

← На главную