Почему в КД2 не работает Отказ = Истина в обработчике «После загрузки» и как вывести сообщение?

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

При разработке и доработке правил обмена в конфигурации «1С:Конвертация данных 2.1» (КД2) разработчики часто сталкиваются с ситуацией: в обработчике правила конвертации объекта (ПКО) «После загрузки» прописывается условие с установкой Отказ = Истина, однако объект всё равно оказывается записан в информационной базе приемника. Параллельно с этим возникает вопрос, как правильно информировать пользователя или администратора о возникшей ошибке, не нарушая работу регламентных заданий.

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

Причины, по которым объект записывается при установке отказа в «После загрузки»

Проанализируем механику работы обработчиков КД2 в базе-приемнике. Обработчик «После загрузки» вызывается уже после того, как объект был прочитан, сопоставлен, заполнен и записан в базу данных (если не было отменено стандартное поведение). Установка флага Отказ = Истина в этой точке часто не дает ожидаемого эффекта по следующим причинам:

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

Где правильно выполнять проверку и прерывать операцию

Рассмотрим, в каких событиях конвертации данных правильнее всего размещать логику фильтрации и отказа:

  1. На стороне источника — обработчик «Перед выгрузкой» (ПКО или ПВД):
    Это наиболее оптимальный и правильный подход. Если объект не должен попадать в приемник на основании условий, известных в источнике, его выгрузку нужно отменять до формирования пакета данных. Это снижает объем передаваемых сообщений и предотвращает появление пустых ссылок в базе-приемнике.
    
    // Обработчик "Перед выгрузкой" в ПКО или ПВД
    Если Источник.ПометкаУдаления Или Не Источник.Проведен Тогда
        Отказ = Истина;
    КонецЕсли;
    
  2. На стороне приемника — обработчик «При загрузке»:
    Срабатывает сразу после поиска объекта в базе-приемнике, но до чтения свойств из XML-файла. Здесь доступен найденный Объект (если он существует). Если необходимо заблокировать перезапись существующего документа, отказ ставится именно здесь:
    
    // Обработчик "При загрузке" в ПКО
    Если Объект.Проведен Тогда
        // Запрещаем перезапись уже проведенного документа
        Отказ = Истина;
    КонецЕсли;
    
  3. Использование флага запрета замещения:
    Если цель проверки — не отменить всю операцию, а лишь защитить существующий в приемнике документ от изменений, в обработчиках загрузки можно взвести специальный флаг: НеЗамещатьОбъект = Истина;

Ошибки при выводе предупреждений в процессе обмена

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

Правильные способы фиксации сообщений и ошибок

Разберем три корректных способа информирования об ошибках и предупреждениях при выполнении обмена:

  1. Использование метода Сообщить():
    Подходит для простых сценариев и ручного запуска обмена через универсальную обработку. При интерактивном выполнении сообщение отобразится в окне сообщений:
    
    Сообщить("Документ " + Строка(Объект) + " пропущен: не соответствует условиям загрузки.");
    
  2. Использование объекта СообщениеПользователю:
    Стандартный механизм платформы для управляемого интерфейса, позволяющий выводить немодальные уведомления:
    
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Пропущен документ: " + Строка(Объект);
    Сообщение.Сообщить();
    
  3. Запись в журнал регистрации (рекомендуемый способ):
    Универсальное решение, которое гарантированно сохранит информацию как при интерактивном обмене, так и при автоматическом выполнении обмена регламентным заданием:
    
    ЗаписьЖурналаРегистрации(
        "Обмен данными",
        УровеньЖурналаРегистрации.Предупреждение,
        ,
        Объект.Ссылка,
        "Загрузка объекта отменена по условию правила конвертации."
    );
    
  4. Вызов специализированных процедур подсистемы обмена:
    В типовых конфигурациях на базе БСП для протоколирования обмена предусмотрены специальные функции общих модулей (или встроенные методы обработки обмена). Они не только выводят текст пользователю, но и записывают событие в протокол обмена данными для последующего анализа администратором.

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

← На главную