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

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

При разработке механизмов длительных операций в 1С программисты часто сталкиваются с ситуацией, когда код, успешно работающий на локальном компьютере, выдает ошибку «Файл не обнаружен» при попытке запуска в фоновом режиме на другом рабочем месте или в клиент-серверном варианте. Рассмотрим подробнее, почему это происходит и как правильно организовать передачу внешней обработки в фоновое задание.

Анализ исходной ситуации и кода

Разберем типичный пример кода, который часто становится источником проблем. В данном случае используется механизм Библиотеки стандартных подсистем (БСП) для запуска процедуры модуля объекта внешней обработки в фоновом режиме. Проанализируем фрагмент кода:


&НаСервере
Функция ВыполнитьФоновоеЗаданиеНаСервере(УникальныйИдентификатор)
    ПараметрыЗапуска = Новый Структура("ТекущийПользователь");
    ПараметрыЗапуска.Вставить("ТекущийПользователь", Пользователи.ТекущийПользователь);
    ПараметрыЗапуска.Вставить("ДатаНачала", Период.ДатаНачала);
    
    НаименованиеЗадания = НСтр("ru = 'Фоновое задание длительной тестовой операции'");
    ВыполняемыйМетод = "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки";
    
    ПараметрыЗадания = Новый Структура;
    // ОШИБКА ЗДЕСЬ: Передается путь к файлу, который может быть локальным для клиента
    ПараметрыЗадания.Вставить("ИмяОбработки", РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла);
    ПараметрыЗадания.Вставить("ИмяМетода", "ПровестиНаСервере");
    ПараметрыЗадания.Вставить("ПараметрыВыполнения", ПараметрыЗапуска);
    ПараметрыЗадания.Вставить("ЭтоВнешняяОбработка", Истина);
    
    ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
    ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
    
    СтруктураФоновогоЗадания = ДлительныеОперации.ВыполнитьВФоне(ВыполняемыйМетод, ПараметрыЗадания, ПараметрыВыполнения);
    Возврат СтруктураФоновогоЗадания;
КонецФункции

Проблема заключается в использовании свойства ИспользуемоеИмяФайла. Если внешняя обработка открыта пользователем с его рабочего стола (например, C:\Users\Admin\Desktop\MyReport.epf), то при передаче этого пути в фоновое задание сервер 1С попытается найти этот файл в своей собственной файловой системе. Естественно, сервер «не видит» диск C: пользователя, что и приводит к ошибке «Файл не обнаружен».

Почему сервер не видит файл клиента?

Выясним причину такого поведения системы. В 1С фоновые задания всегда выполняются на стороне сервера в контексте процесса rphost. Рассмотрим ключевые факторы изоляции:

  1. Разные файловые пространства: Сервер приложений 1С — это отдельный компьютер (или группа серверов). У него нет прямого доступа к локальным дискам клиентских машин.
  2. Права доступа (права учетной записи): Служба сервера 1С (обычно под пользователем USR1CV8) имеет ограниченные права. Она не может подключаться к сетевым дискам, которые «подцеплены» в сессии конкретного пользователя, даже если сервер и клиент находятся в одной сети.
  3. Использование UNC-путей: Даже если файл лежит в сетевой папке, путь типа Z:\Public\File.epf не сработает. Серверу нужен полный сетевой адрес в формате UNC: \\ServerName\Public\File.epf, при этом у пользователя, под которым запущена служба 1С, должны быть права на чтение этой папки.

Способ 1. Использование временного хранилища (Рекомендуемый)

Чтобы фоновое задание гарантированно «увидело» обработку, её нужно передать через базу данных. Рассмотрим алгоритм действий:

  1. На клиенте считываем файл внешней обработки в двоичные данные.
  2. Помещаем эти данные во временное хранилище с помощью функции ПоместитьФайлВоВременноеХранилище().
  3. Передаем полученный адрес хранилища в фоновое задание.
  4. Внутри фонового задания (уже на сервере) извлекаем данные, сохраняем их во временный файл сервера и подключаем через ВнешниеОбработки.Подключить().

Если вы используете БСП, функция ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки может принимать адрес временного хранилища вместо имени файла. Проанализируем правильный подход:


// На стороне клиента перед вызовом сервера
АдресХранилища = ПоместитьФайлВоВременноеХранилище(ИмяФайлаНаКлиенте);

// На стороне сервера в параметрах задания
ПараметрыЗадания.Вставить("ИмяОбработки", АдресХранилища); 
// БСП сама поймет, что это адрес, и корректно подключит обработку

Способ 2. Использование справочника «Дополнительные отчеты и обработки»

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

При использовании БСП в структуру ПараметрыЗадания вместо пути к файлу передается ссылка на элемент справочника в поле ДополнительнаяОбработкаСсылка. В этом случае БСП автоматически экспортирует обработку во временный каталог сервера и запустит её.

Способ 3. Правильная работа с путями к файлам

Если ошибка «Файл не обнаружен» возникает уже внутри самой процедуры ПровестиНаСервере (например, при попытке прочитать лог-файл или загрузить данные), проанализируем следующие правила:

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

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


ЗаписьЖурналаРегистрации("ОтладкаФайла", УровеньЖурналаРегистрации.Информация, , , "Путь к файлу: " + ПолноеИмяФайла);

Это позволит быстро увидеть, что сервер пытается достучаться до клиентского пути C:\Users\..., и исправить логику передачи данных.

Резюме

Подведем итоги. Главная причина ошибки «Файл не обнаружен» в фоновых заданиях — попытка использовать контекст файловой системы пользователя на сервере. Чтобы избежать этой проблемы, необходимо всегда передавать внешние файлы на сервер через временное хранилище или использовать встроенные механизмы БСП по работе с дополнительными обработками. Помните, что фоновое задание — это «изолированный мир», который знает только то, что хранится в базе данных или что ему явно передали в параметрах в виде данных, а не ссылок на файлы.

← На главную