Почему обработчик 'После загрузки' в Правилах Обмена не отрабатывает при синхронизации данных в 1С?

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

При работе с обменом данными в системе 1С, особенно между различными конфигурациями, мы часто сталкиваемся с необходимостью выполнения дополнительной логики после загрузки объектов. Для этого предназначены обработчики событий, такие как ПослеЗагрузки в Правилах конвертации объектов (ПКО). Однако, иногда мы обнаруживаем, что этот обработчик не срабатывает, что приводит к некорректному заполнению данных или нарушению бизнес-логики. Давайте рассмотрим подробнее причины такого поведения и способы его устранения.

Первоначально, мы сталкиваемся со следующей ситуацией: в нашей организации настроен обмен данными между конфигурациями Управление Автотранспортом (УАТ) и Бухгалтерия Предприятия КОРП. В рамках этого обмена передаются документы (например, Путевой лист превращается в Требование-накладную, а Заправка – в Перемещение товаров). Проблема заключается в том, что обработчик ПослеЗагрузки в ПКО не выполняется. Интересно, что если мы снимем флаг "Не замещать существующие объекты в приемнике при загрузке, а только создавать новые и заполнять их", обработчик начинает срабатывать. Однако наша задача — обеспечить выполнение обработчика при включенной настройке создания только новых объектов (или корректного поведения для найденных).

Разберем, как работает обработчик "После загрузки" при различных настройках

Прежде всего, давайте проясним стандартное поведение обработчика ПослеЗагрузки в Правилах Конвертации Объектов (ПКО) в зависимости от настройки "Не замещать существующие объекты в приемнике при загрузке, а только создавать новые и заполнять их". Эта настройка существенно влияет на процесс загрузки и, как следствие, на вызов соответствующих обработчиков.

  1. Если настройка "Не замещать существующие объекты в приемнике при загрузке, а только создавать новые и заполнять их" отключена (снят флаг):

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

  2. Если настройка "Не замещать существующие объекты в приемнике при загрузке, а только создавать новые и заполнять их" включена (установлен флаг):

    Здесь ситуация меняется. При установленном флаге система ведет себя следующим образом:

    • Для вновь создаваемых объектов: Если в базе-приемнике не найден объект, соответствующий полям поиска, система создает новый объект. В этом случае, поскольку происходит полноценное создание и "загрузка" нового объекта, обработчик ПослеЗагрузки будет вызван. Это ожидаемое и логичное поведение.
    • Для существующих объектов, найденных по полям поиска: Если объект с соответствующими полями поиска уже существует в базе-приемнике, и флаг "Не замещать существующие объекты" установлен, система его не перезаписывает. То есть, свойства найденного объекта остаются неизменными, данные из файла обмена не применяются к нему. Поскольку объект не "загружается" (в смысле обновления его свойств из обмена), обработчик ПослеЗагрузки не вызывается для таких объектов. Это также логично, ведь если объект не меняется, нет необходимости выполнять постобработку.

Таким образом, если обработчик не срабатывает именно для уже существующих объектов, когда флаг "Не замещать существующие объекты" установлен, то это является стандартным поведением системы, а не ошибкой. Однако, если обработчик не срабатывает вообще, даже для новых объектов при включенном флаге, или при использовании синхронизации данных, то причина кроется в другом.

Основная причина: Различия в механизмах обмена данными и расположении правил конвертации

Как мы уже выяснили, если обработчик ПослеЗагрузки не срабатывает даже для новых объектов при включенной настройке "Не замещать существующие объекты", или если он ведет себя по-разному при использовании разных механизмов обмена, то проблема скорее всего связана с тем, как система "находит" и "использует" сами правила конвертации объектов и их обработчики.

Мы наблюдаем критически важное различие между двумя основными способами обмена данными в 1С:

  1. Использование обработки "Универсальный обмен данными XML":

    Когда мы используем обработку УниверсальныйОбменДаннымиXML (часто для ручного обмена файлами или для тестирования), правила конвертации (вместе со всеми обработчиками) обычно считываются непосредственно из указанного файла правил или из самого файла обмена. В этом сценарии система имеет прямой доступ к коду обработчиков, и они выполняются как положено. Именно поэтому многие пользователи отмечают, что при таком способе обмена обработчики работают корректно.

  2. Использование механизма синхронизации данных (через планы обмена, БСП):

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

    Ключевым моментом здесь является файл CorrespondentExchangeRules.XML. Именно в этом файле, который должен быть размещен в конфигурации базы-приемника (или быть доступным через механизмы БСП), система ожидает найти правила и обработчики для выполнения при синхронизации через план обмена. Если этот файл отсутствует или не содержит актуальных правил, обработчики не будут вызываться, даже если они присутствуют в исходных правилах, использованных для формирования выгрузки.

