При работе с большими объемами данных в 1С часто возникает задача сохранения табличных документов (ТабличныйДокумент) в файл формата PDF. На практике разработчики сталкиваются с тем, что данный процесс может занимать значительное время, причем скорость сохранения существенно различается в зависимости от того, выполняется ли операция на стороне сервера или на клиенте. Давайте разберем, почему это происходит и как можно ускорить процесс.
Основная проблема заключается в том, что метод ТабличныйДокумент.Записать при выборе формата PDF выполняет сложную операцию конвертации. В отличие от сохранения в родной формат MXL, где данные просто сериализуются, создание PDF требует «рендеринга» документа: расчета шрифтов, позиционирования элементов, отрисовки графики и сжатия контента. Если замер производительности показывает, что 98% времени тратится именно на метод записи, значит, проблема не в передаче данных, а в вычислительной мощности, затрачиваемой на генерацию файла.
Важные факторы влияния:
rphost.ПоместитьВоВременноеХранилище подразумевает сериализацию данных. Хотя временное хранилище ускоряет работу с кешем, на очень больших объемах сериализация и последующее чтение данных могут создавать дополнительные задержки.PDF — это тяжеловесный формат для вывода. Если бизнес-задача допускает использование MXL, стоит рассмотреть переход на него, так как он записывается практически мгновенно.Для решения проблемы с производительностью рекомендуем придерживаться следующих стратегий:
Первым делом проверим, зависит ли задержка от формата. Выполним тестовое сохранение в файл .mxl вместо .pdf. Если время записи сократится до минимума, значит, основная проблема — это именно конвертер PDF. Если же и в MXL сохранение идет медленно, проблема кроется в самой структуре табличного документа (избыточное количество ячеек, объектов, картинок).
Если ТабличныйДокумент содержит сотни или тысячи страниц, не пытайтесь сохранить его целиком. Разделим документ на части:
ТабличныйДокумент на сервере.Пример концепции работы с частями:
// Пример логики разделения документа
Для Каждого Страница Из МассивСтраниц Цикл
Адрес = ПоместитьВоВременноеХранилище(Страница, УникальныйИдентификатор);
// Дальнейшая обработка каждой части отдельно
КонецЦикла;
Если задача позволяет, передадим сформированный объект ТабличныйДокумент в реквизит формы на клиенте. В некоторых случаях клиентская машина справляется с записью PDF быстрее, чем серверный процесс. При этом убедимся, что передача объекта через ВременноеХранилище не становится «бутылочным горлышком» из-за сериализации огромного объема данных.
Важно помнить, что ВременноеХранилище — это не оперативная память в чистом виде. Платформа 1С может сбрасывать данные на диск при нехватке памяти. Чтобы минимизировать влияние дисковых операций:
rphost.Чтобы окончательно разобраться с производительностью, выполним следующие действия:
MXL. Если результат устроит — используем этот формат как основной для передачи между сервером и клиентом.ТабличныйДокумент в реквизит формы и выполнить запись методом ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF) именно на стороне клиента.Проанализировав эти подходы, вы сможете подобрать оптимальное решение, исходя из специфики вашей конфигурации и требований к скорости работы.