Skip to content

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Переменные контекста ​

Механизм генерации объявляет в обработчике фиксированный набор переменных. Другие имена недоступны: объявлять свои переменные оператором Перем в тексте обработчика нельзя, достаточно присвоить значение.

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

ПеременнаяТипНазначениеЗапись
ИсходныеДанныеЛюбаяСсылка, ФиксированнаяСтруктураДанные, по которым формируется сообщениенет
РезультатСоответствиеРезультат обработки, инициализирован пустым соответствиемда

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

ПеременнаяТипНазначениеЗапись
ИсходныеДанныеСоответствиеРазобранный JSON входящего сообщениянет
РезультатСоответствиеРезультат обработки, инициализирован пустым соответствиемда

Для входящего потока значение Результат вызывающим кодом не используется, но переменная объявлена и доступна для промежуточных вычислений.

Транзакцией управляет вызывающий код

Из обработчика транзакция не управляется: фиксировать или отменять изменения решает механизм, который его вызвал. Переменной для управления транзакцией в обработчике нет.

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

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

bsl
// Доступны: ИсходныеДанные - ссылка на обрабатываемый объект, Результат - Соответствие

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

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

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

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

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

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

Обработчик получает Соответствие входящего сообщения в переменной ИсходныеДанные. Вспомогательный код оформляется процедурами и функциями прямо в тексте обработчика: они выносятся на уровень модуля сформированной обработки.

bsl
// Доступны: ИсходныеДанные - Соответствие входящего сообщения, Результат - Соответствие

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

НомерЗаказа = ИсходныеДанные.Получить("orderNumber");
СсылкаНаДокумент = НайтиДокументПоНомеру(НомерЗаказа);

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

// Заполнение реквизитов
ДокументОбъект.Дата = ИсходныеДанные.Получить("orderDate");
ДокументОбъект.ДемоРеквизитСтрока = ИсходныеДанные.Получить("comment");

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

ДокументОбъект.Записать();

Результат.Вставить("number", НомерЗаказа);

Тестовые данные и отладчик

В карточке входящего потока есть поле Тестовые данные — JSON входящего сообщения. Он используется кнопкой Проверить и одновременно передаётся в отладчик редактора кода: при пошаговой отладке обработчика переменная ИсходныеДанные содержит десериализованные тестовые данные (Соответствие, а для JSON-массива — Массив). Изменённые тестовые данные подхватываются сразу, но применяются со следующего запуска отладки: уже идущий сеанс продолжает работать с прежним значением.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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