Почему при сохранении табличного документа 1С в PDF файл получается пустым и как это исправить?

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

В процессе эксплуатации высоконагруженных систем на базе 1С:Предприятие 8.3 часто возникает специфическая проблема: при программном сохранении отчетов или печатных форм в формате PDF результирующий файл оказывается «пустым». В нем могут отображаться рамки таблиц, логотипы или линии (векторная графика), но полностью отсутствует текстовая информация. Особенно часто эта проблема проявляется на современных операционных системах, таких как Windows Server 2022, при массовом формировании документов (от 50 000 документов в сутки).

Рассмотрим подробно причины возникновения этой ошибки и разберем пошаговые методы ее устранения, опираясь на технические особенности взаимодействия платформы 1С с графической подсистемой Windows.

Анализ механизма возникновения ошибки

Проанализируем ситуацию: когда выполняется команда ТабДокумент.Записать(АдресФайла, ТипФайлаТабличногоДокумента.PDF), платформа 1С использует внутренний движок рендеринга, который обращается к системным шрифтам и библиотекам отрисовки (GDI/GDI+). Если в момент формирования файла система не может корректно прочитать дескрипторы шрифтов или достучаться до кэша шрифтов, текстовый слой просто не включается в PDF-контейнер. При этом ошибка на уровне кода 1С не выбрасывается, так как формально файл создается успешно.

Решение 1. Очистка и восстановление кэша шрифтов Windows

Выясним причину, связанную с системным кэшем. Кэш шрифтов Windows живет в специальных файлах во временных директориях сервисного профиля. При интенсивной нагрузке или после некорректного завершения работы сервера (внеплановая перезагрузка) файлы кэша могут повредиться. 1С пытается получить начертание шрифта Arial или Calibri, получает отказ от подсистемы FontCache и выводит пустоту.

Для решения этой проблемы выполним следующие действия:

  1. Остановим службу 1С:Предприятие (ragent).
  2. Остановим системную службу «Служба кэша шрифтов Windows» (FontCache).
  3. Перейдем в каталог %WinDir%\ServiceProfiles\LocalService\AppData\Local\FontCache.
  4. Удалим все файлы с расширением .dat из этой папки.
  5. Очистим файл FNTCACHE.DAT в папке %WinDir%\System32 (если он присутствует).
  6. Запустим службы обратно.

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

Решение 2. Увеличение лимитов GDI-объектов

Разберем ситуацию с ресурсами. Каждый процесс в Windows (в нашем случае это rphost) имеет жесткое ограничение на количество дескрипторов GDI (GDI Objects). По умолчанию этот лимит составляет 10 000 объектов. При массовой печати тысяч документов в одном сеансе 1С может исчерпать этот лимит, что приведет к невозможности отрисовки текста.

Проверим количество GDI-объектов через Диспетчер задач (вкладка «Подробности», колонка «Объекты GDI»). Если значения приближаются к максимуму, необходимо увеличить лимит через реестр:

  1. Откроем редактор реестра (regedit).
  2. Перейдем в ветку: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows.
  3. Найдем параметр GDIProcessHandleQuota.
  4. Установим значение 15000 или 20000 (в десятичной системе).
  5. Перезагрузим сервер для вступления изменений в силу.

Решение 3. Установка шрифтов «Для всех пользователей»

Проанализируем особенности Windows Server 2022. В этой ОС усилена изоляция сессий. Служба 1С работает в «Сессии 0». Если шрифты, используемые в макетах 1С, были установлены обычным копированием в папку Fonts или установлены только для конкретного пользователя-администратора, служба 1С может их «не видеть» под своей учетной записью.

Посмотрим на алгоритм исправления:

  1. Соберите все кастомные шрифты (например, штрих-коды или фирменные гарнитуры), используемые в макетах.
  2. Нажмите правой кнопкой мыши на файл шрифта и выберите пункт «Установить для всех пользователей». Это гарантирует регистрацию шрифта в реестре для всех сессий, включая системные.

Решение 4. Оптимизация работы с временными файлами

При формировании PDF платформа 1С активно использует системную папку Temp. При огромном потоке документов (100 000 в день) папка может переполняться или блокироваться антивирусом. Если 1С не может записать временный файл шрифта для встраивания в PDF, текст пропадет.

Рассмотрим шаги по оптимизации:

Решение 5. Использование альтернативного метода программного сохранения

Если штатный метод Записать() продолжает сбоить из-за особенностей релиза платформы (например, на бажных релизах типа 8.3.17.1549), мы можем применить программный обходной путь. Рассмотрим пример кода, который принудительно устанавливает параметры сохранения:


ТабДок = Новый ТабличныйДокумент;
// ... заполнение табдока ...
ПараметрыПечати = Новый ПараметрыПечатиPDF;
ПараметрыПечати.ВключатьШрифты = Истина; // Гарантирует встраивание шрифтов в контейнер
ПараметрыПечати.КачествоПечати = 300;

Попытка
    ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
Исключение
    ЗаписьЖурналаРегистрации("ОшибкаПечати", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеОписаниеОшибки());
КонецПопытки;

Обратите внимание: в некоторых случаях помогает предварительная установка принтера по умолчанию на сервере. Даже если печать идет «в файл», 1С может обращаться к настройкам дефолтного принтера для определения параметров страницы и разрешения шрифтов. Рекомендуется установить виртуальный принтер (например, Microsoft Print to PDF) в качестве принтера по умолчанию для пользователя службы 1С.

Заключение

Подводя итог, можно сказать, что проблема «пустых PDF» — это комплексный сбой взаимодействия 1С и Windows Server. Наиболее эффективным методом является **комбинация очистки кэша шрифтов и увеличения лимитов GDI**. Если ситуация повторяется ежедневно, лучшим решением станет автоматизация перезапуска рабочих процессов 1С через консоль администрирования или планировщик задач в часы наименьшей активности, что позволит сбрасывать накопленные ошибки графической подсистемы.

← На главную