Как передать диаграмму в мобильное приложение через Web-сервис без ошибок XDTO

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

При разработке мобильных приложений на платформе 1С программисты часто сталкиваются с проблемой: отчет с диаграммой, который прекрасно открывается на стационарном компьютере, вызывает критическую ошибку при попытке отображения на планшете или смартфоне. Разберем, почему это происходит и как правильно организовать передачу графических данных через Web-сервис.

Анализируем причину ошибки

Основная проблема кроется в механизме сериализации XDTO. Когда мы передаем объект ТабличныйДокумент, содержащий диаграмму, сервер генерирует XML-описание этого документа. В этом описании используются перечисления для свойств диаграммы, такие как ChartColorPalette (палитра цветов) или ChartMarkerType (тип маркера).

Мобильная платформа имеет упрощенную встроенную фабрику XDTO. Если сервер работает на более новой версии платформы, он может передать значения (например, soft или auto), которые мобильный клиент просто «не знает», так как они отсутствуют в его жестко заданной схеме v8ui. В результате метод СериализаторXDTO.ПрочитатьXDTO() на стороне клиента выдает ошибку парсинга, и документ не загружается.

Способ 1. Преобразование диаграммы в картинку (самый надежный)

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

В модуле Web-сервиса, перед тем как возвращать документ, нам нужно найти в нем все диаграммы и заменить их объектами типа Картинка. Проанализируем пример кода:


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

Этот метод гарантирует, что мобильный клиент получит обычный графический объект, для отрисовки которого не требуются сложные описатели палитр и типов маркеров.

Способ 2. Принудительная очистка настроек оформления

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

Пропишем в коде установку базовых значений:

  1. Палитра цветов: Установим значение ПалитраЦветовДиаграммы.Классическая.
  2. Маркеры: Отключим сложные маркеры, установив ТипМаркера в значение Нет.
  3. Эффекты: Отключим градиенты и тени, которые могут не поддерживаться мобильным движком.

Пример программной подготовки объекта:


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

Способ 3. Использование HTML-представления

Еще один эффективный вариант — передача отчета в формате HTML. В этом случае 1С сама сформирует корректный HTML-код, где диаграмма будет представлена в виде встроенной картинки. Это позволяет сохранить визуальную идентичность отчета.

Посмотрим на алгоритм действий:

  1. На сервере сохраняем ТабличныйДокумент во временный файл с типом ТипФайлаТабличногоДокумента.HTML.
  2. Читаем файл в строку или ДвоичныеДанные.
  3. Передаем строку через Web-сервис.
  4. На клиенте отображаем полученный текст в поле HTML-документа.

Важно: При использовании этого метода необходимо следить за тем, чтобы картинки корректно встраивались в тело HTML (использовался формат base64 внутри тегов img), иначе клиент их не увидит.

Альтернатива: Передача сырых данных через JSON

Если ни один из способов с ТабличныйДокумент не подходит из-за производительности, рассмотрим вариант передачи только данных. Мы можем собрать значения для серий и точек диаграммы в массив структур, сериализовать их в JSON и отправить на мобильное устройство. В этом случае объект Диаграмма будет создаваться и заполняться программно уже на самом клиенте. Это исключает любые ошибки XDTO, так как структура данных полностью контролируется разработчиком.

Рекомендации по обновлению платформы

Проанализировав историю изменений платформы, можно заметить, что многие ошибки сериализации v8ui были исправлены в версиях 8.3.12 и выше. Если есть возможность, обновите и серверную часть, и сборку мобильного приложения. Это расширит состав доступных типов в XDTO-пакетах и может решить проблему без внесения изменений в программный код.

← На главную