Skip to content

Потоки данных

Поток данных (инт_ПотокиДанных) — центральный объект подсистемы, определяющий правила обработки сообщений.

Основные свойства

РеквизитТипОписание
КодСтрокаУникальный идентификатор потока
НаименованиеСтрокаЧеловекочитаемое название
НаправлениеПотокаПеречислениеИсходящий или Входящий
АктивенБулевоВключён ли поток
ТекстОбработчикаСтрокаBSL-код обработчика
ВалидацияБулевоВключена ли валидация
СхемаДанныхСправочникСсылка.инт_СхемыСсылка на схему валидации
ИмяСхемыПакетаСтрокаИмя схемы в OpenAPI-спецификации

Направления потоков

Исходящий поток

Используется для отправки данных из 1С во внешние системы.

┌─────────────────┐         ┌─────────────────┐         ┌─────────────────┐
│  Исходные       │         │  Обработчик     │         │  Подписчики     │
│  данные         │────────▶│  (BSL-код)      │────────▶│  (HTTP/MQ/...)  │
│  (Ссылка)       │         │  → JSON         │         │                 │
└─────────────────┘         └─────────────────┘         └─────────────────┘

Обработчик исходящего потока преобразует исходные данные (обычно ссылку на объект 1С) в JSON-структуру для отправки.

Входящий поток

Используется для приёма данных из внешних систем в 1С.

┌─────────────────┐         ┌─────────────────┐         ┌─────────────────┐
│  Внешняя        │         │  Обработчик     │         │  Объекты 1С     │
│  система        │────────▶│  (BSL-код)      │────────▶│  (создание/     │
│  (JSON)         │         │  JSON →         │         │   изменение)    │
└─────────────────┘         └─────────────────┘         └─────────────────┘

Обработчик входящего потока принимает JSON-данные и создаёт/обновляет объекты в базе.

Написание обработчика

Исходящий поток

Обработчик должен вернуть Соответствие через переменную Результат:

bsl
// Переменная ИсходныеДанные доступна автоматически
// Это ссылка на объект или фиксированная структура

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

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

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

Переменная Результат

Переменная Результат объявлена автоматически и инициализирована пустым Соответствие. Просто заполните её нужными данными.

Входящий поток

Обработчик получает Соответствие входящего сообщения:

bsl
// Переменная СоответствиеСообщения доступна автоматически
// Переменная РазрешитьФиксациюИзменений управляет транзакцией

НомерЗаказа = СоответствиеСообщения.Получить("orderNumber");
ДатаЗаказа = СоответствиеСообщения.Получить("orderDate");

// Поиск или создание документа
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ Документ.ЗаказКлиента
               |ГДЕ Номер = &Номер";
Запрос.УстановитьПараметр("Номер", НомерЗаказа);
Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
    ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
Иначе
    ДокументОбъект = Документы.ЗаказКлиента.СоздатьДокумент();
КонецЕсли;

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

// Заполнение табличной части
Товары = СоответствиеСообщения.Получить("items");
Для Каждого ТоварJSON Из Товары Цикл
    СтрокаТЧ = ДокументОбъект.Товары.Добавить();
    СтрокаТЧ.Номенклатура = НайтиНоменклатуруПоАртикулу(ТоварJSON.Получить("sku"));
    СтрокаТЧ.Количество = ТоварJSON.Получить("quantity");
КонецЦикла;

Если РазрешитьФиксациюИзменений Тогда
    ДокументОбъект.Записать();
КонецЕсли;

Безопасный режим

Обработчики выполняются в безопасном режиме (УстановитьБезопасныйРежим(Истина)). Доступ к файловой системе и внешним компонентам ограничен.

Подписчики потока

К исходящему потоку можно подключить нескольких подписчиков через табличную часть ПодписчикиПотока:

КолонкаТипОписание
ПодписчикСправочникСсылка.инт_ПодписчикиСсылка на подписчика

Одно сообщение будет отправлено всем активным подписчикам потока.

Настройка повторных попыток

Для входящих потоков можно настроить интервал между попытками обработки:

РеквизитОписание
ПаузаМеждуПопыткамиОбработкиИнтервал в секундах

Расчёт времени следующей попытки:

bsl
ДатаСледующейПопытки = Справочники.инт_ПотокиДанных.РасчитатьДатуСледующейПопыткиПоДате(
    ТекущаяДатаСеанса(), 
    ПотокДанных
);

API модуля менеджера

СформироватьСообщениеПоПотоку

Формирует сообщение, выполняя обработчик потока:

bsl
СформированноеСообщение = Справочники.инт_ПотокиДанных.СформироватьСообщениеПоПотоку(
    ИсходныеДанные,  // Ссылка или ФиксированнаяСтруктура
    ПотокДанных      // СправочникСсылка.инт_ПотокиДанных
);
// Возвращает: Соответствие

ПолучитьПотокПоИдентификатору

Находит поток по коду:

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

ОбработатьВходящееСообщениеПоПотоку

Обрабатывает входящее сообщение:

bsl
Справочники.инт_ПотокиДанных.ОбработатьВходящееСообщениеПоПотоку(
    СоответствиеСообщения,  // Соответствие с данными
    ПотокДанных,            // СправочникСсылка.инт_ПотокиДанных
    Истина                  // РазрешитьФиксациюИзменений
);

Рекомендации

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

Создавайте потоки как предопределённые элементы справочника. Это упрощает обращение к ним из кода и миграцию между базами.

Разделение обязанностей

Каждый поток должен отвечать за один тип сообщений. Не смешивайте разные сущности в одном потоке.

Идемпотентность входящих потоков

Обработчик входящего потока должен быть идемпотентным — повторный вызов с теми же данными не должен создавать дубликаты.

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

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