Перейти к содержанию

Входящие обработчики

Входящий обработчик — процедура на языке 1С, которая применяет данные из входящего сообщения к объектам 1С. Вызывается при обработке входящей очереди.

Регистрация обработчика

Регистрация выполняется в процедуре ПриПолученииПоставляемыхОбъектовИнтеграции модуля ДатаХабПоставляемыеОбъектыИнтеграцииПереопределяемый:

Поле Значение
ИмяКлассаОбъекта ClassId сообщения (напр. Catalog_ПричиныДефектов)
ИмяОбъекта Полное имя метаданного 1С (напр. Справочник.ПричиныДефектов)
ТипИнтеграции Перечисления.ДатаХабТипыИнтеграции.Входящая
Статус Перечисления.ДатаХабСтатусыОбработчиков.Включен
ИмяПроцедурыОбработкиВКонфигурации Имя процедуры в том же общем модуле

Сигнатура процедуры

Процедура ИмяОбработчика(
    ПроцедураОбработки,
    ОбъектОбработки,
    Отказ,
    ОбъектСообщение,
    Обработчик,
    Результат,
    ЗадержкаОбработкиСообщенияПриОшибке) Экспорт
Параметр Направление Описание
ОбъектОбработки Вход Десериализованная структура из поля Body конверта
Отказ Выход Истина — прервать обработку
ОбъектСообщение Вход Полный JSON-конверт как структура 1С
Обработчик Вход Описание обработчика (ИмяКлассаОбъекта, ИмяОбъекта и др.)
Результат Выход Ссылка на созданный/обновлённый 1С-объект
ЗадержкаОбработкиСообщенияПриОшибке Выход Переопределить задержку до следующей попытки (секунды)

Типовая реализация

Процедура Catalog_ПричиныДефектов_Входящая(
    ПроцедураОбработки, ОбъектОбработки, Отказ, ОбъектСообщение,
    Обработчик, Результат, ЗадержкаОбработкиСообщенияПриОшибке) Экспорт

    ТипПриемника  = Обработчик.ИмяКлассаОбъекта;    // "Catalog_ПричиныДефектов"
    ИмяСправочника = "ПричиныДефектов";

    НачатьТранзакцию();
    Попытка

        // Найти объект по Id-массиву или создать новый
        СправочникОбъект = ДатаХабИнтеграция.НайтиСоздатьСправочникОбъект(
            ОбъектОбработки.id, ИмяСправочника, ТипПриемника);

        // Применить поля из сообщения
        Если ОбъектОбработки.Свойство("Дата") Тогда
            СправочникОбъект.Дата = ДатаХабИнтеграция.ПолучитьЗначениеПоТипу(
                ОбъектОбработки.Дата, "Дата", Истина);
        КонецЕсли;
        СправочникОбъект.Наименование = ОбъектОбработки.Наименование;

        // Запретить повторную регистрацию этой записи как исходящего события
        СправочникОбъект.ДополнительныеСвойства.Вставить("ДатаХабНеобрабатывать", Истина);

        Если Не СправочникОбъект.ПроверитьЗаполнение() Тогда
            ВызватьИсключение "Не заполнены обязательные поля";
        КонецЕсли;

        СправочникОбъект.Записать();
        Результат = СправочникОбъект.Ссылка;

        ЗафиксироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
        ВызватьИсключение ОписаниеОшибки();
    КонецПопытки;

КонецПроцедуры

Ключевые методы ДатаХабИнтеграция

НайтиСоздатьСправочникОбъект(ИдМассив, ИмяСправочника, ТипПриемника) — реализует алгоритм идентификации объектов: ищет по каждому элементу массива id в таблице идентификаторов, при нахождении одного уникального объекта — обогащает таблицу недостающими идентификаторами и возвращает объект. При отсутствии создаёт новый. При неоднозначности — выбрасывает исключение.

ПолучитьЗначениеПоТипу(Значение, Тип, ...) — преобразует значение из JSON-структуры в требуемый 1С-тип (Дата, Число, Булево и др.).

Флаг «ДатаХабНеобрабатывать»

При записи объекта внутри входящего обработчика подписки на события должны пропустить эту запись, иначе объект попадёт в очередь исходящих и будет отправлен обратно на шину. Для подавления исходящего события добавляется флаг в ДополнительныеСвойства объекта:

СправочникОбъект.ДополнительныеСвойства.Вставить("ДатаХабНеобрабатывать", Истина);

Подписка на событие проверяет этот флаг и не регистрирует объект в очереди.

Отложенная обработка

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

Соглашение об именовании

Рекомендуемый формат:

{ClassId}_Входящая

Например: Catalog_Контрагенты_Входящая, Document_РеализацияТоваровУслуг_Входящая.