Как передать диаграмму или отчет через веб-сервис на мобильное устройство в 1С?

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

При разработке мобильных решений на платформе 1С часто возникает задача: сформировать аналитический отчет или график на стороне основного сервера и отобразить его на мобильном клиенте (планшете или смартфоне) через веб-сервис. Однако при попытке прямой сериализации объектов типа Диаграмма или табличных документов с внедренными графиками разработчики сталкиваются с ошибками десериализации на мобильном устройстве.

Разберем подробно, почему возникает эта проблема, как правильно настроить передачу данных через XDTO и ХранилищеЗначения, а также какие архитектурные подходы гарантируют стабильное отображение диаграмм на мобильной платформе.

Причины ошибок при передаче диаграмм на мобильную платформу

Проанализируем технические особенности взаимодействия десктопной и мобильной платформ 1С:

  1. Различия графических подсистем: Графический движок мобильной платформы 1С оптимизирован под мобильные ОС (Android, iOS) и отличается от движка тонкого/толстого клиента Windows/Linux. Некоторые свойства диаграмм (например, маркеры серий в режиме «Авто», специфические шрифты, декоративные элементы) не могут быть распознаны мобильным клиентом при десериализации встроенного графического объекта.
  2. Ограничения механизма XDTO: Прямая передача типа Chart через XDTO-пакеты часто завершается ошибкой, так как сериализатор платформы не всегда может однозначно сопоставить сложный составной объект диаграммы между различными версиями и сборками платформ.
  3. Внутренний формат табличного документа: Если табличный документ содержит внедренную диаграмму СКД, упаковка документа целиком в ХранилищеЗначения передает внутреннее бинарное представление объекта, которое мобильный клиент не всегда может корректно прочитать.

Базовый механизм: передача табличного документа через ХранилищеЗначения и XDTO

Если требуется передать стандартный табличный отчет (таблицу), наилучшим решением является сериализация объекта ТабличныйДокумент в XML с последующей упаковкой или прямая работа со строкой XML через ЗаписьXML и СериализаторXDTO.

Посмотрим на корректную реализацию сериализации и десериализации на стороне сервера и клиента.

1. Код веб-сервиса на стороне сервера:


Функция ПолучитьОтчет(Отбор) Экспорт

    ОтчетОбъект = Отчеты.СчетаНаОплату.Создать();
    ТабличныйДок = Новый ТабличныйДокумент;
    ОтчетОбъект.СкомпоноватьРезультат(ТабличныйДок);

    // Сериализуем табличный документ в строку XML
    СтрокаXML = СериализоватьОбъект(ТабличныйДок);
    
    // Возвращаем упакованное хранилище значения со сжатием
    Возврат Новый ХранилищеЗначения(СтрокаXML, Новый СжатиеДанных(9));

КонецФункции

Функция СериализоватьОбъект(ОбъектСериализации)

    ДеревоXDTO = СериализаторXDTO.ЗаписатьXDTO(ОбъектСериализации);
    
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку(); // Обязательно инициализируем запись в строку
    ФабрикаXDTO.ЗаписатьXML(Запись, ДеревоXDTO);
    
    Возврат Запись.Закрыть();

КонецФункции

2. Получение и обработка данных на клиенте:


