При разработке мобильных приложений на платформе 1С:Предприятие программисты часто сталкиваются с неприятной особенностью: метод Записать() для объекта ТабличныйДокумент отлично работает при сохранении в PDF, но выдает визуально искаженные файлы при выборе форматов ТипФайлаТабличногоДокумента.XLSX или XLS. В этой статье мы подробно разберем, почему это происходит, проанализируем технические ограничения мобильной платформы и изучим пошаговые инструкции по обходу этой проблемы.
Для начала проанализируем ситуацию. Когда мы сохраняем ТабличныйДокумент в формат PDF, платформа формирует фиксированную верстку, где каждый символ и линия имеют жесткие координаты. Мобильные просмотрщики (такие как Google Drive PDF Viewer) просто отрисовывают готовую «картинку».
Однако формат XLSX — это по сути архив с набором XML-схем. Мобильная платформа 1С использует упрощенные алгоритмы для генерации этой структуры. Основные причины «кривого» отображения (смещения колонок, пропажи границ, некорректных шрифтов) заключаются в следующем:
Рассмотрим наиболее стабильный вариант, который рекомендуют опытные разработчики. Суть заключается в том, чтобы не заставлять мобильное устройство мучиться с конвертацией в XLSX, а делегировать эту задачу мощному серверу 1С.
Разберем алгоритм действий по шагам:
ТабличныйДокумент с клиента на сервер.Посмотрим на пример кода, реализующего эту схему:
// Код на стороне мобильного клиента
&НаКлиенте
Процедура СохранитьЭкселНаСервере(Команда)
// Получаем табличный документ (например, из реквизита формы)
ТабДок = Объект.ТабличныйДокумент;
// Отправляем на сервер для генерации «правильного» XLSX
АдресФайла = СформироватьФайлНаСервере(ТабДок);
Если ЗначениеЗаполнено(АдресФайла) Тогда
// Получаем данные из хранилища и сохраняем на мобильном устройстве
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайла);
ПутьКФайлу = ФайловаяСистема.ПутьКДокументам() + "report.xlsx";
ДанныеФайла.Записать(ПутьКФайлу);
// Информируем пользователя
ПоказатьОповещениеПользователю("Файл сохранен", , ПутьКФайлу);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция СформироватьФайлНаСервере(Знач ТабДок)
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
// На сервере метод Записать() отработает корректно
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
Данные = Новый ДвоичныеДанные(ИмяФайла);
Адрес = ПоместитьВоВременноеХранилище(Данные);
УдалитьФайлы(ИмяФайла);
Возврат Адрес;
КонецФункции
Этот метод гарантирует, что структура XLSX будет сформирована полноценным движком 1С, который гораздо лучше совместим со стандартами Microsoft Excel.
Проанализируем ситуацию, когда доступ к серверу ограничен или отсутствует. В мобильной платформе 1С формирование HTML реализовано качественнее, чем XLSX. Большинство мобильных офисных приложений умеют открывать HTML-файлы как электронные таблицы.
Попробуем изменить тип файла при сохранении:
ПутьКФайлу = ФайловаяСистема.ПутьКДокументам() + "report.html";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.HTML);
Преимущество: Сетка, цвета и объединения ячеек в HTML сохраняются гораздо точнее. Недостаток: При открытии в WPS Office файл может открыться как веб-страница, а не как таблица, что затруднит дальнейшие расчеты.
Если вам необходимо сохранять файл именно через мобильную платформу, давайте разберем, как минимизировать риск искажений. Выясним, какие элементы чаще всего вызывают «кривизну»:
SansSerif, который в Android гарантированно есть. Это поможет 1С точнее рассчитать ширину колонок.Рассмотрим пример кода для программной «очистки» документа перед сохранением:
Процедура ОчиститьДокументПередСохранением(ТабДок)
// Удаляем все рисунки (картинки, логотипы)
Пока ТабДок.Рисунки.Количество() > 0 Цикл
ТабДок.Рисунки.Удалить(0);
КонецЦикла;
// Сбрасываем закрепление областей
ТабДок.ФиксацияСверху = 0;
ТабДок.ФиксацияСлева = 0;
КонецПроцедуры
Как показывает практика, старый бинарный формат ТипФайлаТабличногоДокумента.XLS (без буквы X в конце) иногда обрабатывается мобильной платформой стабильнее. Это связано с тем, что его структура проще и менее требовательна к описанию пространств имен XML, в которых мобильная 1С иногда допускает ошибки.
Мы выяснили, что проблема «кривого» Excel в мобильной 1С — это следствие упрощенной реализации экспорта в мобильном движке.
Рекомендованная стратегия:
Следуя этим рекомендациям, мы сможем обеспечить пользователям мобильных приложений качественные и читаемые отчеты в формате Excel.