При переходе с Конвертации данных 2.0 на версию 3.0 многие разработчики сталкиваются с тем, что привычные механизмы отладки и вызова обработчиков работают иначе. Одной из распространенных проблем является ситуация, когда процедура, написанная в Правилах обработки данных (ПОД) на вкладке «При обработке», просто не вызывается механизмом обмена, и точка останова в конфигураторе игнорируется. Разберем по шагам, почему это происходит и как обеспечить корректную работу вашего кода. Для быстрого погружения в новую концепцию можно изучить обзорную статью по Конвертации данных 3.0 и технологии EnterpriseData.
В отличие от КД 2.0, где код обработчиков часто помещался непосредственно в XML-файл правил, в Конвертации данных 3.0 весь код исполняется внутри Модуля менеджера обмена. Когда мы выгружаем правила из конфигурации «Конвертация данных 3.0», система генерирует программный код на языке 1С, который затем нужно вставить в соответствующий модуль вашей информационной базы.
Проанализируем структуру типичного правила обработки данных (ПОД), созданного в КД 3.0:
Процедура ДобавитьПОД_Документ_СчетНаОплатуПокупателю_Отправка(ПравилаОбработкиДанных)
ПравилоОбработки = ПравилаОбработкиДанных.Добавить();
ПравилоОбработки.Имя = "Документ_СчетНаОплатуПокупателю_Отправка";
ПравилоОбработки.ОбъектВыборкиМетаданные = Метаданные.Документы.CRM_СчетНаОплатуПокупателю;
// Указание имени процедуры-обработчика
ПравилоОбработки.ПриОбработке = "ПОД_Документ_СчетНаОплатуПокупателю_Отправка_ПриОбработке";
ПравилоОбработки.ОчисткаДанных = Ложь;
ПравилоОбработки.ИспользуемыеПКО.Добавить("Документ_СчетНаОплатуПокупателю_Отправка");
КонецПроцедуры
Здесь важно понимать: строка ПравилоОбработки.ПриОбработке = "ИмяПроцедуры" — это всего лишь текстовое название. Само по себе наличие этой строки и наличие одноименной процедуры в модуле менеджера не гарантирует вызов. Выясним причину, заглянув глубже в механизм обмена.
Для того чтобы движок обмена (библиотека стандартных подсистем) мог вызвать вашу процедуру по ее текстовому имени, в модуле менеджера существует специальная «диспетчерская» функция — ВыполнитьПроцедуруМодуляМенеджера(). Именно она является входной точкой для всех событий правил.
Рассмотрим, как должен выглядеть фрагмент кода, чтобы ваша процедура ПОД_Документ_СчетНаОплатуПокупателю_Отправка_ПриОбработке заработала. Вам необходимо найти в модуле менеджера обмена указанную выше процедуру и убедиться, что в ней есть условие для вашего обработчика:
Процедура ВыполнитьПроцедуруМодуляМенеджера(ИмяПроцедуры, Параметры) Экспорт
// ... существующий код диспетчера ...
Если ИмяПроцедуры = "ПОД_Документ_СчетНаОплатуПокупателю_Отправка_ПриОбработке" Тогда
ПОД_Документ_СчетНаОплатуПокупателю_Отправка_ПриОбработке(
Параметры.ДанныеИБ,
Параметры.ИспользованиеПКО,
Параметры.КомпонентыОбмена
);
КонецЕсли;
КонецПроцедуры
Важный момент: Если вы редактируете модуль менеджера вручную или переносите код из КД 3.0 фрагментами, вы могли пропустить этот блок. Без регистрации в ВыполнитьПроцедуруМодуляМенеджера система просто не найдет вашу процедуру, даже если она объявлена как Экспорт.
Если код на месте, диспетчер настроен, но отладчик всё равно не «заходит» в процедуру, проанализируем технические аспекты процесса отладки:
-debug.Выполнить(). В этом случае прямая точка останова внутри процедуры может игнорироваться. Попробуйте использовать пошаговую отладку (клавиша F11) с того момента, где начинается цикл обхода объектов для выгрузки.Рассмотрим еще одну частую причину: обработчик ПриОбработке в ПОД срабатывает только тогда, когда объект выбран для выгрузки. В технологии EnterpriseData (на которой базируется КД 3.0) выгрузка обычно инициируется наличием записи в Плане обмена.
Проанализируем ситуацию: если документ «Счет на оплату» не зарегистрирован на узле обмена, система вообще не дойдет до выполнения правил для этого конкретного документа. Чтобы проверить это, выполните следующие действия:
Посмотрим на сигнатуру самой процедуры. В КД 3.0 состав параметров строго регламентирован. Убедитесь, что ваша процедура выглядит именно так:
Процедура ПОД_Документ_СчетНаОплатуПокупателю_Отправка_ПриОбработке(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена) Экспорт
// Здесь ваша логика отбора или модификации
// Например, если мы хотим отменить выгрузку по условию:
Если ДанныеИБ.СуммаДокумента < 100 Тогда
ИспользованиеПКО = Ложь;
КонецЕсли;
КонецПроцедуры
Обратите внимание на параметр ИспользованиеПКО. Это ключевой флаг. Если в каком-то другом (предшествующем) обработчике ему уже было присвоено значение Ложь, выгрузка объекта прекратится, и ваш код может быть пропущен.
Чтобы избежать ошибок с «забытыми» процедурами в диспетчере, рекомендуется использовать стандартный механизм обновления модуля менеджера:
ВыполнитьПроцедуруМодуляМенеджера.Подведем итог: если процедура в КД 3.0 не вызывается, проверьте в первую очередь регистрацию объекта в плане обмена, затем наличие вызова в диспетчерской процедуре модуля менеджера и, наконец, настройки отладки фоновых заданий на сервере. Для оперативной проверки и изменения состава выгружаемых данных можно использовать расширение для регистрации или удаления объектов из плана обмена напрямую с формы.