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

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

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

Модуль 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, 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. Используйте серверные выражения только при необходимости, так как они могут представлять риск безопасности.