При разработке мобильных приложений на платформе 1С программисты часто сталкиваются с проблемой: отчет с диаграммой, который прекрасно открывается на стационарном компьютере, вызывает критическую ошибку при попытке отображения на планшете или смартфоне. Разберем, почему это происходит и как правильно организовать передачу графических данных через Web-сервис.
Основная проблема кроется в механизме сериализации XDTO. Когда мы передаем объект ТабличныйДокумент, содержащий диаграмму, сервер генерирует XML-описание этого документа. В этом описании используются перечисления для свойств диаграммы, такие как ChartColorPalette (палитра цветов) или ChartMarkerType (тип маркера).
Мобильная платформа имеет упрощенную встроенную фабрику XDTO. Если сервер работает на более новой версии платформы, он может передать значения (например, soft или auto), которые мобильный клиент просто «не знает», так как они отсутствуют в его жестко заданной схеме v8ui. В результате метод СериализаторXDTO.ПрочитатьXDTO() на стороне клиента выдает ошибку парсинга, и документ не загружается.
Чтобы полностью обойти ограничения XDTO-пакетов, мы можем перехватить диаграмму на сервере, превратить ее в статичное изображение и передать клиенту уже как картинку. Рассмотрим, как это реализовать программно.
В модуле Web-сервиса, перед тем как возвращать документ, нам нужно найти в нем все диаграммы и заменить их объектами типа Картинка. Проанализируем пример кода:
Функция ПолучитьОтчет(Отбор) Экспорт
ОтчетОбъект = Отчеты.Отчет1.Создать();
ТабличныйДок = Новый ТабличныйДокумент;
ОтчетОбъект.СкомпоноватьРезультат(ТабличныйДок);
// Проходим по всем рисункам в документе
Для Каждого Рисунок Из ТабличныйДок.Рисунки Цикл
Если ТипЗнч(Рисунок.Объект) = Тип("Диаграмма") Тогда
// Получаем изображение диаграммы
КартинкаДиаграммы = Рисунок.Объект.ПолучитьКартинку();
// Заменяем объект диаграммы на картинку
Рисунок.Картинка = КартинкаДиаграммы;
КонецЕсли;
КонецЦикла;
Возврат СериализаторXDTO.ЗаписатьXDTO(ТабличныйДок);
КонецФункции
Этот метод гарантирует, что мобильный клиент получит обычный графический объект, для отрисовки которого не требуются сложные описатели палитр и типов маркеров.
Если нам важно сохранить именно объект Диаграмма (например, для минимальной интерактивности), мы можем попытаться «упростить» его настройки перед отправкой. Выясним, какие свойства чаще всего вызывают конфликты, и приведем их к классическому виду.
Пропишем в коде установку базовых значений:
ПалитраЦветовДиаграммы.Классическая.ТипМаркера в значение Нет.Пример программной подготовки объекта:
Для Каждого Рисунок Из ТабличныйДок.Рисунки Цикл
Если ТипЗнч(Рисунок.Объект) = Тип("Диаграмма") Тогда
Диаграмма = Рисунок.Объект;
Диаграмма.ПалитраЦветов = ПалитраЦветовДиаграммы.Классическая;
// Убираем авто-настройки, которые могут не распознаться
Для Каждого Серия Из Диаграмма.Серии Цикл
Серия.Маркер = ТипМаркераДиаграммы.Нет;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Еще один эффективный вариант — передача отчета в формате HTML. В этом случае 1С сама сформирует корректный HTML-код, где диаграмма будет представлена в виде встроенной картинки. Это позволяет сохранить визуальную идентичность отчета.
Посмотрим на алгоритм действий:
ТабличныйДокумент во временный файл с типом ТипФайлаТабличногоДокумента.HTML.ДвоичныеДанные.HTML-документа.Важно: При использовании этого метода необходимо следить за тем, чтобы картинки корректно встраивались в тело HTML (использовался формат base64 внутри тегов img), иначе клиент их не увидит.
Если ни один из способов с ТабличныйДокумент не подходит из-за производительности, рассмотрим вариант передачи только данных. Мы можем собрать значения для серий и точек диаграммы в массив структур, сериализовать их в JSON и отправить на мобильное устройство. В этом случае объект Диаграмма будет создаваться и заполняться программно уже на самом клиенте. Это исключает любые ошибки XDTO, так как структура данных полностью контролируется разработчиком.
Проанализировав историю изменений платформы, можно заметить, что многие ошибки сериализации v8ui были исправлены в версиях 8.3.12 и выше. Если есть возможность, обновите и серверную часть, и сборку мобильного приложения. Это расширит состав доступных типов в XDTO-пакетах и может решить проблему без внесения изменений в программный код.