Как реализовать сериализацию и десериализацию данных в веб-клиенте 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Проблема полноценной работы с данными в веб-клиенте 1С является одной из наиболее обсуждаемых среди разработчиков. Основная сложность заключается в том, что многие привычные инструменты, такие как ЗаписьXML или ЧтениеXML, имеют ограниченную поддержку в браузерной среде. В этой статье мы подробно разберем, как обойти эти ограничения, рассмотрим использование JSON, работу с объектами через конструктор Новый и гибридные методы взаимодействия с сервером.

Ограничения веб-клиента и классический подход

Для начала проанализируем ситуацию: в тонком клиенте мы привыкли использовать стандартные средства сериализации XML. Однако при переходе в веб-клиент разработчик сталкивается с тем, что объект ЗаписьXML может быть недоступен или работать некорректно. Рассмотрим типичный "гомункул" — код, который позволяет системе переключаться между локальным исполнением и серверным вызовом в зависимости от типа клиента.

Разберем пример реализации функции десериализации, которая будет корректно отрабатывать во всех средах:


#Если ВебКлиент Тогда
    ДесериализованныеДанные = ДесериализоватьДанныеНаСервере(ДанныеСтрокой);
#Иначе
    ДесериализованныеДанные = ДесериализоватьДанные(ДанныеСтрокой);
#КонецЕсли

&НаСервереБезКонтекста
Функция ДесериализоватьДанныеНаСервере(Данные)
    Возврат ДесериализоватьДанные(Данные);
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ДесериализоватьДанные(Данные)
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(Данные);
    Возврат ПрочитатьXML(Чтение);
КонецФункции

В данном случае мы используем директивы препроцессора. Если код выполняется в браузере (Веб-клиент), система принудительно отправляет строку на сервер, выполняет десериализацию там и возвращает готовый объект. Несмотря на то, что это создает лишний серверный вызов, такой метод является максимально надежным для сложных типов данных.

Использование JSON как альтернативы для веб-клиента

Рассмотрим более современный способ передачи данных, который нативно поддерживается браузерами. Начиная с платформы 8.3.6, инструменты работы с JSON стали гораздо доступнее. Функции ПрочитатьJSON() и ЗаписатьJSON() позволяют работать с коллекциями (Структура, Массив, Соответствие) прямо на стороне клиента без обращения к серверу.

Выясним причину, почему JSON предпочтительнее в веб-клиенте: браузерные движки оптимизированы под парсинг этого формата. Для передачи простых структур данных мы можем использовать объект СериализаторXDTO. Рассмотрим, как это выглядит на практике:


// Сериализация структуры в JSON на клиенте
ДанныеДляОтправки = Новый Структура("ID, Статус", 123, "Активен");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
РезультатСтрокой = ЗаписьJSON.Закрыть();

Важный нюанс: если ваша структура содержит ссылки на объекты базы данных (например, СправочникСсылка), то при десериализации в веб-клиенте вы получите не "живую" ссылку, а структуру с UUID. Чтобы превратить её обратно в объект 1С, всё равно потребуется серверный контекст.

Создание объектов через конструктор Новый с параметрами

Одной из серьезных проблем веб-клиента является невозможность создания многих объектов через Новый(Тип). Например, объекты типа РегистрСведенийКлючЗаписи не имеют стандартного конструктора на клиенте. Однако существует малодокументированный, но рабочий способ — использование функциональной формы конструктора Новый с передачей массива параметров.

Проанализируем пример создания ключа записи регистра сведений на клиенте:


ПараметрыКонструктора = Новый Массив;
// Заполняем структуру измерений, которые определяют ключ
Измерения = Новый Структура("Период, Валюта", ТекущаяДата(), СсылкаНаВалюту);
ПараметрыКонструктора.Добавить(Измерения);

// Вызываем конструктор через Тип
ТипКлюча = Тип("РегистрСведенийКлючЗаписи.КурсыВалют");
КлючЗаписи = Новый(ТипКлюча, ПараметрыКонструктора);

Этот метод позволяет "собрать" объект на стороне клиента, который затем можно использовать, например, в процедуре ОповеститьОбИзменении(). Это критически важно для динамического обновления форм в веб-клиенте без полной перезагрузки страницы.

Работа с бинарными данными и Base64

Если ваша задача — передать файл или картинку через веб-клиент, единственным универсальным способом сериализации остается Base64. Функции Base64Строка() и Base64Значение() полностью доступны в браузере. Это позволяет превратить двоичные данные в текстовую строку, которую легко передать в JSON или XML.

Посмотрим на алгоритм работы с файлом:

  1. Помещаем файл во временное хранилище с помощью НачатьПомещениеФайлаНаСервер().
  2. На сервере получаем двоичные данные и преобразуем их в Base64.
  3. Передаем строку на клиент.
  4. В веб-клиенте используем эту строку, например, для отображения в ПолеHTMLДокумента.

Использование Поля HTML-документа для сложной логики

В некоторых случаях, когда стандартных средств 1С не хватает, мы можем воспользоваться тем фактом, что веб-клиент сам работает внутри браузера. Рассмотрим возможность использования ПолеHTMLДокумента как вспомогательного вычислительного модуля. Мы можем передать туда данные, обработать их с помощью JavaScript (который гораздо мощнее в плане работы со строками и регулярными выражениями в браузере) и вернуть результат обратно в 1С.

Преимущества этого подхода:

Подведем итоги

Выбор метода (де)сериализации в веб-клиенте зависит от ваших целей:

  1. Если нужно быстро передать простые коллекции — используйте JSON.
  2. Если требуется восстановить сложные объекты 1С (ссылки, ключи записей) — используйте серверный вызов с передачей строки XML.
  3. Для создания объектов "на лету" на клиенте — применяйте конструктор Новый(Тип, МассивПараметров).
  4. Для работы с внешними системами через браузер — используйте Base64 и механизмы CORS через серверное проксирование.

Помните, что веб-клиент накладывает ограничения в целях безопасности (например, отсутствие HTTPСоединение напрямую из браузера), поэтому проектируйте архитектуру обмена данными с учетом необходимости периодических обращений к серверу.

← На главную