При работе с объёмными печатными формами — например, массовой рассылкой квитанций ЖКУ, реестров или платежных документов — разработчики 1С нередко сталкиваются с проблемой: метод ТабличныйДокумент.Записать() в формат PDF выполняет сохранение крайне долго. Экспорт одного файла на 2000 страниц без иллюстраций может занимать от 8 до 15 минут, а если таких файлов десятки, процесс формирования затягивается на многие часы. Проанализируем, почему возникает эта задержка и как можно существенно ускорить генерацию PDF-файлов.
Процесс сохранения табличного документа в PDF в платформе 1С выполняется в один поток. Основные задержки возникают из-за следующих факторов:
ТабличныйДокумент утилизирует вычислительные ресурсы только одного вычислительного ядра.Наиболее эффективный подход к ускорению — распараллеливание процесса. Если сформировать единый документ на 2000 страниц и записывать его в один поток, сохранение займет около 8 минут. Но если разбить данные на 8 независимых частей по 250 страниц и запустить их обработку параллельно через ФоновыеЗадания, общее время сократится в разы.
Рассмотрим по шагам алгоритм организации многопоточной выгрузки:
ФоновыеЗадания.Выполнить().ТабличныйДокумент и сохраняем его локально во временный PDF-файл.Разберем пример кода для запуска фоновых процессов:
// Процедура-управляющий алгоритм многопоточной выгрузки
Процедура ВыгрузитьКвитанцииВНесколькоПотоков(МассивДанных) Изпользовать
КоличествоПотоков = 8;
РазмерПорции = Цел(МассивДанных.Количество() / КоличествоПотоков);
МассивЗаданий = Новый Массив;
Для НомерПотока = 1 По КоличествоПотоков Цикл
// Формируем порцию данных для текущего потока
НачальныйИндекс = (НомерПотока - 1) * РазмерПорции;
ПараметрыПотока = Новый Структура;
ПараметрыПотока.Вставить("ИмяФайла", "C:\Temp\Export_Part_" + Строка(НомерПотока) + ".pdf");
ПараметрыПотока.Вставить("ИндексНачала", НачальныйИндекс);
ПараметрыПотока.Вставить("Количество", РазмерПорции);
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(ПараметрыПотока);
// Запуск фонового задания в платформе 1С
Задание = ФоновыеЗадания.Выполнить("МодульВыгрузки.СформироватьИСохранитьЧастьPDF", МассивПараметров);
МассивЗаданий.Добавить(Задание);
КонецЦикла;
// Ожидаем завершения всех фоновых заданий
ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);
КонецПроцедуры
Никогда не выполняйте метод ТабличныйДокумент.Записать() напрямую по сетевому пути (UNC-пути) или на медленные сетевые шарды. Сохраняйте файл во временный каталог на локальном SSD-диске сервера с помощью функции ПолучитьИмяВременногоФайла("pdf"), а затем копируйте готовый файл в целевую директорию файловой системой ОС.
ВременныйФайл = ПолучитьИмяВременногоФайла("pdf");
// Быстрая запись на локальный диск
ТабДок.Записать(ВременныйФайл, ТипФайлаТабличногоДокумента.PDF);
// Перемещение файла в целевой сетевой каталог
ПереместитьФайл(ВременныйФайл, ЦелевойСетевойПуть);
Если штатный механизм платформы 1С не обеспечивает требуемой скорости, проанализируем варианты использования специализированных библиотек и внешних компонент:
ТипФайлаТабличногоДокумента.HTML5) выполняется в десятки раз быстрее, чем в PDF. Полученный HTML-файл мгновенно конвертируется в PDF сторонними консольными утилитами (например, Headless Chrome, Puppeteer или wkhtmltopdf) в режиме командной строки.Для ускорения работы штатного алгоритма 1С при формировании табличного документа соблюдайте следующие правила:
ТабДок.АвтоМасштаб = Ложь;
ТабДок.ИмяПринтера = "";
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.КоличествоЭкземпляров = 1;
Применение многопоточной нарезки данных в сочетании с сохранением на локальный SSD позволяет сократить общее время выгрузки печатных форм в PDF в 4–8 раз, успешно укладываясь в строгие временные рамки регламентных процедур.