При разработке механизмов длительных операций в 1С программисты часто сталкиваются с ситуацией, когда код, успешно работающий на локальном компьютере, выдает ошибку «Файл не обнаружен» при попытке запуска в фоновом режиме на другом рабочем месте или в клиент-серверном варианте. Рассмотрим подробнее, почему это происходит и как правильно организовать передачу внешней обработки в фоновое задание.
Разберем типичный пример кода, который часто становится источником проблем. В данном случае используется механизм Библиотеки стандартных подсистем (БСП) для запуска процедуры модуля объекта внешней обработки в фоновом режиме. Проанализируем фрагмент кода:
&НаСервере
Функция ВыполнитьФоновоеЗаданиеНаСервере(УникальныйИдентификатор)
ПараметрыЗапуска = Новый Структура("ТекущийПользователь");
ПараметрыЗапуска.Вставить("ТекущийПользователь", Пользователи.ТекущийПользователь);
ПараметрыЗапуска.Вставить("ДатаНачала", Период.ДатаНачала);
НаименованиеЗадания = НСтр("ru = 'Фоновое задание длительной тестовой операции'");
ВыполняемыйМетод = "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки";
ПараметрыЗадания = Новый Структура;
// ОШИБКА ЗДЕСЬ: Передается путь к файлу, который может быть локальным для клиента
ПараметрыЗадания.Вставить("ИмяОбработки", РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла);
ПараметрыЗадания.Вставить("ИмяМетода", "ПровестиНаСервере");
ПараметрыЗадания.Вставить("ПараметрыВыполнения", ПараметрыЗапуска);
ПараметрыЗадания.Вставить("ЭтоВнешняяОбработка", Истина);
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
СтруктураФоновогоЗадания = ДлительныеОперации.ВыполнитьВФоне(ВыполняемыйМетод, ПараметрыЗадания, ПараметрыВыполнения);
Возврат СтруктураФоновогоЗадания;
КонецФункции
Проблема заключается в использовании свойства ИспользуемоеИмяФайла. Если внешняя обработка открыта пользователем с его рабочего стола (например, C:\Users\Admin\Desktop\MyReport.epf), то при передаче этого пути в фоновое задание сервер 1С попытается найти этот файл в своей собственной файловой системе. Естественно, сервер «не видит» диск C: пользователя, что и приводит к ошибке «Файл не обнаружен».
Выясним причину такого поведения системы. В 1С фоновые задания всегда выполняются на стороне сервера в контексте процесса rphost. Рассмотрим ключевые факторы изоляции:
USR1CV8) имеет ограниченные права. Она не может подключаться к сетевым дискам, которые «подцеплены» в сессии конкретного пользователя, даже если сервер и клиент находятся в одной сети.Z:\Public\File.epf не сработает. Серверу нужен полный сетевой адрес в формате UNC: \\ServerName\Public\File.epf, при этом у пользователя, под которым запущена служба 1С, должны быть права на чтение этой папки.Чтобы фоновое задание гарантированно «увидело» обработку, её нужно передать через базу данных. Рассмотрим алгоритм действий:
ПоместитьФайлВоВременноеХранилище().ВнешниеОбработки.Подключить().Если вы используете БСП, функция ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки может принимать адрес временного хранилища вместо имени файла. Проанализируем правильный подход:
// На стороне клиента перед вызовом сервера
АдресХранилища = ПоместитьФайлВоВременноеХранилище(ИмяФайлаНаКлиенте);
// На стороне сервера в параметрах задания
ПараметрыЗадания.Вставить("ИмяОбработки", АдресХранилища);
// БСП сама поймет, что это адрес, и корректно подключит обработку
Этот метод является наиболее надежным для промышленных решений. Вместо того чтобы открывать файл с диска, загрузим его в систему один раз. Разберем преимущества этого подхода:
При использовании БСП в структуру ПараметрыЗадания вместо пути к файлу передается ссылка на элемент справочника в поле ДополнительнаяОбработкаСсылка. В этом случае БСП автоматически экспортирует обработку во временный каталог сервера и запустит её.
Если ошибка «Файл не обнаружен» возникает уже внутри самой процедуры ПровестиНаСервере (например, при попытке прочитать лог-файл или загрузить данные), проанализируем следующие правила:
Используйте функции платформы для работы с путями: Для создания временных файлов всегда используйте ПолучитьИмяВременногоФайла(). Это гарантирует, что файл будет создан в системной временной папке, к которой у сервера 1С точно есть права доступа.
Логируйте пути: Для диагностики ошибки перед вызовом файловых операций полезно записывать в Журнал Регистрации путь, по которому сервер пытается обратиться к файлу. Используйте конструкцию:
ЗаписьЖурналаРегистрации("ОтладкаФайла", УровеньЖурналаРегистрации.Информация, , , "Путь к файлу: " + ПолноеИмяФайла);
Это позволит быстро увидеть, что сервер пытается достучаться до клиентского пути C:\Users\..., и исправить логику передачи данных.
Подведем итоги. Главная причина ошибки «Файл не обнаружен» в фоновых заданиях — попытка использовать контекст файловой системы пользователя на сервере. Чтобы избежать этой проблемы, необходимо всегда передавать внешние файлы на сервер через временное хранилище или использовать встроенные механизмы БСП по работе с дополнительными обработками. Помните, что фоновое задание — это «изолированный мир», который знает только то, что хранится в базе данных или что ему явно передали в параметрах в виде данных, а не ссылок на файлы.