Ситуация, когда внешняя обработка идеально работает при ручном запуске («Файл — Открыть» или через кнопку «Выполнить» в дополнительных обработках), но напрочь отказывается исполняться по расписанию, является классической дилеммой при переходе с файловой базы на серверную. В файловом варианте всё выполняется в контексте текущего пользователя Windows, а в серверном — в игру вступают жесткие ограничения прав и изолированные сеансы службы. Разберем по шагам, почему так происходит и как заставить вашу выгрузку работать автоматически.
Первое, на что стоит обратить внимание программисту при использовании Библиотеки Стандартных Подсистем (БСП) — это соответствие экспортных процедур стандартам. В современных версиях БСП процедура ВыполнитьКоманду во внешнем объекте (обработке) должна иметь определенное количество параметров. Если вы указали только один параметр, платформа может просто не вызвать метод, и в Журнале регистрации не останется даже следа от попытки запуска.
Рассмотрим правильный вариант объявления основной процедуры в модуле объекта:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "ФоноваяХХХХ" Тогда
ВыполнитьЗагрузкуДанных();
КонецЕсли;
КонецПроцедуры
Обратите внимание на параметр ПараметрыВыполненияКоманды. Даже если вы его не используете внутри кода, он обязательно должен присутствовать в сигнатуре метода. При отсутствии второго параметра фоновое задание завершится с системной ошибкой несоответствия количества параметров, которую часто трудно отловить без включенной отладки на сервере.
Проанализируем код выгрузки, представленный в вопросе. Автор использует сетевой путь формата \\Comp33\выгрузка\. Это самая распространенная причина сбоев в серверных базах. Когда вы нажимаете кнопку «Выполнить» вручную, 1С работает под вашей учетной записью Windows, которая имеет права доступа к этому сетевому ресурсу. Однако регламентное задание запускается сервером 1С.
Выясним, от чьего имени работает сервер. Обычно это локальный пользователь USR1CV8. По умолчанию этот пользователь «не видит» сеть и другие компьютеры. Для решения этой проблемы мы можем использовать два подхода:
\\Comp33\выгрузка\.C:\Exchange\), а затем файл копировался в сеть с помощью скриптов или других средств автоматизации.Если в Журнале регистрации нет ни одной записи о запуске, возможно, выполнение заданий заблокировано на уровне всей информационной базы. Это часто делают администраторы при обновлении или техническом обслуживании. Разберем, как это проверить:
В серверном режиме 1С не знает, в контексте какого пользователя выполнять код внешней обработки, если это не указано явно. Перейдите в раздел Администрирование — Печатные формы, отчеты и обработки — Дополнительные отчеты и обработки. Откройте вашу обработку и перейдите к настройке расписания. Посмотрите внимательно на поле «Запускать от имени пользователя». Если оно пустое, выберите пользователя с административными правами. Без этой настройки сервер может просто игнорировать задание.
Посмотрим на параметры регистрации в коде автора: ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);. Несмотря на этот программный код, при интерактивном добавлении обработки в справочник система может принудительно включить безопасный режим.
Важно помнить: В безопасном режиме 1С запрещает работу с файловой системой (кроме временных каталогов) и любые внешние вызовы. Обязательно зайдите в карточку дополнительной обработки в интерфейсе «1С:Предприятие» и убедитесь, что галочка «Безопасный режим» снята.
Также стоит проверить настройку «Защита от опасных действий» в Конфигураторе. Для пользователя, под которым запускается фоновое задание, эту защиту рекомендуется отключить, иначе система будет ждать интерактивного подтверждения запуска внешней обработки, которое невозможно в фоновом сеансе.
Если вы всё проверили, но выгрузка по-прежнему не идет, воспользуемся методом принудительного логирования. Обернем основной код в блок Попытка...Исключение. Это позволит нам вытащить текст ошибки из недр сервера в Журнал регистрации.
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Попытка
ЗаписьЖурналаРегистрации("ВнешняяОбработка.Начало", УровеньЖурналаРегистрации.Информационный, , , "Запуск задания " + ИдентификаторКоманды);
Если ИдентификаторКоманды = "ФоноваяХХХХ" Тогда
ФоноваяЗагрузкаДокументов();
КонецЕсли;
ЗаписьЖурналаРегистрации("ВнешняяОбработка.Успех", УровеньЖурналаРегистрации.Информационный, , , "Задание успешно завершено");
Исключение
ТекстОшибки = ИнформацияОбОшибке().Описание;
ЗаписьЖурналаРегистрации("ВнешняяОбработка.Ошибка", УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);
КонецПопытки;
КонецПроцедуры
Проанализируем этот код: мы добавили три точки записи в Журнал регистрации. Если после запуска задания в журнале не появилось даже записи "Начало", значит, проблема в настройках самой 1С (блокировка заданий, отсутствие пользователя или неверная сигнатура процедуры). Если появилась запись "Ошибка" — вы увидите конкретную причину, например: Ошибка доступа к файлу \\Comp33\... или Метод объекта не обнаружен.
В процедуре ФоноваяЗагрузкаДокументов автор обращается к обработке УниверсальныйОбменДаннымиXML. Помните, что эта обработка при работе на сервере ведет себя крайне чувствительно к коду внутри правил обмена. Если в ваших правилах (в обработчиках «Перед выгрузкой», «При выгрузке») есть вызовы клиентских функций, таких как Предупреждение(), Вопрос() или Сообщить(), выполнение на сервере прервется с ошибкой, так как на сервере нет пользовательского интерфейса.
Убедитесь, что пути к файлам правил и файлам обмена внутри кода прописаны корректно и доступны серверу. Вместо ТекущаяДата() в условиях выгрузки лучше использовать ТекущаяДатаСеанса(), чтобы избежать разницы во времени, если сервер находится в другом часовом поясе.
Подводя итог, запуск по расписанию в серверном режиме требует гораздо более строгого отношения к правам доступа и контексту исполнения. Проверьте сигнатуру процедуры, права пользователя службы 1С на сетевые папки и наличие назначенных ответственных в справочнике дополнительных обработок — в 90% случаев решение кроется именно в этих моментах.