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