&НаСервере
Процедура СформироватьОтчетНаСервере()

    Попытка
        ВСОпределение = Новый WSОпределения("http://server/base/ws/DataTransfer?wsdl");
        ВСПрокси = Новый WSПрокси(ВСОпределение, "DataTransfer", "ОбменДанными", "ОбменДаннымиSoap");
        
        ДанныеXDTO = ВСОпределение.ФабрикаXDTO.Создать(ВСПрокси.ТочкаПодключения.Интерфейс.Операции.Получить("ПолучитьОтчет").Параметры.Получить("Отбор").Тип, "");
        
        // Получаем хранилище значения из веб-сервиса
        ХранилищеОтвет = ВСПрокси.ПолучитьОтчет(ДанныеXDTO);
        
        Если ХранилищеОтвет <> Неопределено Тогда
            СтрокаXML = ХранилищеОтвет.Получить();
            ТабличныйДокумент = ДесериализоватьОбъект(СтрокаXML);
        КонецЕсли;
        
    Исключение
        Сообщить("Ошибка при получении отчета: " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

&НаСервере
Функция ДесериализоватьОбъект(СтрокаXML)

    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(СтрокаXML);
    
    Результат = СериализаторXDTO.ПрочитатьXML(Чтение);
    Чтение.Закрыть();
    
    Возврат Результат;

КонецФункции

Способ 1. Получение диаграммы в виде картинки на сервере и передача двоичных данных

Если отчет содержит сложную диаграмму, самый надежный и нетребовательный к ресурсам планшета вариант — сформировать изображение диаграммы на сервере и передать его клиенту в виде двоичных данных (тип base64Binary).

Разберем алгоритм реализации:

  1. На сервере формируем отчет в ТабличныйДокумент.
  2. Находим в коллекции ТабличныйДокумент.Рисунки объект диаграммы или формируем отдельный объект Диаграмма.
  3. Вызываем метод ПолучитьКартинку() для сохранения графического представления в формате PNG или JPEG.
  4. Передаем ДвоичныеДанные картинки через веб-сервис и выводим их на форму в элемент управления с типом Картинка.

// Серверная функция веб-сервиса
Функция ПолучитьДиаграммуКартинкой() Экспорт

    ТабДок = Новый ТабличныйДокумент;
    ОтчетОбъект = Отчеты.ПродажиГрафик.Создать();
    ОтчетОбъект.СкомпоноватьРезультат(ТабДок);

    // Извлекаем диаграмму из рисунков табличного документа
    Для Каждого Рисунок Из ТабДок.Рисунки Цикл
        Если ТипЗнч(Рисунок.Объект) = Тип("Диаграмма") Тогда
            КартинкаДиаграммы = Рисунок.Объект.ПолучитьКартинку();
            Возврат КартинкаДиаграммы.ПолучитьДвоичныеДанные();
        КонецЕсли;
    КонецЦикла;

    Возврат Неопределено;

КонецФункции

На мобильном клиенте полученные ДвоичныеДанные помещаются в реквизит формы с типом Строка (навигационная ссылка во временном хранилище) или преобразуются в объект Картинка:


&НаКлиенте
Процедура ОтобразитьГрафик(ДвоичныеДанныеКартинки)

    АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
    Элементы.ПолеКартинкиДиаграмма.Картинка = Новый Картинка(ДвоичныеДанныеКартинки);

КонецПроцедуры

Способ 2. Передача исходных данных и программное построение диаграммы на клиенте

Если требуется сохранить интерактивность (всплывающие подсказки, масштабирование, выделение серий), рекомендуется передавать с сервера не визуальный объект, а «сырые» данные (массив структур или JSON), после чего программно заполнять элемент формы ПолеДиаграммы непосредственно в мобильном приложении.

Посмотрим на пример заполнения диаграммы на клиенте:


&НаКлиенте
Процедура ЗаполнитьДиаграммуПоДанным(МассивТочек, МассивСерий, ТаблицаЗначенийДанных)

    ДиаграммаЭлемент = Элементы.ДиаграммаОтчета;
    ДиаграммаЭлемент.Обновление = Ложь; // Отключаем перерисовку на время заполнения
    
    ДиаграммаЭлемент.Очистить();
    ДиаграммаЭлемент.ТипДиаграммы = ТипДиаграммы.Гистограмма;

    // Заполнение точек и серий
    Для Каждого Стр Из ТаблицаЗначенийДанных Цикл
        Точка = ДиаграммаЭлемент.УстановитьТочку(Стр.Период);
        Серия = ДиаграммаЭлемент.УстановитьСерию(Стр.Подразделение);
        ДиаграммаЭлемент.УстановитьЗначение(Точка, Серия, Стр.Сумма);
    КонецЦикла;

    ДиаграммаЭлемент.Обновление = Истина;

КонецПроцедуры

Способ 3. Передача табличного документа через промежуточный файл MXL

Если требуется сохранить оригинальное форматирование табличного документа со всеми ячейками и расшифровками, можно использовать сохранение в поток или временный файл формата MXL:

  1. На сервере сохраняем документ методом ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.MXL).
  2. Считываем файл в объект ДвоичныеДанные и передаем его через веб-сервис (тип base64Binary).
  3. На мобильном клиенте сохраняем полученные данные во временный файл и вызываем ТабличныйДокумент.Прочитать(ИмяФайла).

// На стороне мобильного клиента
ИмяФайла = ПолучитьИмяВременногоФайла("mxl");
ДвоичныеДанныеОтвета.Записать(ИмяФайла);

Элементы.ПолеТабличногоДокумента.Прочитать(ИмяФайла);
УдалитьФайлы(ИмяФайла);

Способ 4. Отображение через Поле HTML-документа

Современным и гибким подходом для мобильных приложений 1С является формирование графика с помощью JavaScript-библиотек (например, Chart.js или CanvasJS) внутри элемента формы Поле HTML документа:

Рекомендации по выбору решения

Подведем итоги выбора технологии передачи графиков:

  1. Для статичных диаграмм и печатных форм используем передачу в виде картинки (PNG/JPEG) через ДвоичныеДанные — это исключает любые ошибки несовместимости платформ.
  2. Для стандартных табличных отчетов применяем упаковку строки XML в ХранилищеЗначения со сжатием.
  3. Для динамических и интерактивных графиков передаем массив данных в формате JSON или XDTO-структуры и заполняем Поле диаграммы либо Поле HTML документа программно на стороне мобильного клиента.
← На главную