Best Practices
Разработка обработчиков
Всегда устанавливайте флаг «ДатаХабНеобрабатывать» во входящем обработчике перед записью объекта. Без этого флага подписка зарегистрирует объект как исходящее событие и отправит его обратно на шину, что приведёт к бесконечному циклу обмена.
Используйте транзакцию в входящем обработчике. Оберните весь код применения изменений в НачатьТранзакцию() / ЗафиксироватьТранзакцию() с откатом при исключении. Входящие обработчики должны быть идемпотентными: повторная обработка одного сообщения не должна изменять состояние системы сверх первого применения.
Не игнорируйте поля, которых нет в сообщении. Проверяйте наличие свойства через ОбъектОбработки.Свойство("ИмяПоля") перед обращением. Отсутствие поля — не ошибка, а часть контракта.
Проверяйте заполненность обязательных полей. Вызов ПроверитьЗаполнение() перед записью объекта позволяет получить понятное сообщение об ошибке вместо исключения от платформы.
Для исходящего обработчика читайте данные через запрос, а не через свойства объекта. Это исключает проблемы с незагруженными реквизитами и обеспечивает предсказуемый результат.
Идентификация объектов
Не ведите ручные таблицы соответствий. Для поиска и создания объектов используйте ДатаХабИнтеграция.НайтиСоздатьСправочникОбъект(). Модуль самостоятельно ведёт таблицу идентификаторов и обогащает её при каждом успешном обмене.
Обрабатывайте неоднозначность. Если НайтиСоздатьСправочникОбъект() не может однозначно определить объект, он выбрасывает исключение. Не подавляйте эти исключения — они сигнализируют о дублировании данных в одной из систем.
Отложенная обработка
Явно задавайте задержку при ожидании зависимости. Если зависимый объект ещё не пришёл, задайте ЗадержкаОбработкиСообщенияПриОшибке перед вызовом исключения. Без этого используется стандартная задержка (30 секунд), которая может не соответствовать ожидаемому времени прихода зависимости.
Не устанавливайте Отказ = Истина вместо отложенной обработки. Отказ удаляет запись из очереди безвозвратно. Для повторной попытки нужно исключение — тогда модуль увеличит счётчик и повторит попытку.
Отправка
Устанавливайте Отказ = Истина для объектов, которые не нужно отправлять. Типичный случай — помеченные на удаление объекты, черновики, внутренние записи. Это безопаснее, чем фильтрация на уровне подписки.
Один класс сообщения — один обработчик. Не создавайте несколько исходящих обработчиков для одного типа объекта с разными классами сообщений в расчёте на разных получателей — маршрутизация по получателям настраивается на уровне маршрутов DataHUB, а не на уровне обработчиков.
Версионирование обработчиков
Поле Версия в описании обработчика инкрементируется при каждом изменении. Это позволяет модулю обнаруживать изменения и обновлять справочник «Объекты интеграции» при следующем запуске. Не пропускайте обновление версии при изменении логики обработчика.