К статье
Практический материал

Разработка и Конфигурация · 10 мин

Сериализация в 1С: что это и как применяется

Что такое сериализация в 1С, зачем нужна, какие форматы используются (XML, JSON, XDTO) и как выполнить сериализацию объектов на встроенном языке.

Сериализация в 1С — это процесс преобразования объектов платформы (документов, справочников, таблиц значений, структур) в текстовое или двоичное представление, которое можно сохранить в файл, передать по сети или записать в строку. Обратная операция — десериализация — восстанавливает объект из этого представления обратно в память программы. Без сериализации невозможен обмен данными между базами 1С, интеграция с веб-сервисами, сайтами и внешними системами.

Термин пришёл из общей теории программирования, но в экосистеме 1С имеет свою специфику: платформа предоставляет собственные механизмы сериализации, встроенные в язык и в технологию XDTO. Разработчику редко приходится писать «ручной» разбор — большинство типов сериализуются штатными средствами.

На практике с сериализацией сталкиваются в трёх ситуациях: при обмене между конфигурациями (например, выгрузка из УТ в БП), при интеграции через HTTP-сервисы и REST API, а также при сохранении настроек и сложных структур данных в хранилище значений или файлы.

Где в 1С применяется сериализация

Основные сценарии, в которых без сериализации не обойтись:

  • Обмен данными между информационными базами (РИБ, планы обмена, универсальный формат EnterpriseData).
  • Интеграция с внешними системами через HTTP-сервисы, веб-сервисы (SOAP) и REST API.
  • Сохранение произвольных структур данных в хранилище значений, файлы или строковые реквизиты.
  • Передача данных между клиентом и сервером, между сеансами, через очереди сообщений.
  • Выгрузка отчётов, печатных форм и настроек в файлы для переноса между базами.

Типичный пример: база Управление торговлей должна передать заказ на сайт интернет-магазина. Объект «Заказ клиента» нельзя «отправить» напрямую — его преобразуют в JSON-строку, передают по HTTP, а на стороне сайта строка разбирается обратно в структуру данных.

Основные форматы и механизмы сериализации в 1С

Платформа предлагает несколько штатных способов, каждый со своей областью применения.

МеханизмФорматКогда использовать
ЗаписьJSON / ЧтениеJSONJSONИнтеграция с веб-сервисами, сайтами, мобильными приложениями
ЗаписьXML / ЧтениеXMLXMLФайловые выгрузки, обмен с системами, работающими на XML
XDTO (фабрика XDTO)XML по схемеОбмен с валидацией по схеме, планы обмена, веб-сервисы SOAP
ЗначениеВСтрокуВнутр / ЗначениеИзСтрокиВнутрВнутренний формат 1СПеренос данных только между базами 1С
СериализаторXDTOXML (типы 1С)Сериализация объектов платформы: ссылок, документов, записей

Выбор зависит от приёмника данных. Если обмен идёт только между базами 1С, удобны внутренние функции или СериализаторXDTO — они сохраняют типы платформы без потерь. Если приёмник — внешняя система, стандартом де-факто стал JSON: он компактнее XML и нативно поддерживается большинством языков.

Сравнение вариантов

JSON

Подходит для REST API и веб-интеграций. Ограничение: нет строгой типизации, даты и ссылки 1С приходится преобразовывать вручную.

XML/XDTO

Подходит для обменов со схемной валидацией и SOAP. Ограничение: более громоздкий формат и сложнее настройка пакетов.

ЗначениеВСтрокуВнутр

Подходит для переноса между базами 1С без потери типов. Ограничение: результат нечитаем и бесполезен вне платформы 1С.

Как сериализовать объект в JSON

Наиболее востребованная задача — сформировать JSON из структуры или соответствия. Для этого используются объекты ЗаписьJSON и ЧтениеJSON встроенного языка.

bsl
Структура = Новый Структура;
Структура.Вставить("Номер", "000000001");
Структура.Вставить("Дата", Формат(ТекущаяДатаСеанса(), "ДФ=yyyy-MM-dd"));
Структура.Вставить("Сумма", 1500.50);

Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Структура);
СтрокаJSON = Запись.Закрыть();

Обратная операция — чтение строки JSON в структуру:

bsl
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
Данные = ПрочитатьJSON(Чтение, Истина); // Истина — читать в соответствие
Чтение.Закрыть();

Параметр «Истина» в ПрочитатьJSON означает чтение в соответствие, а не в структуру. Это удобно, когда имена ключей могут содержать символы, недопустимые для имён свойств структуры (например, дефисы или пробелы).

Сериализация объектов платформы через XDTO

Когда нужно сериализовать ссылку на справочник, документ или набор записей с сохранением типов 1С, применяется объект СериализаторXDTO. Он преобразует значения платформы в XML-элементы и обратно.

bsl
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СсылкаНаДокумент);
СтрокаXML = ЗаписьXML.Закрыть();

// Обратное восстановление
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаXML);
Если СериализаторXDTO.ВозможностьЧтенияXML(ЧтениеXML) Тогда
    ВосстановленнаяСсылка = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
КонецЕсли;

