Skip to content

Создание потока данных

Пошаговое руководство по созданию исходящего потока для отправки данных во внешнюю систему.

Сценарий

Создадим поток для отправки заказов клиентов в WMS-систему при проведении документа.

Шаг 1. Создание предопределённого элемента

В Конфигураторе

  1. Откройте справочник инт_ПотокиДанных
  2. Перейдите на вкладку Предопределённые
  3. Добавьте новый элемент:
СвойствоЗначение
ИмяЭкспортЗаказовВWMS
КодORDER_WMS_EXPORT
НаименованиеЭкспорт заказов в WMS

Почему предопределённый?

Предопределённые элементы:

  • Доступны из кода без поиска по ссылке
  • Переносятся вместе с конфигурацией
  • Не могут быть случайно удалены

Шаг 2. Настройка в режиме Предприятия

Откройте созданный элемент и заполните реквизиты:

Основные настройки

РеквизитЗначение
Направление потокаИсходящий
Активен

Обработчик

Введите BSL-код, формирующий JSON-сообщение:

bsl
// Переменная ИсходныеДанные — ссылка на документ ЗаказКлиента
// Переменная Результат — уже объявлена как Соответствие

Объект = ИсходныеДанные.ПолучитьОбъект();

// Основные реквизиты
Результат.Вставить("orderId", Строка(ИсходныеДанные.УникальныйИдентификатор()));
Результат.Вставить("orderNumber", Объект.Номер);
Результат.Вставить("orderDate", Формат(Объект.Дата, "ДФ=yyyy-MM-dd'T'HH:mm:ss"));
Результат.Вставить("status", "NEW");

// Контрагент
Контрагент = Новый Соответствие;
Контрагент.Вставить("id", Строка(Объект.Контрагент.УникальныйИдентификатор()));
Контрагент.Вставить("name", Объект.Контрагент.Наименование);
Контрагент.Вставить("inn", Объект.Контрагент.ИНН);
Результат.Вставить("customer", Контрагент);

// Адрес доставки
Адрес = Новый Соответствие;
Адрес.Вставить("city", Объект.АдресДоставки.Город);
Адрес.Вставить("street", Объект.АдресДоставки.Улица);
Адрес.Вставить("building", Объект.АдресДоставки.Дом);
Результат.Вставить("deliveryAddress", Адрес);

// Товары
Товары = Новый Массив;
Для Каждого Строка Из Объект.Товары Цикл
    Товар = Новый Соответствие;
    Товар.Вставить("sku", Строка.Номенклатура.Артикул);
    Товар.Вставить("name", Строка.Номенклатура.Наименование);
    Товар.Вставить("quantity", Строка.Количество);
    Товар.Вставить("unit", Строка.ЕдиницаИзмерения.Код);
    Товар.Вставить("price", Строка.Цена);
    Товар.Вставить("amount", Строка.Сумма);
    Товары.Добавить(Товар);
КонецЦикла;
Результат.Вставить("items", Товары);

// Итоги
Результат.Вставить("totalAmount", Объект.СуммаДокумента);
Результат.Вставить("itemsCount", Объект.Товары.Количество());

Валидация (опционально)

Если хотите проверять структуру сообщений:

  1. Создайте схему в справочнике инт_Схемы
  2. Укажите:
    • Валидация: ✅
    • Схема данных: Ссылка на созданную схему
    • Имя схемы пакета: Order (имя из components/schemas)

Шаг 3. Добавление подписчика

На вкладке Подписчики потока добавьте получателей:

  1. Нажмите Добавить
  2. Выберите подписчика (например, созданный ранее HTTP-подписчик WMS)

Несколько подписчиков

Можно добавить несколько подписчиков — сообщение будет отправлено всем.

Шаг 4. Регистрация триггера

Добавьте вызов регистрации в нужный момент. Например, при проведении документа:

Вариант 1: В модуле объекта

bsl
// Документ.ЗаказКлиента.МодульОбъекта

Процедура ОбработкаПроведения(Отказ, Режим)
    // ... основная логика проведения ...
    
    // Регистрация для отправки в WMS
    ПотокДанных = Справочники.инт_ПотокиДанных.ЭкспортЗаказовВWMS;
    
    Если ПотокДанных.Активен Тогда
        РегистрыСведений.инт_ОчередьИсходящихСообщений.ЗарегистрироватьСообщение(
            Ссылка,
            ПотокДанных
        );
    КонецЕсли;
КонецПроцедуры

Вариант 2: Через подписку на событие

bsl
// ОбщийМодуль.инт_ПодпискиНаСобытия

Процедура ЗаказКлиентаПриЗаписи(Источник, Отказ) Экспорт
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    Если Источник.Проведен Тогда
        РегистрыСведений.инт_ОчередьИсходящихСообщений.ЗарегистрироватьСообщение(
            Источник.Ссылка,
            Справочники.инт_ПотокиДанных.ЭкспортЗаказовВWMS
        );
    КонецЕсли;
КонецПроцедуры

Шаг 5. Проверка работы

1. Проведите тестовый документ

bsl
// В обработке или консоли кода
ДокументОбъект = Документы.ЗаказКлиента.СоздатьДокумент();
// ... заполнение реквизитов ...
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

2. Проверьте очередь

Откройте регистр сведений инт_ОчередьИсходящихСообщений и убедитесь, что появилась запись.

3. Проверьте статус

Откройте регистр инт_ТекущийСтатусИсходящихСообщений:

СтатусОзначает
НовыйОжидает формирования
ГотовоКОтправкеСформировано, ожидает отправки
ОтправленоУспешно доставлено
ОшибкаФормированияОшибка в обработчике

4. Принудительный запуск обработки

Для теста можно вручную запустить регламентные задания:

bsl
// Формирование сообщений
инт_ФормированиеИсходящихСообщений.ЗапускМенеджераПотоков();

// Отправка сообщений
инт_ОтправкаИсходящихСообщений.инт_ЗапуститьМенеджерПотоковРассылкиСообщений();

Результат

После выполнения всех шагов:

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│ ЗаказКлиента    │    │ Поток:          │    │ WMS API:        │
│ Проведение      │───▶│ ORDER_WMS_EXPORT│───▶│ POST /orders    │
└─────────────────┘    └─────────────────┘    └─────────────────┘

Отладка

Просмотр сформированного сообщения

bsl
// Получить данные сообщения по ID
ДанныеСообщения = РегистрыСведений.инт_ОчередьИсходящихСообщений
    .ПолучитьДанныеОчередиПоИдентификатору(
        ИдентификаторСообщения,
        "СформированноеСообщение"
    );

// Сериализовать в JSON для просмотра
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеСообщения.СформированноеСообщение);
Сообщить(ЗаписьJSON.Закрыть());

Просмотр ошибок

bsl
// История статусов с ошибками
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ РегистрСведений.инт_ИсторияСтатусовИсходящихСообщений
               |ГДЕ ИдентификаторСообщения = &ID";
Запрос.УстановитьПараметр("ID", ИдентификаторСообщения);
// Результат содержит Комментарий с текстом ошибки

Частые ошибки

"Поток не активен"

Убедитесь, что флаг Активен установлен в карточке потока.

"Нельзя регистрировать входящие потоки"

Проверьте Направление потока — должно быть Исходящий.

Ошибка в обработчике

Проверьте синтаксис BSL-кода в поле Текст обработчика. Выполните тестовый вызов:

bsl
Справочники.инт_ПотокиДанных.СформироватьСообщениеПоПотоку(
    ТестоваяСсылка,
    ПотокДанных
);

Следующие шаги

Документация подсистемы интеграции