Как выгрузить XLS файл в фоновом задании на сервере 1С без ошибки «Каталог не обнаружен»?

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

Перенос функционала выгрузки отчетов из интерактивного режима (по кнопке пользователем) в автоматический режим (фоновое или регламентное задание) — стандартная задача для оптимизации работы системы. Однако разработчики часто сталкиваются с тем, что код, идеально работающий НаКлиенте, начинает выдавать ошибки при исполнении НаСервере. Самая распространенная из них: «Каталог не обнаружен». Разберем подробно, почему это происходит и как правильно реализовать серверную выгрузку.

Выясняем причину: почему не работают сетевые диски

Проанализируем ситуацию, представленную в исходной теме. У пользователя был подключен сетевой диск R:\, на который успешно записывался файл через клиентскую процедуру. Но как только код был перенесен в фоновое задание, система перестала «видеть» путь. Рассмотрим основные причины этого поведения:

  1. Разные сеансы операционной системы: Сетевые диски (такие как R:\, Z:\) подключаются в контексте конкретного сеанса пользователя Windows. Процесс сервера 1С (обычно это rphost.exe) работает в собственной изолированной сессии под системной учетной записью (например, usr1cv8). Для этой учетной записи диска R:\ просто не существует.
  2. Права учетной записи службы: Даже если вы используете прямой путь, учетная запись, от имени которой запущен сервер 1С, должна иметь физические права доступа на чтение и запись в целевой каталог.
  3. Отсутствие графического интерфейса: Фоновое задание не имеет связи с «рабочим столом» и клиентом, поэтому любые попытки вызвать директиву &НаКлиенте внутри него приводят к ошибке «Метод объекта не обнаружен».

Решение 1: Использование UNC-путей и настройка прав доступа

Вместо использования букв дисков (которые являются лишь «ярлыками» в сессии пользователя), в серверном коде необходимо использовать полные сетевые пути в формате UNC. Рассмотрим пример правильного указания пути:


// Вместо "R:\1C\ТЕСТ.xls" используем:
ПутьКФайлу = "\\ServerName\ShareFolder\1C\ТЕСТ.xls";

Важные шаги по настройке:

  1. Выясните, под каким пользователем запущена служба «Агент сервера 1С:Предприятия». Обычно это локальный пользователь usr1cv8.
  2. Если сетевая папка находится на другом сервере, пользователю usr1cv8 нужно дать права на эту папку. Однако, если usr1cv8 — локальный пользователь, он не сможет пройти авторизацию на другом сервере. В этом случае службу 1С следует запустить под специально созданной доменной учетной записью.
  3. Дайте этой доменной учетной записи полные права (Full Control) на уровне безопасности NTFS и на уровне общего доступа (Sharing) к папке.

Решение 2: Сохранение через временное хранилище

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

1. Фоновое задание формирует файл во временном каталоге сервера:


&НаСервере
Процедура СформироватьФайлФоновымЗаданием(АдресВХранилище)
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xls");
    
    ТабДок = Новый ТабличныйДокумент;
    // Заполняем ТабДок данными...
    
    ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS);
    
    ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
    ПоместитьВоВременноеХранилище(ДвоичныеДанные, АдресВХранилище);
    
    УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры

2. Клиентское приложение периодически проверяет статус задания и, по завершении, забирает файл из хранилища на диск пользователя.

Решение 3: Локальная папка сервера с последующим доступом

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

  1. Создайте на сервере 1С папку, например, C:\Exports\.
  2. В коде фонового задания пропишите путь именно к этой папке.
  3. Настройте общий доступ к этой папке (Share) для пользователей, чтобы они могли забрать файлы по сети.

Пример серверного кода для выгрузки через ПакетОтображаемыхДокументов:


&НаСервере
Процедура СоздатьXLSНаСервере()
    // Создаем объект пакета
    Книга = Новый ПакетОтображаемыхДокументов;
    
    // Создаем табличный документ (лист будущего файла)
    Лист1 = Новый ТабличныйДокумент;
    Лист1.Область("R1C1").Текст = "Пример данных";
    
    // Добавляем лист в пакет
    ЭлементПакета = Книга.Состав.Добавить();
    ЭлементПакета.Данные = ПоместитьВоВременноеХранилище(Лист1);
    ЭлементПакета.Наименование = "Лист1";
    
    // Путь должен быть доступен процессу rphost
    Путь = "C:\1C_Exports\ТЕСТ.xls"; 
    
    Попытка
        Книга.Записать(Путь, ТипФайлаПакетаОтображаемыхДокументов.XLS);
        ЗаписьЖурналаРегистрации("ВыгрузкаXLS", УровеньЖурналаРегистрации.Информация, , , "Файл успешно записан: " + Путь);
    Исключение
        ЗаписьЖурналаРегистрации("ВыгрузкаXLS", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Рекомендации по выбору формата

Разберем подробнее использование форматов при работе на сервере. Объекты ТабличныйДокумент и ПакетОтображаемыхДокументов позволяют записывать файлы в разных форматах.

Важный нюанс: формат XLS (Excel 97) имеет жесткое ограничение в 65536 строк. Если ваш отчет может быть больше, обязательно используйте формат XLSX (ТипФайлаТабличногоДокумента.XLSX). Это современный формат на базе XML, который поддерживается платформой 1С без установленного Microsoft Excel на сервере, что крайне важно для стабильности работы фоновых процессов.

Использование COMОбъект("Excel.Application") на сервере является плохой практикой, так как это требует интерактивной сессии, потребляет много памяти и часто приводит к «зависанию» неубиваемых процессов EXCEL.EXE в диспетчере задач сервера.

Итоги

Для успешной работы фоновой выгрузки мы рекомендуем придерживаться следующих правил:

← На главную