Входящие обработчики
Входящий обработчик — процедура на языке 1С, которая применяет данные из входящего сообщения к объектам 1С. Вызывается при обработке входящей очереди.
Регистрация обработчика
Регистрация выполняется в процедуре ПриПолученииПоставляемыхОбъектовИнтеграции модуля ДатаХабПоставляемыеОбъектыИнтеграцииПереопределяемый:
| Поле | Значение |
|---|---|
ИмяКлассаОбъекта |
ClassId сообщения (напр. Catalog_ПричиныДефектов) |
ИмяОбъекта |
Полное имя метаданного 1С (напр. Справочник.ПричиныДефектов) |
ТипИнтеграции |
Перечисления.ДатаХабТипыИнтеграции.Входящая |
Статус |
Перечисления.ДатаХабСтатусыОбработчиков.Включен |
ИмяПроцедурыОбработкиВКонфигурации |
Имя процедуры в том же общем модуле |
Сигнатура процедуры
Процедура ИмяОбработчика(
ПроцедураОбработки,
ОбъектОбработки,
Отказ,
ОбъектСообщение,
Обработчик,
Результат,
ЗадержкаОбработкиСообщенияПриОшибке) Экспорт
| Параметр | Направление | Описание |
|---|---|---|
ОбъектОбработки |
Вход | Десериализованная структура из поля Body конверта |
Отказ |
Выход | Истина — прервать обработку |
ОбъектСообщение |
Вход | Полный JSON-конверт как структура 1С |
Обработчик |
Вход | Описание обработчика (ИмяКлассаОбъекта, ИмяОбъекта и др.) |
Результат |
Выход | Ссылка на созданный/обновлённый 1С-объект |
ЗадержкаОбработкиСообщенияПриОшибке |
Выход | Переопределить задержку до следующей попытки (секунды) |
Типовая реализация
Процедура Catalog_ПричиныДефектов_Входящая(
ПроцедураОбработки, ОбъектОбработки, Отказ, ОбъектСообщение,
Обработчик, Результат, ЗадержкаОбработкиСообщенияПриОшибке) Экспорт
ТипПриемника = Обработчик.ИмяКлассаОбъекта; // "Catalog_ПричиныДефектов"
ИмяСправочника = "ПричиныДефектов";
НачатьТранзакцию();
Попытка
// Найти объект по Id-массиву или создать новый
СправочникОбъект = ДатаХабИнтеграция.НайтиСоздатьСправочникОбъект(
ОбъектОбработки.id, ИмяСправочника, ТипПриемника);
// Применить поля из сообщения
Если ОбъектОбработки.Свойство("Дата") Тогда
СправочникОбъект.Дата = ДатаХабИнтеграция.ПолучитьЗначениеПоТипу(
ОбъектОбработки.Дата, "Дата", Истина);
КонецЕсли;
СправочникОбъект.Наименование = ОбъектОбработки.Наименование;
// Запретить повторную регистрацию этой записи как исходящего события
СправочникОбъект.ДополнительныеСвойства.Вставить("ДатаХабНеобрабатывать", Истина);
Если Не СправочникОбъект.ПроверитьЗаполнение() Тогда
ВызватьИсключение "Не заполнены обязательные поля";
КонецЕсли;
СправочникОбъект.Записать();
Результат = СправочникОбъект.Ссылка;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
Ключевые методы ДатаХабИнтеграция
НайтиСоздатьСправочникОбъект(ИдМассив, ИмяСправочника, ТипПриемника) — реализует алгоритм идентификации объектов: ищет по каждому элементу массива id в таблице идентификаторов, при нахождении одного уникального объекта — обогащает таблицу недостающими идентификаторами и возвращает объект. При отсутствии создаёт новый. При неоднозначности — выбрасывает исключение.
ПолучитьЗначениеПоТипу(Значение, Тип, ...) — преобразует значение из JSON-структуры в требуемый 1С-тип (Дата, Число, Булево и др.).
Флаг «ДатаХабНеобрабатывать»
При записи объекта внутри входящего обработчика подписки на события должны пропустить эту запись, иначе объект попадёт в очередь исходящих и будет отправлен обратно на шину. Для подавления исходящего события добавляется флаг в ДополнительныеСвойства объекта:
Подписка на событие проверяет этот флаг и не регистрирует объект в очереди.
Отложенная обработка
Если входящий обработчик обнаруживает, что зависимый объект ещё не поступил из шины (ссылка не разрешилась), он должен инициировать повторную попытку. Для этого — вызвать исключение или явно задать ЗадержкаОбработкиСообщенияПриОшибке. Подробнее — в Общая методология / Отложенная обработка.
Соглашение об именовании
Рекомендуемый формат:
Например: Catalog_Контрагенты_Входящая, Document_РеализацияТоваровУслуг_Входящая.