Как реализовать выполнение внешней обработки в фоновом режиме и решить проблемы с сохранением файлов

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

Перенос логики из интерактивной формы в фоновое задание — стандартная задача при автоматизации процессов в «1С:Предприятие 8.3». Однако разработчики часто сталкиваются с ситуацией, когда код, успешно работающий «по кнопке», отказывается выполнять свои функции в регламентном задании. Проанализируем основные причины такого поведения и разберем пошагово, как обеспечить корректную работу внешней обработки на стороне сервера.

Различие контекстов выполнения: Клиент и Сервер

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

Рассмотрим типичную ошибку: попытка записи файла по пути C:\Отчеты\. Если на вашем компьютере эта папка создана и доступна вам, это не значит, что служба сервера 1С имеет к ней доступ. Служба работает в изолированном сеансе и часто не обладает правами на запись в корень диска C:\ или в профили пользователей.

Настройка программного интерфейса для фонового выполнения

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


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

Обратите внимание: если установить БезопасныйРежим в значение Истина, платформа заблокирует любые попытки работы с файловой системой, даже если у учетной записи службы есть на это права.

Организация отладки через Журнал регистрации

Главная сложность фоновых заданий — отсутствие интерактивной связи. Команды Сообщить() или Предупреждение() в фоновом задании просто игнорируются. Для анализа ситуации проанализируем использование Журнала регистрации. Это единственный надежный способ «услышать» вашу обработку, когда она работает в фоне.

Добавим в код блок Попытка...Исключение, чтобы фиксировать ошибки:


Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
    Попытка
        СформироватьИЗаписатьОтчет();
    Исключение
        ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
        ЗаписьЖурналаРегистрации("ВнешняяОбработка.ФоновоеЗадание",
            УровеньЖурналаРегистрации.Ошибка, , , 
            "Ошибка при выполнении: " + ТекстОшибки);
    КонецПопытки;
КонецПроцедуры

Выясним причину одной из частых ошибок: использование несуществующих методов. Например, попытка вызвать Каталог.Существует() напрямую приведет к ошибке, так как в 1С работа с файловой системой реализована через объект Файл. Правильный способ проверки существования папки выглядит так:


ПроверкаКаталога = Новый Файл("C:\Отчеты");
Если Не ПроверкаКаталога.Существует() Тогда
    // Логика создания или запись в лог
КонецЕсли;

Особенности записи файлов на сервере

Проанализируем технические нюансы, которые могут мешать сохранению документов:

  1. Сетевые пути: Сервер не видит диски, подключенные как Z:\ или X:\ в сеансе пользователя. Всегда используйте полные UNC-пути вида \\ServerName\ShareFolder\.
  2. Права доступа: Убедитесь, что пользователь USR1CV8 (или тот, под которым запущен сервер 1С) имеет права «Изменение» на целевой каталог.
  3. Виртуальный принтер: При сохранении объекта ТабличныйДокумент в формат XLS или PDF на стороне сервера 1С обращается к настройкам принтера. Если на сервере не установлено ни одного принтера, операция может завершиться ошибкой. Рекомендуем установить любой виртуальный принтер (например, Microsoft Print to PDF) и сделать его доступным для службы сервера.

Работа с временными файлами

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


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

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

← На главную