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

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

Как сериализовать объект в 1С: практическое руководство

Способы сериализации объектов 1С: ЗначениеВСтрокуВнутр, XDTO, JSON. Примеры кода, ограничения, типичные ошибки и проверка результата.

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

Главная ловушка в том, что не каждый объект можно сериализовать каждым способом. Прикладные объекты (документы, справочники) сериализуются через XDTO и внутренний формат, а коллекции вроде структур и таблиц значений имеют свои ограничения. Ниже разобраны рабочие подходы с примерами кода, проверкой результата и типичными ошибками.

Какие механизмы сериализации есть в платформе 1С

В платформе 1С:Предприятие доступны три основных подхода. Первый — внутренний формат: функции ЗначениеВСтрокуВнутр() и ЗначениеВФайл() преобразуют значение в строку или файл, понятные только платформе 1С. Это быстрый способ для обмена между информационными базами, но результат нечитаем вне 1С.

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

Сравнение способов сериализации

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

Быстро и просто, но только между базами 1С; формат закрытый, не подходит для внешних систем и долгого хранения

СериализаторXDTO

XML с типами платформы; подходит для объектов конфигурации, но требует совместимости метаданных между базами

JSON

Универсальный обмен с любыми системами; требует ручного описания полей и контроля типов при чтении

Сериализация через ЗначениеВСтрокуВнутр

Самый короткий путь — встроенная функция ЗначениеВСтрокуВнутр(Значение). Она возвращает строку во внутреннем формате платформы, которую можно сохранить в реквизит, файл или передать через HTTP. Обратное преобразование выполняется функцией ЗначениеИзСтрокиВнутр(Строка).

bsl
Структура = Новый Структура("Номер, Дата, Сумма", "А-001", ТекущаяДатаСеанса(), 1500);
СтрокаДанных = ЗначениеВСтрокуВнутр(Структура);
// ... передача строки ...
Восстановлено = ЗначениеИзСтрокиВнутр(СтрокаДанных);
Сообщить(Восстановлено.Сумма);

Способ поддерживает примитивные типы, структуры, соответствия, массивы, таблицы значений и ссылки. Однако у него есть существенные ограничения: формат не гарантирует совместимость между разными версиями платформы, а ссылки при восстановлении в другой базе должны существовать в ней с тем же уникальным идентификатором, иначе получите битую ссылку.

Сериализация объектов конфигурации через XDTO

Для документов, справочников и других прикладных объектов применяется СериализаторXDTO. Метод ЗаписатьXML() преобразует объект в XML-поток, метод ПрочитатьXML() восстанавливает его. Пример записи ссылки в XML-строку:

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

Для чтения создаётся объект ЧтениеXML, строка передаётся в него, после чего вызывается СериализаторXDTO.ПрочитатьXML(Чтение). Важное условие: тип объекта должен существовать в метаданных базы-приёмника. Если в целевой базе нет такого вида документа или изменились реквизиты, чтение завершится ошибкой или частичной потерей данных.

Когда XDTO не подходит

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

Сериализация в JSON для обмена с внешними системами

JSON — стандартный вариант интеграции 1С с веб-сервисами, мобильными приложениями и другими учётными системами. Платформа предоставляет объекты ЗаписьJSON и ЧтениеJSON, а также глобальные методы ЗаписатьJSON() и ПрочитатьJSON() для работы со структурами и соответствиями.

bsl
Данные = Новый Структура;
Данные.Вставить("Номенклатура", Строка(СсылкаНоменклатура));
Данные.Вставить("Количество", 5);
Данные.Вставить("Цена", 1200.50);

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

Ключевое ограничение: JSON не хранит типы 1С. Ссылку нельзя сериализовать «как есть» — её преобразуют в строковое представление, уникальный идентификатор (Строка(Ссылка.УникальныйИдентификатор())) или код/наименование. При чтении вы сами отвечаете за поиск объекта в базе по этому идентификатору и за приведение чисел и дат к нужным типам.

Сериализация таблиц значений и коллекций

