Почему сохранение большого табличного документа в PDF занимает много времени и как это оптимизировать?

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

При работе с большими объемами данных в 1С часто возникает задача сохранения табличных документов (ТабличныйДокумент) в файл формата PDF. На практике разработчики сталкиваются с тем, что данный процесс может занимать значительное время, причем скорость сохранения существенно различается в зависимости от того, выполняется ли операция на стороне сервера или на клиенте. Давайте разберем, почему это происходит и как можно ускорить процесс.

Анализируем причины замедления

Основная проблема заключается в том, что метод ТабличныйДокумент.Записать при выборе формата PDF выполняет сложную операцию конвертации. В отличие от сохранения в родной формат MXL, где данные просто сериализуются, создание PDF требует «рендеринга» документа: расчета шрифтов, позиционирования элементов, отрисовки графики и сжатия контента. Если замер производительности показывает, что 98% времени тратится именно на метод записи, значит, проблема не в передаче данных, а в вычислительной мощности, затрачиваемой на генерацию файла.

Важные факторы влияния:

  1. Разная среда выполнения: Сервер и клиент используют разные движки для отрисовки PDF. Клиентское приложение 1С зачастую взаимодействует с графической подсистемой Windows или установленными драйверами принтеров, что может быть значительно быстрее, чем фоновый процесс сервера rphost.
  2. Сериализация данных: Использование ПоместитьВоВременноеХранилище подразумевает сериализацию данных. Хотя временное хранилище ускоряет работу с кешем, на очень больших объемах сериализация и последующее чтение данных могут создавать дополнительные задержки.
  3. Формат файла: Формат PDF — это тяжеловесный формат для вывода. Если бизнес-задача допускает использование MXL, стоит рассмотреть переход на него, так как он записывается практически мгновенно.

Методы оптимизации процесса

Для решения проблемы с производительностью рекомендуем придерживаться следующих стратегий:

1. Тестирование с форматом MXL

Первым делом проверим, зависит ли задержка от формата. Выполним тестовое сохранение в файл .mxl вместо .pdf. Если время записи сократится до минимума, значит, основная проблема — это именно конвертер PDF. Если же и в MXL сохранение идет медленно, проблема кроется в самой структуре табличного документа (избыточное количество ячеек, объектов, картинок).

2. Постраничное формирование (Разбиение документа)

Если ТабличныйДокумент содержит сотни или тысячи страниц, не пытайтесь сохранить его целиком. Разделим документ на части:

  1. Сформируем ТабличныйДокумент на сервере.
  2. Разделим его на отдельные страницы или логические блоки.
  3. Поместим каждую часть во временное хранилище.
  4. Выводим пользователю только необходимую страницу, обращаясь к хранилищу.

Пример концепции работы с частями:


// Пример логики разделения документа
Для Каждого Страница Из МассивСтраниц Цикл
    Адрес = ПоместитьВоВременноеХранилище(Страница, УникальныйИдентификатор);
    // Дальнейшая обработка каждой части отдельно
КонецЦикла;

3. Перенос нагрузки на клиент

Если задача позволяет, передадим сформированный объект ТабличныйДокумент в реквизит формы на клиенте. В некоторых случаях клиентская машина справляется с записью PDF быстрее, чем серверный процесс. При этом убедимся, что передача объекта через ВременноеХранилище не становится «бутылочным горлышком» из-за сериализации огромного объема данных.

4. Анализ временного хранилища

Важно помнить, что ВременноеХранилище — это не оперативная память в чистом виде. Платформа 1С может сбрасывать данные на диск при нехватке памяти. Чтобы минимизировать влияние дисковых операций:

Итоговые рекомендации

Чтобы окончательно разобраться с производительностью, выполним следующие действия:

  1. Замерим время записи в MXL. Если результат устроит — используем этот формат как основной для передачи между сервером и клиентом.
  2. Если PDF обязателен, попробуем передать ТабличныйДокумент в реквизит формы и выполнить запись методом ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF) именно на стороне клиента.
  3. Если документ слишком велик (сотни мегабайт), единственный путь — это архитектурное разделение данных на части.

Проанализировав эти подходы, вы сможете подобрать оптимальное решение, исходя из специфики вашей конфигурации и требований к скорости работы.

← На главную