Проблема полноценной работы с данными в веб-клиенте 1С является одной из наиболее обсуждаемых среди разработчиков. Основная сложность заключается в том, что многие привычные инструменты, такие как ЗаписьXML или ЧтениеXML, имеют ограниченную поддержку в браузерной среде. В этой статье мы подробно разберем, как обойти эти ограничения, рассмотрим использование JSON, работу с объектами через конструктор Новый и гибридные методы взаимодействия с сервером.
Для начала проанализируем ситуацию: в тонком клиенте мы привыкли использовать стандартные средства сериализации XML. Однако при переходе в веб-клиент разработчик сталкивается с тем, что объект ЗаписьXML может быть недоступен или работать некорректно. Рассмотрим типичный "гомункул" — код, который позволяет системе переключаться между локальным исполнением и серверным вызовом в зависимости от типа клиента.
Разберем пример реализации функции десериализации, которая будет корректно отрабатывать во всех средах:
#Если ВебКлиент Тогда
ДесериализованныеДанные = ДесериализоватьДанныеНаСервере(ДанныеСтрокой);
#Иначе
ДесериализованныеДанные = ДесериализоватьДанные(ДанныеСтрокой);
#КонецЕсли
&НаСервереБезКонтекста
Функция ДесериализоватьДанныеНаСервере(Данные)
Возврат ДесериализоватьДанные(Данные);
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ДесериализоватьДанные(Данные)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(Данные);
Возврат ПрочитатьXML(Чтение);
КонецФункции
В данном случае мы используем директивы препроцессора. Если код выполняется в браузере (Веб-клиент), система принудительно отправляет строку на сервер, выполняет десериализацию там и возвращает готовый объект. Несмотря на то, что это создает лишний серверный вызов, такой метод является максимально надежным для сложных типов данных.
Рассмотрим более современный способ передачи данных, который нативно поддерживается браузерами. Начиная с платформы 8.3.6, инструменты работы с JSON стали гораздо доступнее. Функции ПрочитатьJSON() и ЗаписатьJSON() позволяют работать с коллекциями (Структура, Массив, Соответствие) прямо на стороне клиента без обращения к серверу.
Выясним причину, почему JSON предпочтительнее в веб-клиенте: браузерные движки оптимизированы под парсинг этого формата. Для передачи простых структур данных мы можем использовать объект СериализаторXDTO. Рассмотрим, как это выглядит на практике:
// Сериализация структуры в JSON на клиенте
ДанныеДляОтправки = Новый Структура("ID, Статус", 123, "Активен");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
РезультатСтрокой = ЗаписьJSON.Закрыть();
Важный нюанс: если ваша структура содержит ссылки на объекты базы данных (например, СправочникСсылка), то при десериализации в веб-клиенте вы получите не "живую" ссылку, а структуру с UUID. Чтобы превратить её обратно в объект 1С, всё равно потребуется серверный контекст.
Одной из серьезных проблем веб-клиента является невозможность создания многих объектов через Новый(Тип). Например, объекты типа РегистрСведенийКлючЗаписи не имеют стандартного конструктора на клиенте. Однако существует малодокументированный, но рабочий способ — использование функциональной формы конструктора Новый с передачей массива параметров.
Проанализируем пример создания ключа записи регистра сведений на клиенте:
ПараметрыКонструктора = Новый Массив;
// Заполняем структуру измерений, которые определяют ключ
Измерения = Новый Структура("Период, Валюта", ТекущаяДата(), СсылкаНаВалюту);
ПараметрыКонструктора.Добавить(Измерения);
// Вызываем конструктор через Тип
ТипКлюча = Тип("РегистрСведенийКлючЗаписи.КурсыВалют");
КлючЗаписи = Новый(ТипКлюча, ПараметрыКонструктора);
Этот метод позволяет "собрать" объект на стороне клиента, который затем можно использовать, например, в процедуре ОповеститьОбИзменении(). Это критически важно для динамического обновления форм в веб-клиенте без полной перезагрузки страницы.
Если ваша задача — передать файл или картинку через веб-клиент, единственным универсальным способом сериализации остается Base64. Функции Base64Строка() и Base64Значение() полностью доступны в браузере. Это позволяет превратить двоичные данные в текстовую строку, которую легко передать в JSON или XML.
Посмотрим на алгоритм работы с файлом:
НачатьПомещениеФайлаНаСервер().ПолеHTMLДокумента.В некоторых случаях, когда стандартных средств 1С не хватает, мы можем воспользоваться тем фактом, что веб-клиент сам работает внутри браузера. Рассмотрим возможность использования ПолеHTMLДокумента как вспомогательного вычислительного модуля. Мы можем передать туда данные, обработать их с помощью JavaScript (который гораздо мощнее в плане работы со строками и регулярными выражениями в браузере) и вернуть результат обратно в 1С.
Преимущества этого подхода:
Выбор метода (де)сериализации в веб-клиенте зависит от ваших целей:
Помните, что веб-клиент накладывает ограничения в целях безопасности (например, отсутствие HTTPСоединение напрямую из браузера), поэтому проектируйте архитектуру обмена данными с учетом необходимости периодических обращений к серверу.