Перенос логики из интерактивной формы в фоновое задание — стандартная задача при автоматизации процессов в «1С:Предприятие 8.3». Однако разработчики часто сталкиваются с ситуацией, когда код, успешно работающий «по кнопке», отказывается выполнять свои функции в регламентном задании. Проанализируем основные причины такого поведения и разберем пошагово, как обеспечить корректную работу внешней обработки на стороне сервера.
Первое, что мы должны уяснить: фоновое задание всегда выполняется на стороне сервера. Когда вы запускаете обработку интерактивно, часть кода может выполняться на клиенте, имея доступ к вашим локальным дискам, сетевым ресурсам и принтерам. В фоновом режиме выполнение происходит под учетной записью службы сервера 1С (обычно это USR1CV8).
Рассмотрим типичную ошибку: попытка записи файла по пути C:\Отчеты\. Если на вашем компьютере эта папка создана и доступна вам, это не значит, что служба сервера 1С имеет к ней доступ. Служба работает в изолированном сеансе и часто не обладает правами на запись в корень диска C:\ или в профили пользователей.
Для того чтобы внешняя обработка могла запускаться в фоновом режиме через механизм дополнительных отчетов и обработок (БСП), необходимо правильно настроить функцию СведенияОВнешнейОбработке. Важнейшим параметром здесь является способ использования команды. Посмотрим на пример настройки:
Функция СведенияОВнешнейОбработке() Экспорт
КомандыОбработки = Новый ТаблицаЗначений;
КомандыОбработки.Колонки.Добавить("Использование");
КомандыОбработки.Колонки.Добавить("Идентификатор");
// ... другие колонки
НоваяКоманда = КомандыОбработки.Добавить();
// Для фонового выполнения используем ВызовСерверногоМетода
НоваяКоманда.Использование = "ВызовСерверногоМетода";
НоваяКоманда.Идентификатор = "СформироватьФайлыНаДиске";
ПараметрыРегистрации = Новый Структура;
// Безопасный режим должен быть ЛОЖЬ, если нужна работа с файлами
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Команды", КомандыОбработки);
Возврат ПараметрыРегистрации;
КонецФункции
Обратите внимание: если установить БезопасныйРежим в значение Истина, платформа заблокирует любые попытки работы с файловой системой, даже если у учетной записи службы есть на это права.
Главная сложность фоновых заданий — отсутствие интерактивной связи. Команды Сообщить() или Предупреждение() в фоновом задании просто игнорируются. Для анализа ситуации проанализируем использование Журнала регистрации. Это единственный надежный способ «услышать» вашу обработку, когда она работает в фоне.
Добавим в код блок Попытка...Исключение, чтобы фиксировать ошибки:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Попытка
СформироватьИЗаписатьОтчет();
Исключение
ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации("ВнешняяОбработка.ФоновоеЗадание",
УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка при выполнении: " + ТекстОшибки);
КонецПопытки;
КонецПроцедуры
Выясним причину одной из частых ошибок: использование несуществующих методов. Например, попытка вызвать Каталог.Существует() напрямую приведет к ошибке, так как в 1С работа с файловой системой реализована через объект Файл. Правильный способ проверки существования папки выглядит так:
ПроверкаКаталога = Новый Файл("C:\Отчеты");
Если Не ПроверкаКаталога.Существует() Тогда
// Логика создания или запись в лог
КонецЕсли;
Проанализируем технические нюансы, которые могут мешать сохранению документов:
Z:\ или X:\ в сеансе пользователя. Всегда используйте полные UNC-пути вида \\ServerName\ShareFolder\.USR1CV8 (или тот, под которым запущен сервер 1С) имеет права «Изменение» на целевой каталог.ТабличныйДокумент в формат XLS или PDF на стороне сервера 1С обращается к настройкам принтера. Если на сервере не установлено ни одного принтера, операция может завершиться ошибкой. Рекомендуем установить любой виртуальный принтер (например, Microsoft Print to PDF) и сделать его доступным для службы сервера.Если файл требуется создать лишь временно для последующей отправки (например, по почте), лучше не привязываться к конкретным путям на диске C:. Проанализируем использование функции ПолучитьИмяВременногоФайла(). Она гарантирует, что файл будет создан в системной временной папке, к которой у сервера 1С точно есть права доступа.
ИмяФайла = ПолучитьИмяВременногоФайла("xls");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);
// Далее файл можно поместить в ХранилищеЗначения или отправить письмом
Подводя итог, можно сказать: для успешного выполнения внешней обработки в фоне необходимо вынести логику в модуль объекта, обеспечить права доступа для серверной учетной записи, отказаться от интерактивных методов взаимодействия и использовать Журнал регистрации для контроля ошибок.