Перейти к основному содержимому

Форматы сериализации данных

Общая информация​

Модуль RAT использует сериализацию данных для обмена информацией между системами. Сериализация - это процесс преобразования объектов 1С в формат, который может быть передан по сети и восстановлен в другой системе. В качестве основного формата сериализации используется JSON.

Основные модули сериализации​

Сериализация данных в RAT реализована в следующих модулях:

  • РатПреобразованияБазовый - базовые функции сериализации и десериализации
  • РатПреобразованияКоллекции - сериализация коллекций (массивы, структуры, таблицы)
  • РатПреобразованияСсылки - сериализация ссылочных типов данных
  • РатПреобразованияПримитивы - сериализация примитивных типов данных

Сериализация типов данных​

Сериализация данных в RAT выполняется с помощью модуля РатПреобразованияБазовый.СериализоватьЗначение(), который определяет тип значения и вызывает соответствующий метод сериализации.

Примитивные типы​

Примитивные типы сериализуются следующим образом:

Тип данных 1СФормат JSON
СтрокаСтрока JSON
ЧислоЧисло JSON
БулевоБулево JSON (true/false)
ДатаСтрока в формате ISO 8601
УникальныйИдентификаторСтрока с UUID
Неопределеноnull

Примеры:

{
  "строка": "Значение строки",
  "число": 123.45,
  "булево": true,
  "дата": "2023-01-01T12:00:00",
  "уникальныйИдентификатор": "00000000-0000-0000-0000-000000000000",
  "неопределено": null
}

Двоичные данные​

Двоичные данные (ДвоичныеДанные) сериализуются в типизированный объект:

{
  "type": "base64Binary",
  "value": "VGVzdA=="
}

ХранилищеЗначения сериализуется как значение, которое оно содержит.
Если внутри двоичные данные, формат будет таким же (base64Binary).

Ссылочные типы​

Ссылочные типы (справочники, документы, перечисления и т.д.) сериализуются в формате объекта с полями type, id и presentation:

{
  "type": "CatalogRef.Пользователи",
  "id": "a772d037-9519-4c2b-8c9b-ad9de187fe90",
  "presentation": "Иванов Иван Иванович"
}
  • type - тип объекта в формате сериализации 1С (например, CatalogRef.Пользователи, DocumentRef.ПКО).
  • id - идентификатор объекта, который зависит от типа ссылки:
    • Для пустых ссылок: пустая строка
    • Для перечислений: имя элемента перечисления (например, "Ожидание")
    • Для точек маршрута бизнес-процессов: XML-строка значения
    • Для всех остальных ссылочных типов: строковое представление уникального идентификатора (UUID)
  • presentation - строковое представление объекта (результат вызова функции Строка() для объекта)

Коллекции​

Массивы​

Массивы сериализуются в массивы JSON:

[
  "Элемент 1",
  123,
  true,
  {
    "type": "CatalogRef.Пользователи",
    "id": "ИмяПользователя"
  }
]

Структуры и соответствия​

Структуры и соответствия сериализуются в объекты JSON:

{
  "Ключ1": "Значение 1",
  "Ключ2": 123,
  "Ключ3": {
    "type": "CatalogRef.Пользователи",
    "id": "ИмяПользователя"
  }
}

Таблицы значений​

Таблицы значений сериализуются в массивы объектов JSON:

[
  {
    "Код": "001",
    "Наименование": "Товар 1",
    "Цена": 100.50
  },
  {
    "Код": "002",
    "Наименование": "Товар 2",
    "Цена": 200.75
  }
]

Десериализация данных​

При десериализации данных происходит обратное преобразование - из формата JSON в объекты 1С.

Десериализация ссылок​

Десериализация ссылок выполняется модулем РатПреобразованияСсылки.ДесериализоватьСсылку(), который определяет тип ссылки и выполняет соответствующие действия для поиска объекта в информационной базе.

Существует несколько способов передать ссылку на объект при десериализации:

1. Объект (Структура) с полями​

{
  "Ответственный": {
    "type": "CatalogRef.Пользователи",
    "id": "a772d037-9519-4c2b-8c9b-ad9de187fe90"
  }
}

При этом способе:

  • Поле type определяет тип объекта
  • Поле id используется для поиска объекта в информационной базе
  • Поле presentation не используется при десериализации, но может быть полезно для отображения

2. Строка с указанием типа ссылки​

{
  "Ответственный": "CatalogRef.Пользователи.a772d037-9519-4c2b-8c9b-ad9de187fe90"
}

или

{
  "Ответственный": "Справочник.Пользователи.ИмяПользователя"
}

При этом способе строка разбивается на части:

  • Первая часть определяет тип объекта
  • Вторая часть определяет вид объекта
  • Третья часть используется как идентификатор для поиска объекта

3. Строка идентификатора (без указания типа)​

Этот способ можно использовать только для полей, которые могут ссылаться только на объекты одного, заранее известного типа:

{
  "Ответственный": "ИмяПользователя"
}

При десериализации система использует следующий алгоритм поиска объекта:

  1. Если передан UUID, система пытается найти объект по уникальному идентификатору с помощью функции РатИнформационнаяБаза.СсылкаПоУникальномуИдентификатору()
  2. Если объект является предопределенным, система пытается найти его по имени предопределенного элемента
  3. В остальных случаях система пытается найти объект по реквизитам, указанным в метаданных как поля поиска (код, наименование и т.д.), с помощью функции РатИнформационнаяБаза.СсылкаПоРеквизиту()

Идентификатор объекта​

В качестве идентификатора объекта может выступать:

  • Уникальный идентификатор (GUID): Например, a772d037-9519-4c2b-8c9b-ad9de187fe90.
  • Реквизит UID: Если у объекта есть специальное поле с названием UID.
  • Имя предопределенного элемента: Для предопределенных объектов.
  • Номер документа: Для документов.
  • Код или наименование справочника: Для элементов справочников.
  • Набор ключевых реквизитов для записи регистра: Для записей в регистрах (разделенных точкой с запятой)

Серверные выражения​

Для вычисления значений на сервере 1С используется специальная конструкция Вычислить(<Выражение>). Всё, что находится внутри скобок, будет выполнено на сервере 1С, и результат этого выполнения будет использован в качестве значения.

Примеры:

  • Получить текущую дату и время сервера: Вычислить(ТекущаяДата())
  • Рассчитать произведение двух чисел: Вычислить(100 * 20)
{
  "Дата": "Вычислить(ТекущаяДата())",
  "Сумма": "Вычислить(100 * 20)"
}

Обработка ошибок сериализации​

При сериализации и десериализации могут возникать различные ошибки:

  • Неподдерживаемый тип данных
  • Неверный формат данных
  • Отсутствие объекта в базе данных

Рекомендации по использованию​

  1. Для полей с составным типом (которые могут ссылаться на объекты разных типов) всегда указывайте тип объекта.
  2. Используйте серверные выражения только при необходимости, так как они могут представлять риск безопасности.