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

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

При разработке фоновых заданий, регламентных процедур или логики на стороне сервера часто возникает задача автоматического формирования печатных форм и их сохранения в различных форматах. Метод Записать() объекта ТабличныйДокумент позволяет экспортировать данные в форматы MXL, XLS, XLSX, HTML и PDF. Однако на практике разработчики могут столкнуться с ситуацией, когда выгрузка в MXL или XLSX проходит успешно, а сохранение в PDF или HTML завершается системной ошибкой: «Неверный путь к файлу».

Разберем детально, почему возникает такое поведение, в чем заключается специфика серверного рендеринга PDF в платформе 1С:Предприятие и как гарантированно устранить эту проблему.

Синтаксис и возможности метода Записать для табличного документа

Сначала рассмотрим синтаксис метода выгрузки табличного документа в файл на сервере:


// Пример сохранения табличного документа в фоновом задании или на сервере
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);

Платформа 1С поддерживает различные варианты форматов через системное перечисление ТипФайлаТабличногоДокумента:

  1. PDF — стандартный формат документа PDF;
  2. PDF_A_1, PDF_A_2, PDF_A_3 — форматы стандарта долгосрочного архивного хранения PDF/A;
  3. MXL — собственный формат табличных документов 1С;
  4. XLSX, XLS95 — форматы электронных таблиц (при этом формат XLS95 на сервере не поддерживается).

В чем причина ошибки «Неверный путь к файлу» для PDF?

Проанализируем разницу в механизмах сохранения различных форматов. Когда 1С сохраняет документ в MXL или XLSX, платформа напрямую сериализует структуру данных и записывает ее в целевой файл на диске. Для этого процесса требуются только права на целевую директорию.

Формирование документов в форматах PDF и HTML работает принципиально иначе. Для генерации PDF платформе требуется полноценный рендеринг документа, включающий:

  1. Обращение к шрифтовым библиотекам операционной системы;
  2. Инициализацию графической подсистемы отрисовки;
  3. Работу с переменными окружения %TEMP%, %TMP% и %LOCALAPPDATA% учетной записи, от которой запущен рабочий процесс rphost (или служба сервера 1С ragent);
  4. Чтение и запись служебных параметров в ветку системного реестра HKEY_CURRENT_USER.

Если служба сервера 1С запускается от имени выделенной сервисной или доменной учетной записи (например, usr1cv8), под которой ни разу не выполнялся интерактивный вход в Windows, профиль пользователя на сервере остается неинициализированным. Папка C:\Users\<ИмяПользователя> физически отсутствует или создана не полностью, а переменные среды временных файлов указывают на несуществующие пути. При попытке инициализации движка PDF платформа не может создать внутренние временные файлы и возвращает системную ошибку пути.

Также ошибку могут вызвать не вступившие в силу права доступа. Если сервисная учетная запись была добавлена в группу безопасности с доступом к каталогам без последующего обновления тикета безопасности сессии, процесс не сможет выполнить запись.

Способ 1. Инициализация профиля сервисной учетной записи

Разберем базовое и самое быстрое решение. Чтобы операционная система полностью создала дерево каталогов пользователя, реестр и временные папки, выполним интерактивный вход:

  1. Выясним имя учетной записи, под которой работает служба сервера 1С (в оснастке services.msc в свойствах службы «Агент сервера 1С:Предприятия» на вкладке «Вход в систему»).
  2. Выполним интерактивный вход на сервер (локально или через RDP) под этой сервисной учетной записью.
  3. Дождемся полной загрузки рабочего стола и создания профиля Windows.
  4. Выполним выход из сеанса (Sign out) и перезапустим службу сервера 1С.

После инициализации профиля механизм рендеринга PDF получит доступ к необходимым системным ресурсам, и ошибка исчезнет.

Способ 2. Корректная работа с временными каталогами в коде 1С

Проанализируем правильный подход к генерации путей к файлам на стороне сервера. Никогда не следует жестко прописывать пути к дискам или папкам вручную (например, C:\temp\ или корень диска), так как у службы 1С может не быть прав на произвольные системные каталоги.

Всегда используем системную функцию ПолучитьИмяВременногоФайла(), которая возвращает гарантированно доступный путь в пределах рабочей временной директории процесса:


&НаСервере
Функция СформироватьПечатнуюФормуВPDF(СсылкаНаДокумент)
    
    ТабДок = Новый ТабличныйДокумент;
    
    // Формируем печатную форму штатным методом
    Документы[СсылкаНаДокумент.Метаданные().Имя].Печать(ТабДок, СсылкаНаДокумент);
    
    // Проверяем возможность вывода документа
    Если НЕ ТабДок.Вывод Тогда
        ТабДок.Вывод = Истина;
    КонецЕсли;
    
    // Получаем корректный временный путь для файла PDF
    ПутьКФайлу = ПолучитьИмяВременногоФайла("pdf");
    
    // Сохраняем табличный документ
    ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
    
    // Читаем сформированный файл в двоичные данные
    ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
    
    // Удаляем временный файл после обработки
    УдалитьФайлы(ПутьКФайлу);
    
    Возврат ДвоичныеДанныеФайла;
    
КонецФункции

Ограничения и особенности сохранения в PDF на сервере

Рассмотрим дополнительные нюансы, которые необходимо учитывать при формировании PDF на стороне сервера:

  1. Свойство «Вывод»: Если у табличного документа свойство Вывод установлено в значение Ложь (или у пользователя в правах отключено право на вывод), вызов метода Записать() завершится исключением.
  2. Формат изображений: Платформа не поддерживает сохранение в PDF картинок формата метафайл (WMF/EMF). Все графические элементы должны быть в растровых форматах (PNG, JPEG, BMP).
  3. Штрихкоды на сервере: При серверной генерации невозможно использовать клиентские элементы управления и ActiveX. Штрихкоды должны вставляться в ячейки табличного документа в виде картинок (двоичных данных), сформированных специализированными внешними компонентами или встроенными механизмами БСП.
  4. Особенности серверов на Linux: Если сервер 1С работает под управлением Linux, для формирования PDF обязательно должны быть установлены пакеты базовых шрифтов (например, msttcorefonts) и библиотеки fontconfig и freetype. При их отсутствии печатные формы в PDF могут выгружаться с искаженным текстом или пустыми строками.
← На главную