Разработка и Конфигурация · 12 мин
Что такое сериализация в 1С и как её применять на практике
Сериализация в 1С — преобразование объектов в строку для обмена и хранения. Разбираем XML, JSON, XDTO, методы ЗначениеВСтрокуВнутр и типичные ошибки разработчиков.
Сериализация в 1С — это преобразование объекта (ссылки на элемент справочника, таблицы значений, структуры, результата запроса) в последовательность данных, которую можно сохранить в файл, передать по сети или записать в строковое поле. Обратная операция — десериализация — восстанавливает объект из этой последовательности. Без сериализации невозможен ни один обмен данными: ни выгрузка в банк, ни интеграция с сайтом, ни передача данных между базами.
Практический смысл прост: объект в памяти сервера 1С существует только в рамках сеанса. Чтобы передать его в другую базу, внешней системе или сохранить между сеансами, объект нужно «упаковать» в универсальный формат — чаще всего XML или JSON. Приёмник распаковывает данные и получает ту же структуру у себя.
Разработчику на платформе 1С:Предприятие доступно несколько механизмов сериализации: универсальные функции работы со значениями, объекты чтения и записи XML/JSON, механизм XDTO и планы обмена. Каждый подходит для своих задач и имеет ограничения, которые важно понимать до начала разработки.
Где сериализация используется в реальных задачах
Чаще всего с сериализацией разработчик сталкивается при интеграциях. HTTP-сервисы и веб-сервисы 1С принимают и возвращают данные в форматах JSON или XML — то есть каждый ответ сервиса является результатом сериализации. То же происходит при обмене с сайтом, мобильным приложением, CRM или системой банка.
Вторая область — хранение произвольных данных. Когда нужно сохранить настройки пользователя, таблицу значений или сложную структуру в строковом реквизите, применяют сериализацию во внутренний формат. Третья область — передача данных между сеансами и фоновыми заданиями: параметры фонового задания и его результат проходят через сериализацию автоматически.
Отдельный сценарий — обмен между базами 1С через планы обмена и EnterpriseData. Там сериализация выполняется платформой на основе XDTO-пакетов, но понимание механизма помогает диагностировать ошибки выгрузки.
Быстрый способ: ЗначениеВСтрокуВнутр и обратно
Для сериализации произвольных значений во внутренний формат платформы используется пара функций: ЗначениеВСтрокуВнутр(Значение) преобразует объект в строку, а ЗначениеИзСтрокиВнутр(Строка) восстанавливает его обратно. Формат закрытый, он понятен только платформе 1С и не предназначен для обмена с внешними системами.
Типичное применение — сохранение таблицы значений или настроек в хранилище значения, регистре сведений или параметре сеанса. Например, так сохраняют результаты подбора товаров между сеансами или передают сложные параметры в фоновое задание.
СтрокаДанных = ЗначениеВСтрокуВнутр(ТаблицаТоваров);
// ... сохранение строки ...
ВосстановленнаяТаблица = ЗначениеИзСтрокиВнутр(СтрокаДанных);Ограничения существенные: внутренний формат не гарантирует совместимость между далёкими версиями платформы, строка получается объёмной и нечитаемой, а внешняя система её не разберёт. Для интеграций этот способ не подходит — только для внутреннего хранения в рамках одной экосистемы 1С.
Сериализация в JSON через ЗаписьJSON и ЧтениеJSON
JSON — стандарт обмена с веб-сервисами, сайтами и мобильными приложениями. Платформа предоставляет объекты ЗаписьJSON и ЧтениеJSON для потоковой работы, а также функции ЗаписатьJSON и ПрочитатьJSON для сериализации структур, соответствий, массивов и простых типов напрямую.
Простейший сценарий: заполнить структуру нужными полями и сериализовать её одной строкой. При чтении ПрочитатьJSON возвращает структуру или соответствие — выбор задаётся параметром. Даты при этом передаются строкой, и формат даты нужно согласовать с принимающей стороной, иначе получите ошибку преобразования.
Данные = Новый Структура;
Данные.Вставить("Номер", Документ.Номер);
Данные.Вставить("Сумма", Документ.Сумма);
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
СтрокаJSON = Запись.Закрыть();Важное ограничение: напрямую в JSON сериализуются только примитивные типы, структуры, соответствия и массивы. Таблицу значений, результат запроса или ссылку на объект так просто не передать — их нужно предварительно преобразовать в массив структур. Ссылки обычно передают как строковое представление уникального идентификатора.
Сериализация в XML и механизм XDTO
XML — основной формат обмена внутри экосистемы 1С. Потоковые объекты ЗаписьXML и ЧтениеXML дают полный контроль над документом, а функции XMLСтрока и XMLЗначение сериализуют отдельные значения, включая ссылки. Именно связка XMLСтрока(Ссылка) — стандартный способ получить строковое представление ссылки для передачи в другую базу.
Механизм XDTO (XML Data Transfer Objects) работает на уровень выше: он сериализует объекты по схеме, описанной в пакете XDTO или внешней XSD-схеме. На XDTO построены планы обмена, формат EnterpriseData и веб-сервисы. Сериализатор XDTO (СериализаторXDTO) умеет записывать и читать объекты конфигурации целиком, включая табличные части.
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(Запись, ДокументОбъект);
СтрокаXML = Запись.Закрыть();Ограничение XDTO — привязка к конфигурации: объект десериализуется корректно только в базе с совместимой структурой метаданных. Передать документ из «Управления торговлей» в самописную конфигурацию напрямую через сериализатор не получится — нужен промежуточный формат с явным описанием полей.
Как выбрать подходящий механизм
Выбор зависит от того, кто является приёмником данных и как долго их нужно хранить. Универсального варианта нет: каждый механизм решает свой класс задач.
Сравнение вариантов
Только внутри одной базы или между базами на одинаковой платформе: настройки, параметры фоновых заданий. Не подходит для интеграций и долгого хранения.
Интеграции с веб-сервисами, сайтами, мобильными приложениями. Требует ручного преобразования таблиц и ссылок в примитивные типы.
Обмен файлами, передача ссылок между базами 1С, работа с внешними системами, ожидающими XML.
Обмен между базами 1С с совместимой конфигурацией, планы обмена, EnterpriseData. Требует совпадения структур метаданных или схемы.
Как выбрать действие
Проверка результата и типичные ошибки
После сериализации всегда проверяйте обратимость: десериализуйте результат в тестовом режиме и сравните ключевые поля с исходным объектом. Для JSON удобно проверять строку в любом валидаторе — синтаксическая ошибка (лишняя запятая, неэкранированная кавычка) видна сразу.
Как проверить результат
Объект восстанавливается без исключения, поля совпадают с исходными
Ошибка преобразования, пустые поля или потеря вложенных структур
На приёмной стороне XMLЗначение возвращает ссылку на существующий объект
Получена битая ссылка — объект с таким GUID в базе-приёмнике отсутствует
Дата читается в ожидаемом формате и часовом поясе
Сдвиг времени или строка даты не распознаётся
Частая ошибка — попытка сериализовать в JSON таблицу значений напрямую. Функция либо выдаст ошибку, либо результат окажется не тем, что ожидалось: сначала обойдите таблицу циклом и соберите массив структур. Вторая типичная проблема — потеря типов при десериализации: JSON не хранит типы 1С, поэтому числа, даты и булевы значения на приёмной стороне нужно явно приводить к нужному типу.
Третья группа ошибок связана со ссылками: передача ссылки через XMLСтрока работает только если в базе-приёмнике существует объект с тем же уникальным идентификатором. При обмене между разными базами сначала синхронизируйте сами объекты, иначе получите битые ссылки.
Ограничения и безопасная работа
Сериализация больших объектов (результаты запросов на сотни тысяч строк, большие табличные части) потребляет значительную память, потому что строка результата целиком строится в памяти. Для объёмных выгрузок используйте потоковую запись в файл через ЗаписьJSON.ОткрытьФайл() или ЗаписьXML с записью частями, а для чтения — потоковое ЧтениеJSON/ЧтениеXML без загрузки всего документа в память.
Отдельный риск — десериализация данных из недоверенных источников. Всегда оборачивайте ПрочитатьJSON и ЗначениеИзСтрокиВнутр в попытку/исключение и проверяйте наличие обязательных полей перед использованием. Некорректное сообщение от внешней системы не должно прерывать обмен целиком.
При обмене через HTTP дополнительно учитывайте кодировку: платформа по умолчанию работает с UTF-8, и если внешняя система ожидает другую кодировку, кириллица превратится в нечитаемые символы. Явно указывайте кодировку при записи в поток или файл.
Что важно запомнить
Сериализация в 1С — это упаковка объектов в строку для хранения и передачи. Для внутреннего хранения используйте ЗначениеВСтрокуВнутр, для интеграций — JSON, для обмена между базами 1С — XML и XDTO. Всегда проверяйте обратимость данных и обрабатывайте ошибки десериализации.
Частые вопросы о сериализации в 1С
Чем сериализация отличается от выгрузки в файл?
Выгрузка в файл — частный случай применения сериализации. Сериализация — само преобразование объекта в последовательность данных, а куда её направить (файл, HTTP-ответ, реквизит базы, буфер обмена) — решает разработчик. Можно сериализовать объект и вообще не создавать файл, например передать строку в теле HTTP-запроса.
Можно ли сериализовать документ со всеми табличными частями?
Да, через СериализаторXDTO: метод ЗаписатьXML записывает объект целиком, включая табличные части и движения. Но восстановить такой документ корректно получится только в базе с совместимой конфигурацией. Для передачи во внешнюю систему документ вручную преобразуют в структуру с массивами строк и сериализуют в JSON или XML.
Как передать ссылку на элемент справочника в другую базу?
Стандартный способ — функция XMLСтрока(Ссылка), которая возвращает строку вида уникального идентификатора с типом. На приёмной стороне используют XMLЗначение с указанием типа. Условие успеха: объект с таким GUID уже существует в базе-приёмнике, иначе получите ссылку на несуществующий объект.
Почему после ПрочитатьJSON даты становятся строками?
JSON не имеет типа «дата», даты передаются текстом. ПрочитатьJSON по умолчанию возвращает их строкой, если формат не распознан автоматически. Передавайте даты в формате ISO 8601 и при необходимости используйте параметры чтения или явное преобразование через Дата() на приёмной стороне.
Безопасно ли хранить настройки через ЗначениеВСтрокуВнутр?
Для текущей работы — да, это штатный механизм. Риск появляется при долгосрочном хранении: внутренний формат не документирован и может измениться при обновлении платформы. Для настроек, которые должны переживать обновления и миграции, надёжнее сериализовать в XML или JSON и хранить читаемый текст.
Что делать, если выгружаемый JSON слишком большой?
Не стройте всю строку в памяти. Используйте потоковую запись: ЗаписьJSON с методом ОткрытьФайл или запись в поток, выводя данные порциями в цикле. На приёмной стороне аналогично применяйте потоковое ЧтениеJSON. Если данные передаются по HTTP, дополнительно рассмотрите разбиение выгрузки на страницы с ограничением числа записей в одном ответе.