Таблицы значений сериализуются через ЗначениеВСтрокуВнутр и ЗначениеВФайл без дополнительной подготовки. Для JSON их нужно преобразовывать вручную: обойти строки циклом, каждую строку представить структурой и собрать массив структур, который уже передаётся в ЗаписатьJSON().

При обратном чтении создаётся новая таблица значений, колонки добавляются явно с указанием типов, затем массив структур разбирается циклом. Это даёт полный контроль над типами колонок, но требует аккуратности: если в JSON пришло значение другого типа, присвоение в типизированную колонку вызовет ошибку преобразования.

Порядок сериализации таблицы значений в JSON
  1. 1
    Создайте пустой массив для результата
  2. 2
    Обойдите строки таблицы циклом и для каждой сформируйте структуру с нужными полями
  3. 3
    Добавьте каждую структуру в массив
  4. 4
    Создайте ЗаписьJSON, установите строку и вызовите ЗаписатьJSON(Запись, Массив)
  5. 5
    Закройте запись и проверьте полученную строку валидатором JSON или чтением обратно

Проверка результата и типичные ошибки

После сериализации всегда выполняйте обратное чтение на тестовых данных: это единственный надёжный способ убедиться, что структура восстанавливается полностью. Сравните ключевые поля исходного и восстановленного объекта, проверьте типы значений и наличие всех элементов коллекций.

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

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

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

Объект восстанавливается без исключений, типы совпадают с исходными

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

Ошибка чтения, значения стали строками вместо чисел или дат

Ссылки после восстановления
Норма

Ссылка указывает на существующий объект, запрос возвращает данные

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

Битая ссылка — объект не найден в целевой базе

Строка JSON
Норма

Строка проходит разбор стандартным парсером, структура соответствует ожиданиям приёмника

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

Некорректный синтаксис, потерянные поля, даты в произвольном формате

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

Как выбрать способ

Обмен идёт только между базами 1С и нужна скорость разработкиИспользуйте ЗначениеВСтрокуВнутр / ЗначениеИзСтрокиВнутр
Переносятся документы и справочники между совместимыми конфигурациямиПрименяйте СериализаторXDTO с проверкой наличия типов в приёмнике
Данные уходят во внешнюю систему, веб-сервис или мобильное приложениеФормируйте JSON вручную через структуры и контролируйте типы при чтении
Нужно долгосрочное хранение снимка данныхИспользуйте открытый формат (JSON или XML), а не внутренний формат платформы

FAQ

Можно ли сериализовать объект документа целиком, а не ссылку?

Да, через СериализаторXDTO можно записать как ссылку, так и объект документа со всеми табличными частями. При чтении в другой базе объект создаётся в памяти, и его нужно записать явно. Учтите, что конфигурации должны быть совместимы по составу реквизитов.

Почему после ЗначениеИзСтрокиВнутр ссылка стала «битой»?

Внутренний формат сохраняет уникальный идентификатор ссылки, но не сам объект. Если в базе-приёмнике объекта с таким GUID нет, ссылка указывает в никуда. Решение — переносить сами объекты вместе со ссылками или сопоставлять объекты по кодам и наименованиям.

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

Функция ЗаписатьJSON умеет записывать соответствия напрямую: ключи преобразуются в строки. При чтении ПрочитатьJSON с параметром ПрочитатьВСоответствие = Истина вернёт соответствие, иначе — структуру. Следите, чтобы ключи были допустимыми именами свойств.

Что делать, если JSON от внешней системы не читается?

Оберните ПрочитатьJSON в попытку-исключение и залогируйте исходную строку. Частые причины: невалидный синтаксис, BOM в начале файла, числа с запятой вместо точки. Проверить строку можно любым онлайн-валидатором JSON до отладки в 1С.

Подходит ли сериализация для обмена большими объёмами данных?

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

Можно ли сериализовать картинку или двоичные данные?

Двоичные данные напрямую в JSON не помещаются — их предварительно кодируют в Base64 функциями платформы. Во внутреннем формате и XDTO хранилище значений с двоичными данными сериализуется штатно, но размер результата заметно grows, поэтому для файлов лучше передавать их отдельно.

Итог

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

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