Это объясняет, почему обработчики срабатывают при файловом обмене через УниверсальныйОбменДаннымиXML, но не работают при синхронизации данных через планы обмена. Система просто не "видит" код обработчиков в нужном ей месте при автоматической синхронизации.

Как обеспечить срабатывание обработчика "После загрузки" при синхронизации данных

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

  1. Проверить механизм обмена:

    Убедитесь, что вы действительно используете синхронизацию данных через планы обмена, а не ручной файловый обмен с помощью УниверсальныйОбменДаннымиXML. Этот шаг критически важен, так как от него зависит дальнейшая стратегия решения проблемы.

  2. Обеспечить наличие правил в базе-приемнике:

    Главное решение заключается в том, чтобы актуальные правила конвертации, содержащие код обработчика ПослеЗагрузки, были доступны в конфигурации базы-приемника. В контексте синхронизации данных через планы обмена это часто означает, что правила должны быть загружены в специальный ресурс или файл внутри самой конфигурации приемника. Конкретно, речь идет о файле CorrespondentExchangeRules.XML.

    Мы должны выложить правила в CorrespondentExchangeRules.XML. Это действие обычно выполняется через функционал конфигурации-приемника, который позволяет загружать или обновлять правила обмена. Например, в конфигурациях на базе БСП (Библиотека стандартных подсистем) для этого могут существовать специальные обработки или настройки в помощнике синхронизации данных. Необходимо убедиться, что эти правила конвертации содержат ваш код обработчика ПослеЗагрузки и были успешно загружены в приемник.

  3. Проверить актуальность правил:

    После загрузки правил в CorrespondentExchangeRules.XML, убедитесь, что это действительно самые свежие и правильные правила, которые вы ожидаете. Возможно, при обновлении конфигурации или правил обмена старые правила не были обновлены в файле CorrespondentExchangeRules.XML.

  4. Тестирование после изменений:

    После выполнения шагов 2 и 3, мы должны запустить синхронизацию данных и проверить, срабатывает ли теперь обработчик ПослеЗагрузки как для новых, так и для существующих объектов (с учетом поведения флага "Не замещать существующие объекты", как описано выше).

Дополнительные аспекты и отладка

При работе с обработчиками событий в обмене данными, полезно учитывать некоторые дополнительные нюансы:

  1. Порядок вызова обработчиков:

    Мы должны помнить, что существуют различные уровни обработчиков. Например, глобальный обработчик "После загрузки объекта" в правилах конвертации данных (общий для всей конвертации) выполняется перед вызовом обработчика "После загрузки" в конкретном ПКО. Это знание помогает нам понять последовательность выполнения кода.

  2. Имя процедуры обработчика:

    Убедитесь, что имя процедуры вашего обработчика в ПКО точно соответствует ожидаемому названию (например, ПослеЗагрузки). Любая опечатка приведет к тому, что обработчик не будет найден и вызван.

  3. Отладка обработчиков:

    Для отладки кода обработчиков и алгоритмов мы можем использовать обработку "Универсальный обмен данными XML". Она позволяет сформировать модуль отладки с кодом всех обработчиков, что значительно упрощает поиск ошибок. Однако, отладка глобального обработчика ПослеЗагрузкиПравилОбмена обычно не поддерживается напрямую.

  4. Режим совместимости правил:

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

  5. Флаг "Отказ":

    В ранних версиях Конвертации данных были известные проблемы, когда флаг Отказ в обработчике ПКО ПослеЗагрузки мог не отрабатывать должным образом. Мы должны учитывать это при работе со старыми версиями или при анализе их поведения.

Подведем итог: если обработчик ПослеЗагрузки не срабатывает при синхронизации данных через планы обмена, наиболее вероятной причиной является отсутствие актуальных правил конвертации (включая код обработчиков) в файле CorrespondentExchangeRules.XML в базе-приемнике. Если же проблема заключается в несрабатывании обработчика для существующих объектов при включенной настройке "Не замещать существующие объекты", то это является ожидаемым поведением системы.

Мы надеемся, что это подробное объяснение поможет вам эффективно настраивать обмен данными и обеспечивать корректную работу всех необходимых обработчиков в вашей системе 1С.

← На главную