Такой подход используется в механизмах обмена данными: планы обмена, конвертация данных и универсальный формат построены именно на XDTO. Разработчику это даёт гарантию, что типы (ссылки, перечисления, даты) восстановятся корректно, если приёмник — тоже база 1С с совместимой конфигурацией.

Сохранение данных в хранилище значений

Отдельный частный случай — сохранение произвольных данных (таблицы значений, картинки, настройки) в реквизит типа ХранилищеЗначения. Платформа автоматически сериализует объект во внутренний формат при помещении в хранилище и десериализует при извлечении методом Получить().

Это удобно для настроек отчётов, вложений и служебных структур, но имеет ограничения: содержимое хранилища недоступно для запросов и поиска, а при больших объёмах данных раздувает таблицу и замедляет выборки. Для данных, по которым нужен поиск или отборы, хранилище значений не подходит.

Типичные ошибки
01
Передача дат «как есть» в JSON без форматирования — на приёмнике дата не распознаётся или смещается из-за часового пояса.
02
Использование ЗначениеВСтрокуВнутр для обмена с внешней системой — строка читается только платформой 1С.
03
Сериализация огромных таблиц целиком в одну строку — рост памяти и тайм-ауты; большие объёмы передают порциями или файлами.
04
Отсутствие обработки ошибок при десериализации — битый JSON приводит к падению обработчика без понятного сообщения.

Проверка результата сериализации

После формирования строки стоит убедиться, что она корректна и читается обратно. Минимальная проверка — выполнить десериализацию той же строкой и сравнить ключевые поля с исходным объектом.

Контрольные точки

Как проверить результат

Чтение строки обратно
Норма

ПрочитатьJSON/ПрочитатьXML выполняется без исключения, структура содержит все ключи

Тревожный признак

Исключение «Ошибка формата потока» или пустой результат

Типы данных после разбора
Норма

Числа — числами, даты распознаны приёмником, ссылки соответствуют исходным GUID

Тревожный признак

Числа пришли строками, даты сдвинуты, ссылки не находятся в базе-приёмнике

Объём передаваемых данных
Норма

Строка разумного размера, передача укладывается в тайм-ауты

Тревожный признак

Мегабайты текста в одном запросе, обрывы по тайм-ауту

Для отладки удобно выводить сформированную строку в файл и проверять её валидатором JSON или XML — синтаксическая ошибка (лишняя запятая, незакрытый тег) обнаруживается сразу.

Порядок действий при настройке обмена
  1. 1
    Определите приёмника: база 1С или внешняя система — от этого зависит формат.
  2. 2
    Составьте структуру передаваемых данных и договоритесь о формате дат и идентификаторов.
  3. 3
    Реализуйте сериализацию (ЗаписатьJSON или СериализаторXDTO) и оберните в попытку/исключение.
  4. 4
    Реализуйте десериализацию на стороне приёмника с проверкой обязательных полей.
  5. 5
    Протестируйте на копии базы: сформируйте строку, прочитайте обратно, сверьте данные.

Частые вопросы о сериализации в 1С

Чем сериализация отличается от выгрузки в файл?

Выгрузка в файл — частный случай применения сериализации. Сериализация — сам процесс преобразования объекта в строковое или двоичное представление; результат можно записать в файл, отправить по HTTP или сохранить в реквизит. Выгрузка же подразумевает именно сохранение в файл.

Можно ли сериализовать любой объект 1С?

Нет. Примитивные типы, структуры, массивы, ссылки и объекты данных сериализуются штатно. А вот объекты, привязанные к контексту сеанса (например, элементы формы, построители запросов), сериализации не подлежат — попытка вызовет ошибку. Для передачи таких данных сначала извлекают их содержимое в сериализуемые структуры.

Что выбрать для REST-интеграции: JSON или XML?

Обычно JSON: он компактнее, проще разбирается на стороне веб-приложений и является стандартом для REST API. XML оправдан, если внешняя система уже работает с ним или требуется валидация по XSD-схеме.

Как передать ссылку на документ между разными базами?

Через GUID: метод УникальныйИдентификатор() у ссылки даёт строку, которую передают в JSON или XML. На стороне приёмника ссылку восстанавливают через ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)). Это работает, только если обе базы содержат одинаковые типы объектов.

Безопасно ли хранить сериализованные данные в открытом виде?

Нет, если в данных есть конфиденциальная информация. JSON и XML — обычный текст. Для чувствительных данных применяйте шифрование канала (HTTPS) и, при необходимости, шифрование самого содержимого перед сериализацией.

Почему после десериализации даты отличаются на несколько часов?

Причина — часовые пояса и формат представления даты. Если дата передана в формате с указанием смещения (например, ISO 8601 с зоной), а приёмник интерпретирует её как локальную, возникает сдвиг. Договоритесь о едином формате и явно указывайте, в каком часовом поясе передаётся значение.

Итог

Что важно запомнить

Сериализация в 1С — преобразование объектов в строку (JSON, XML, XDTO) для передачи или хранения, десериализация — обратное восстановление. Для внешних систем используйте JSON, для обмена между базами 1С — СериализаторXDTO или внутренние функции. Всегда согласовывайте формат дат и идентификаторов, обрабатывайте ошибки разбора и проверяйте результат обратным чтением.