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