Разработка и Конфигурация · 10 мин
Как сериализовать объект в 1С: практическое руководство
Способы сериализации объектов 1С: ЗначениеВСтрокуВнутр, XDTO, JSON. Примеры кода, ограничения, типичные ошибки и проверка результата.
Сериализация в 1С — это преобразование объекта (ссылки, структуры, таблицы значений, объекта документа) в строковое или файловое представление, которое можно сохранить, передать в другую систему и позже восстановить. Платформа предлагает несколько механизмов: внутреннее представление через ЗначениеВСтрокуВнутр, сериализацию через XDTO и универсальный обмен через JSON. Выбор зависит от задачи: передача между базами 1С, интеграция с внешними сервисами или долгосрочное хранение.
Главная ловушка в том, что не каждый объект можно сериализовать каждым способом. Прикладные объекты (документы, справочники) сериализуются через XDTO и внутренний формат, а коллекции вроде структур и таблиц значений имеют свои ограничения. Ниже разобраны рабочие подходы с примерами кода, проверкой результата и типичными ошибками.
Какие механизмы сериализации есть в платформе 1С
В платформе 1С:Предприятие доступны три основных подхода. Первый — внутренний формат: функции ЗначениеВСтрокуВнутр() и ЗначениеВФайл() преобразуют значение в строку или файл, понятные только платформе 1С. Это быстрый способ для обмена между информационными базами, но результат нечитаем вне 1С.
Второй подход — сериализация через XDTO (объект СериализаторXDTO). Она преобразует объекты в XML с типами платформы и подходит для переноса данных между базами с одинаковой или совместимой конфигурацией. Третий — JSON: методы ЗаписатьJSON() и ПрочитатьJSON() позволяют обмениваться данными с любыми внешними системами, но требуют явного описания структуры данных.
Сравнение способов сериализации
Быстро и просто, но только между базами 1С; формат закрытый, не подходит для внешних систем и долгого хранения
XML с типами платформы; подходит для объектов конфигурации, но требует совместимости метаданных между базами
Универсальный обмен с любыми системами; требует ручного описания полей и контроля типов при чтении
Сериализация через ЗначениеВСтрокуВнутр
Самый короткий путь — встроенная функция ЗначениеВСтрокуВнутр(Значение). Она возвращает строку во внутреннем формате платформы, которую можно сохранить в реквизит, файл или передать через HTTP. Обратное преобразование выполняется функцией ЗначениеИзСтрокиВнутр(Строка).
Структура = Новый Структура("Номер, Дата, Сумма", "А-001", ТекущаяДатаСеанса(), 1500);
СтрокаДанных = ЗначениеВСтрокуВнутр(Структура);
// ... передача строки ...
Восстановлено = ЗначениеИзСтрокиВнутр(СтрокаДанных);
Сообщить(Восстановлено.Сумма);Способ поддерживает примитивные типы, структуры, соответствия, массивы, таблицы значений и ссылки. Однако у него есть существенные ограничения: формат не гарантирует совместимость между разными версиями платформы, а ссылки при восстановлении в другой базе должны существовать в ней с тем же уникальным идентификатором, иначе получите битую ссылку.
Сериализация объектов конфигурации через XDTO
Для документов, справочников и других прикладных объектов применяется СериализаторXDTO. Метод ЗаписатьXML() преобразует объект в XML-поток, метод ПрочитатьXML() восстанавливает его. Пример записи ссылки в XML-строку:
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(Запись, СсылкаНаДокумент);
СтрокаXML = Запись.Закрыть();Для чтения создаётся объект ЧтениеXML, строка передаётся в него, после чего вызывается СериализаторXDTO.ПрочитатьXML(Чтение). Важное условие: тип объекта должен существовать в метаданных базы-приёмника. Если в целевой базе нет такого вида документа или изменились реквизиты, чтение завершится ошибкой или частичной потерей данных.
Когда XDTO не подходит
XDTO-сериализация работает только с типами, зарегистрированными в фабрике XDTO платформы и конфигурации. Произвольные структуры, соответствия и таблицы значений напрямую через СериализаторXDTO не сериализуются — для них нужен либо внутренний формат, либо собственная схема XDTO-пакета, либо JSON.
Сериализация в JSON для обмена с внешними системами
JSON — стандартный вариант интеграции 1С с веб-сервисами, мобильными приложениями и другими учётными системами. Платформа предоставляет объекты ЗаписьJSON и ЧтениеJSON, а также глобальные методы ЗаписатьJSON() и ПрочитатьJSON() для работы со структурами и соответствиями.
Данные = Новый Структура;
Данные.Вставить("Номенклатура", Строка(СсылкаНоменклатура));
Данные.Вставить("Количество", 5);
Данные.Вставить("Цена", 1200.50);
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
СтрокаJSON = Запись.Закрыть();Ключевое ограничение: JSON не хранит типы 1С. Ссылку нельзя сериализовать «как есть» — её преобразуют в строковое представление, уникальный идентификатор (Строка(Ссылка.УникальныйИдентификатор())) или код/наименование. При чтении вы сами отвечаете за поиск объекта в базе по этому идентификатору и за приведение чисел и дат к нужным типам.
Сериализация таблиц значений и коллекций
Таблицы значений сериализуются через ЗначениеВСтрокуВнутр и ЗначениеВФайл без дополнительной подготовки. Для JSON их нужно преобразовывать вручную: обойти строки циклом, каждую строку представить структурой и собрать массив структур, который уже передаётся в ЗаписатьJSON().
При обратном чтении создаётся новая таблица значений, колонки добавляются явно с указанием типов, затем массив структур разбирается циклом. Это даёт полный контроль над типами колонок, но требует аккуратности: если в JSON пришло значение другого типа, присвоение в типизированную колонку вызовет ошибку преобразования.
- 1Создайте пустой массив для результата
- 2Обойдите строки таблицы циклом и для каждой сформируйте структуру с нужными полями
- 3Добавьте каждую структуру в массив
- 4Создайте ЗаписьJSON, установите строку и вызовите ЗаписатьJSON(Запись, Массив)
- 5Закройте запись и проверьте полученную строку валидатором JSON или чтением обратно
Проверка результата и типичные ошибки
После сериализации всегда выполняйте обратное чтение на тестовых данных: это единственный надёжный способ убедиться, что структура восстанавливается полностью. Сравните ключевые поля исходного и восстановленного объекта, проверьте типы значений и наличие всех элементов коллекций.
Как проверить результат
Объект восстанавливается без исключений, типы совпадают с исходными
Ошибка чтения, значения стали строками вместо чисел или дат
Ссылка указывает на существующий объект, запрос возвращает данные
Битая ссылка — объект не найден в целевой базе
Строка проходит разбор стандартным парсером, структура соответствует ожиданиям приёмника
Некорректный синтаксис, потерянные поля, даты в произвольном формате
Как выбрать способ
FAQ
Можно ли сериализовать объект документа целиком, а не ссылку?
Да, через СериализаторXDTO можно записать как ссылку, так и объект документа со всеми табличными частями. При чтении в другой базе объект создаётся в памяти, и его нужно записать явно. Учтите, что конфигурации должны быть совместимы по составу реквизитов.
Почему после ЗначениеИзСтрокиВнутр ссылка стала «битой»?
Внутренний формат сохраняет уникальный идентификатор ссылки, но не сам объект. Если в базе-приёмнике объекта с таким GUID нет, ссылка указывает в никуда. Решение — переносить сами объекты вместе со ссылками или сопоставлять объекты по кодам и наименованиям.
Как сериализовать соответствие в JSON?
Функция ЗаписатьJSON умеет записывать соответствия напрямую: ключи преобразуются в строки. При чтении ПрочитатьJSON с параметром ПрочитатьВСоответствие = Истина вернёт соответствие, иначе — структуру. Следите, чтобы ключи были допустимыми именами свойств.
Что делать, если JSON от внешней системы не читается?
Оберните ПрочитатьJSON в попытку-исключение и залогируйте исходную строку. Частые причины: невалидный синтаксис, BOM в начале файла, числа с запятой вместо точки. Проверить строку можно любым онлайн-валидатором JSON до отладки в 1С.
Подходит ли сериализация для обмена большими объёмами данных?
Для разовых пакетов — да, но при больших объёмах строковая сериализация создаёт нагрузку на память, так как весь результат собирается в строку. Для регулярных массовых обменов лучше использовать потоковую запись в файл, планы обмена или разбиение на пакеты.
Можно ли сериализовать картинку или двоичные данные?
Двоичные данные напрямую в JSON не помещаются — их предварительно кодируют в Base64 функциями платформы. Во внутреннем формате и XDTO хранилище значений с двоичными данными сериализуется штатно, но размер результата заметно grows, поэтому для файлов лучше передавать их отдельно.
Что важно запомнить
Выбирайте механизм под задачу: ЗначениеВСтрокуВнутр — для обмена между базами 1С, XDTO — для объектов конфигурации, JSON — для внешних систем. Всегда проверяйте результат обратным чтением, контролируйте ссылки и типы данных, а для долгого хранения и интеграций используйте только открытые форматы.