При переходе на операционные системы семейства Linux (например, Ubuntu Server) многие администраторы и разработчики 1С сталкиваются с проблемой, когда система внезапно начинает запрашивать файлы по путям, характерным для ОС Windows. Ошибка вида "Файл не обнаружен C:\windows\temp\..." при открытии документов, таких как Акт сверки взаиморасчетов, или при попытке печати, является классическим примером нарушения принципов кроссплатформенности. Проанализируем ситуацию: сервер работает под управлением Linux, файловая система не имеет диска C:, но платформа пытается обратиться именно туда.
В этой статье мы подробно разберем причины возникновения такой ошибки, выясним, почему типовая конфигурация может вести себя некорректно, и рассмотрим пошаговые инструкции по устранению данной проблемы.
Самая частая причина — это наличие в конфигурации, расширении или внешней печатной форме «зашитого» пути. Программисты, привыкшие работать только в среде Windows, часто совершают ошибку, конкатенируя строки для получения пути к временному файлу вручную. Вместо использования платформенных механизмов, они пишут что-то вроде "C:\windows\temp\" + ИмяФайла.
Разберем, как это должно выглядеть правильно. В 1С существует универсальный метод ПолучитьИмяВременногоФайла(). Этот метод определяет текущую операционную систему и возвращает корректный путь: для Windows это будет папка временных файлов пользователя или системы, а для Linux — каталог /tmp/.
Проанализируем пример неправильного и правильного кода:
Неправильный код (вызывает ошибку на Linux):
ПутьКФайлу = "C:\windows\temp\my_report.pdf";
ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
Правильный кроссплатформенный код:
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
// Платформа сама вернет /tmp/v8_XXXX.pdf на Linux
ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
Если ошибка возникает в документе Акт сверки взаиморасчетов, в первую очередь необходимо проверить наличие установленных расширений или внешних печатных форм. Как правило, в типовой «1С:Бухгалтерии 3.0» такие ошибки оперативно исправляются вендором, поэтому подозрение падает на локальные доработки.
Для формирования печатных форм, генерации штрихкодов или работы с PDF-файлами 1С часто использует внешние компоненты (Native API или COM). Если внешняя компонента была написана только под Windows и содержит внутренние обращения к C:\windows\temp, она не сможет корректно работать на Ubuntu Server.
Посмотрим на ситуацию с печатью. В современных релизах «1С:Предприятия» для рендеринга документов на стороне сервера Linux часто требуются дополнительные библиотеки. Если они отсутствуют, механизмы платформы могут выдавать нетипичные ошибки путей. Убедитесь, что на сервере установлены следующие пакеты:
libgs (Ghostscript) — необходим для работы с PDF и формирования графических образов документов.ttf-mscorefonts-installer — шрифты Microsoft, без которых верстка печатной формы может «развалиться» или вызвать сбой при обращении к графическим библиотекам.libfontconfig1 и libfreetype6 — библиотеки для работы со шрифтами.Иногда корень проблемы кроется в настройках окружения, в котором запущен процесс сервера rphost. На Linux сервер 1С обычно работает от имени пользователя usr1cv8. Если у этого пользователя не заданы или некорректно определены переменные TMP, TEMP или TMPDIR, платформа в редких случаях может использовать дефолтные значения из кода, ориентированного на Windows.
Рассмотрим, как правильно настроить переменные окружения для службы 1С. Для этого необходимо отредактировать конфигурационный файл службы (обычно это unit-файл в systemd). Добавьте в секцию [Service] явное указание временного каталога:
Environment=TMPDIR=/tmp
После внесения изменений не забудьте выполнить команду systemctl daemon-reload и перезапустить службу сервера 1С. Это гарантирует, что все временные файлы, создаваемые платформой, будут гарантированно отправляться в /tmp.
Если ваш код (или код в расширении) пытается создать объект через Новый COMОбъект, это гарантированно приведет к ошибке на Linux, так как технология COM является специфичной для Windows. Иногда ошибка с путями C:\... является лишь следствием того, что система пытается инициализировать Windows-объект (например, Excel.Application или Scripting.FileSystemObject), который по умолчанию «тянет» за собой настройки путей из реестра Windows, которого в Linux нет.
Выясним, как это исправить: необходимо переписать код, использующий COM, на нативные методы 1С для работы с файлами и таблицами. Например, вместо обращения к файловой системе через FileSystemObject, следует использовать объект Файл и методы работы с ДвоичныеДанные.
Если визуальный осмотр кода расширений не помог, воспользуемся методом отладки на сервере. Для этого выполним следующие шаги:
-debug в параметры запуска службы сервера 1С.Акт сверки взаиморасчетов или нажать кнопку печати.УправлениеПечатью или модуль менеджера акта сверки, внимательно посмотрите, какие параметры передаются в функции работы с файлами.Если точка останова сработала внутри расширения, вы сразу увидите проблему. Если же ошибка возникает в недрах платформы при вызове метода Записать() или Напечатать(), значит, проблема в правах доступа пользователя usr1cv8 к папке /tmp или в отсутствии системных библиотек, о которых мы говорили выше.
Важный нюанс: также стоит проверить права на папку кэша сервера 1С (обычно /home/usr1cv8/.1cv8 или /opt/1cv8/current/conf). Иногда некорректные права на запись во временные подпапки кэша могут интерпретироваться платформой крайне странно, вплоть до выдачи сообщений о несуществующих дисках C:.
Подводя итог, можно сказать, что появление путей C:\windows\temp\ на Linux-сервере — это всегда признак того, что где-то в цепочке вызовов затесался код или компонент, не предназначенный для работы в Unix-среде. Тщательный аудит расширений и правильная настройка переменных окружения TMPDIR решают эту проблему в 99% случаев.