Потоки данных
Поток данных (инт_ПотокиДанных) — центральный объект подсистемы, определяющий правила обработки сообщений.
Основные свойства
| Реквизит | Тип | Описание |
|---|---|---|
Код | Строка | Уникальный идентификатор потока |
Наименование | Строка | Человекочитаемое название |
НаправлениеПотока | Перечисление | Исходящий или Входящий |
Активен | Булево | Включён ли поток |
ТекстОбработчика | Строка | BSL-код обработчика |
Валидация | Булево | Включена ли валидация |
СхемаДанных | СправочникСсылка.инт_Схемы | Ссылка на схему валидации |
ИмяСхемыПакета | Строка | Имя схемы в OpenAPI-спецификации |
Направления потоков
Исходящий поток
Используется для отправки данных из 1С во внешние системы.
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Исходные │ │ Обработчик │ │ Подписчики │
│ данные │────────▶│ (BSL-код) │────────▶│ (HTTP/MQ/...) │
│ (Ссылка) │ │ → JSON │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘Обработчик исходящего потока преобразует исходные данные (обычно ссылку на объект 1С) в JSON-структуру для отправки.
Входящий поток
Используется для приёма данных из внешних систем в 1С.
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Внешняя │ │ Обработчик │ │ Объекты 1С │
│ система │────────▶│ (BSL-код) │────────▶│ (создание/ │
│ (JSON) │ │ JSON → │ │ изменение) │
└─────────────────┘ └─────────────────┘ └─────────────────┘Обработчик входящего потока принимает JSON-данные и создаёт/обновляет объекты в базе.
Написание обработчика
Переменные контекста
Механизм генерации объявляет в обработчике фиксированный набор переменных. Другие имена недоступны: объявлять свои переменные оператором Перем в тексте обработчика нельзя, достаточно присвоить значение.
Исходящий поток
| Переменная | Тип | Назначение | Запись |
|---|---|---|---|
ИсходныеДанные | ЛюбаяСсылка, ФиксированнаяСтруктура | Данные, по которым формируется сообщение | нет |
Результат | Соответствие | Результат обработки, инициализирован пустым соответствием | да |
Входящий поток
| Переменная | Тип | Назначение | Запись |
|---|---|---|---|
ИсходныеДанные | Соответствие | Разобранный JSON входящего сообщения | нет |
Результат | Соответствие | Результат обработки, инициализирован пустым соответствием | да |
Для входящего потока значение Результат вызывающим кодом не используется, но переменная объявлена и доступна для промежуточных вычислений.
Транзакцией управляет вызывающий код
Из обработчика транзакция не управляется: фиксировать или отменять изменения решает механизм, который его вызвал. Переменной для управления транзакцией в обработчике нет.
Исходящий поток
Обработчик должен заполнить Соответствие в переменной Результат:
// Доступны: ИсходныеДанные - ссылка на обрабатываемый объект, Результат - Соответствие
Объект = ИсходныеДанные.ПолучитьОбъект();
Результат.Вставить("id", Строка(ИсходныеДанные.УникальныйИдентификатор()));
Результат.Вставить("number", Объект.Номер);
Результат.Вставить("date", Формат(Объект.Дата, "ДФ=yyyy-MM-dd'T'HH:mm:ss"));
Результат.Вставить("amount", Объект.СуммаДокумента);
// Вложенный массив
Товары = Новый Массив;
Для Каждого СтрокаТовара Из Объект.Товары Цикл
Товар = Новый Соответствие;
Товар.Вставить("sku", СтрокаТовара.Номенклатура.Артикул);
Товар.Вставить("quantity", СтрокаТовара.Количество);
Товар.Вставить("price", СтрокаТовара.Цена);
Товары.Добавить(Товар);
КонецЦикла;
Результат.Вставить("items", Товары);Переменная Результат
Переменная Результат объявлена автоматически и инициализирована пустым Соответствие. Просто заполните её нужными данными.
Входящий поток
Обработчик получает Соответствие входящего сообщения в переменной ИсходныеДанные. Вспомогательный код оформляется процедурами и функциями прямо в тексте обработчика: они выносятся на уровень модуля сформированной обработки.
// Доступны: ИсходныеДанные - Соответствие входящего сообщения, Результат - Соответствие
Функция НайтиДокументПоНомеру(Номер)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ Документ.демо_Документ
|ГДЕ Номер = &Номер";
Запрос.УстановитьПараметр("Номер", Номер);
Выборка = Запрос.Выполнить().Выбрать();
Возврат ?(Выборка.Следующий(), Выборка.Ссылка, Неопределено);
КонецФункции
НомерЗаказа = ИсходныеДанные.Получить("orderNumber");
СсылкаНаДокумент = НайтиДокументПоНомеру(НомерЗаказа);
Если СсылкаНаДокумент = Неопределено Тогда
ДокументОбъект = Документы.демо_Документ.СоздатьДокумент();
Иначе
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
КонецЕсли;
// Заполнение реквизитов
ДокументОбъект.Дата = ИсходныеДанные.Получить("orderDate");
ДокументОбъект.ДемоРеквизитСтрока = ИсходныеДанные.Получить("comment");
// Заполнение табличной части
Для Каждого ТоварJSON Из ИсходныеДанные.Получить("items") Цикл
СтрокаТЧ = ДокументОбъект.Товары.Добавить();
СтрокаТЧ.Название = ТоварJSON.Получить("sku");
СтрокаТЧ.Количество = ТоварJSON.Получить("quantity");
КонецЦикла;
ДокументОбъект.Записать();
Результат.Вставить("number", НомерЗаказа);Тестовые данные и отладчик
В карточке входящего потока есть поле Тестовые данные — JSON входящего сообщения. Он используется кнопкой Проверить и одновременно передаётся в отладчик редактора кода: при пошаговой отладке обработчика переменная ИсходныеДанные содержит десериализованные тестовые данные (Соответствие, а для JSON-массива — Массив). Изменённые тестовые данные подхватываются сразу, но применяются со следующего запуска отладки: уже идущий сеанс продолжает работать с прежним значением.
Безопасный режим
Обработчики выполняются в безопасном режиме (УстановитьБезопасныйРежим(Истина)). Доступ к файловой системе и внешним компонентам ограничен.
Подписчики потока
К исходящему потоку можно подключить нескольких подписчиков через табличную часть ПодписчикиПотока:
| Колонка | Тип | Описание |
|---|---|---|
Подписчик | СправочникСсылка.инт_Подписчики | Ссылка на подписчика |
Одно сообщение будет отправлено всем активным подписчикам потока.
Настройка повторных попыток
Для входящих потоков можно настроить интервал между попытками обработки:
| Реквизит | Описание |
|---|---|
ПаузаМеждуПопыткамиОбработки | Интервал в секундах |
Расчёт времени следующей попытки:
ДатаСледующейПопытки = Справочники.инт_ПотокиДанных.РасчитатьДатуСледующейПопыткиПоДате(
ТекущаяДатаСеанса(),
ПотокДанных
);API модуля менеджера
СформироватьСообщениеПоПотоку
Формирует сообщение, выполняя обработчик потока:
СформированноеСообщение = Справочники.инт_ПотокиДанных.СформироватьСообщениеПоПотоку(
ИсходныеДанные, // Ссылка или ФиксированнаяСтруктура
ПотокДанных // СправочникСсылка.инт_ПотокиДанных
);
// Возвращает: СоответствиеПолучитьПотокПоИдентификатору
Находит поток по коду:
ПотокДанных = Справочники.инт_ПотокиДанных.ПолучитьПотокПоИдентификатору(
"ORDER_EXPORT", // Код потока
Перечисления.инт_НаправлениеПотокаДанных.Исходящий // Опционально
);ОбработатьВходящееСообщениеПоПотоку
Обрабатывает входящее сообщение:
Справочники.инт_ПотокиДанных.ОбработатьВходящееСообщениеПоПотоку(
СоответствиеСообщения, // Соответствие с данными
ПотокДанных, // СправочникСсылка.инт_ПотокиДанных
Истина // РазрешитьФиксациюИзменений
);Рекомендации
Предопределённые элементы
Создавайте потоки как предопределённые элементы справочника. Это упрощает обращение к ним из кода и миграцию между базами.
Разделение обязанностей
Каждый поток должен отвечать за один тип сообщений. Не смешивайте разные сущности в одном потоке.
Идемпотентность входящих потоков
Обработчик входящего потока должен быть идемпотентным — повторный вызов с теми же данными не должен создавать дубликаты.
Следующие шаги
- Подписчики — настройка получателей сообщений
- Валидация — проверка структуры сообщений
- Создание потока (практика) — пошаговое руководство