Skip to content

Валидация сообщений

Подсистема поддерживает валидацию сообщений по спецификации OpenAPI 3.0 (JSON Schema).

Назначение

  • Контроль контрактов — гарантия соответствия структуры сообщений согласованному формату
  • Раннее обнаружение ошибок — невалидные сообщения не попадают в очередь отправки
  • Документирование API — схемы служат спецификацией для внешних систем

Архитектура

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│  Сформированное │     │  Валидатор      │     │  OpenAPI Schema │
│  сообщение      │────▶│  пакетов        │◀────│  (инт_Схемы)    │
│  (JSON)         │     │                 │     │                 │
└─────────────────┘     └────────┬────────┘     └─────────────────┘

                    ┌────────────┴────────────┐
                    ▼                         ▼
             ┌────────────┐            ┌────────────┐
             │  Успех     │            │  Ошибки    │
             │  (пусто)   │            │  (массив)  │
             └────────────┘            └────────────┘

Справочник схем

Схемы хранятся в справочнике инт_Схемы:

РеквизитТипОписание
НаименованиеСтрокаНазвание схемы
ТекстСхемыJsonСтрокаJSON-текст OpenAPI спецификации
URLСхемыСтрокаURL для загрузки внешней схемы

Пример схемы

json
{
  "openapi": "3.0.0",
  "info": {
    "title": "Orders API",
    "version": "1.0.0"
  },
  "components": {
    "schemas": {
      "Order": {
        "type": "object",
        "required": ["id", "number", "date", "items"],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Уникальный идентификатор заказа"
          },
          "number": {
            "type": "string",
            "maxLength": 11,
            "description": "Номер документа"
          },
          "date": {
            "type": "string",
            "format": "date-time",
            "description": "Дата и время заказа"
          },
          "amount": {
            "type": "number",
            "minimum": 0,
            "description": "Сумма заказа"
          },
          "items": {
            "type": "array",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/OrderItem"
            }
          }
        }
      },
      "OrderItem": {
        "type": "object",
        "required": ["sku", "quantity"],
        "properties": {
          "sku": {
            "type": "string",
            "description": "Артикул товара"
          },
          "quantity": {
            "type": "number",
            "minimum": 0.001,
            "description": "Количество"
          },
          "price": {
            "type": "number",
            "minimum": 0,
            "description": "Цена за единицу"
          }
        }
      }
    }
  }
}

Настройка валидации в потоке

В справочнике инт_ПотокиДанных:

РеквизитЗначение
Валидация✅ Включена
СхемаДанныхСсылка на элемент инт_Схемы
ИмяСхемыПакетаOrder (имя схемы в components/schemas)

API валидатора

Модуль инт_ВалидаторПакетов

Валидировать

Основной метод валидации:

bsl
МассивОшибок = инт_ВалидаторПакетов.Валидировать(
    МодельДанных,    // Соответствие/Структура — данные для проверки
    ИмяСхемы,        // Строка — имя схемы в components/schemas
    ТекстСхемыJSON   // Строка — полный текст OpenAPI-спецификации
);

Возвращает:

  • Пустой массив — валидация успешна
  • Массив строк — список ошибок валидации

Пример использования

bsl
// Формируем сообщение
Сообщение = Новый Соответствие;
Сообщение.Вставить("id", Строка(НовыйУникальныйИдентификатор()));
Сообщение.Вставить("number", "00001");
// Пропустили обязательное поле date

// Получаем схему
Схема = Справочники.инт_Схемы.НайтиПоНаименованию("Orders API");

// Валидируем
МассивОшибок = инт_ВалидаторПакетов.Валидировать(
    Сообщение,
    "Order",
    Схема.ТекстСхемыJson
);

Если МассивОшибок.Количество() > 0 Тогда
    Для Каждого Ошибка Из МассивОшибок Цикл
        Сообщить(Ошибка);  // "Отсутствует обязательное свойство: date"
    КонецЦикла;
КонецЕсли;

Автоматическая валидация в потоке

Если в потоке включена валидация, она выполняется автоматически после формирования сообщения:

bsl
// Справочники.инт_ПотокиДанных.СформироватьСообщениеПоПотоку
// внутри вызывает:

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

При ошибке валидации возбуждается исключение, и сообщение получает статус ОшибкаФормирования.

Типы проверок

JSON Schema поддерживает множество правил валидации:

Типы данных

ТипОписание
stringСтрока
numberЧисло
integerЦелое число
booleanБулево
arrayМассив
objectОбъект
nullNull

Ограничения строк

json
{
  "type": "string",
  "minLength": 1,
  "maxLength": 100,
  "pattern": "^[A-Z]{2}\\d{6}$",
  "format": "email"
}

Ограничения чисел

json
{
  "type": "number",
  "minimum": 0,
  "maximum": 1000000,
  "multipleOf": 0.01
}

Ограничения массивов

json
{
  "type": "array",
  "minItems": 1,
  "maxItems": 100,
  "uniqueItems": true
}

Обязательные поля

json
{
  "type": "object",
  "required": ["id", "name", "email"],
  "properties": {
    "id": { "type": "string" },
    "name": { "type": "string" },
    "email": { "type": "string", "format": "email" }
  }
}

Кэширование схем

Подсистема поддерживает кэширование внешних схем через регистр инт_КэшированиеСхемOpenApi:

bsl
// Схемы по URL кэшируются автоматически
СхемаСсылка = Справочники.инт_Схемы.НайтиПоНаименованию("External API");
// Если указан URLСхемы — схема будет загружена и закэширована

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

Версионирование схем

Включайте версию в название схемы (Orders API v1.0). При изменении контракта создавайте новую схему.

Тестирование схем

Храните тестовые JSON-файлы в tests/fixtures/ и проверяйте их в unit-тестах.

Производительность

Валидация добавляет накладные расходы. Для высоконагруженных потоков рассмотрите валидацию только на этапе разработки.

Сообщения об ошибках

Добавляйте description к полям схемы — эти описания используются в сообщениях об ошибках.

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

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