В процессе разработки и внедрения внешних обработок в экосистему 1С с использованием Библиотеки стандартных подсистем (БСП) программисты часто сталкиваются с загадочной проблемой. Внешняя обработка успешно зарегистрирована в справочнике Дополнительные отчеты и обработки, назначена пользователю, расписание настроено, и при нажатии кнопки "Выполнить сейчас" всё отрабатывает без ошибок. Однако при наступлении указанного времени автоматический запуск по расписанию игнорируется, а в Журнале регистрации не появляется вообще никаких записей.
В этой статье мы подробно разберем, почему возникает такое поведение платформы «1С:Предприятие 8.3» в клиент-серверном режиме работы, и по шагам устраним все возможные технические препятствия.
Проанализируем программный интерфейс внешней обработки. Очень часто разработчики объявляют процедуру ВыполнитьКоманду только с одним параметром, как это было принято в старых версиях БСП:
Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт
Если ИдентификаторКоманды = "ВыгрузкаДляСКУД" Тогда
ВыгрузитьДанные();
КонецЕсли;
КонецПроцедуры
При интерактивном запуске через интерфейс (по кнопке "Выполнить сейчас") БСП может вызывать эту процедуру в упрощенном контексте. Однако при автоматическом вызове планировщиком задач регламентное фоновое задание всегда передает два параметра. Если процедура обработки ожидает только один, платформа аварийно завершает выполнение фонового задания еще на этапе инициализации вызова, даже не успев записать ошибку выполнения кода в журнал регистрации.
Рассмотрим правильный вариант объявления процедуры, соответствующий современным стандартам БСП:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
Если ИдентификаторКоманды = "ВыгрузкаДляСКУД" Тогда
ВыгрузитьДанные();
КонецЕсли;
КонецПроцедуры
Даже если параметр ПараметрыВыполнения не используется в вашем коде выгрузки, его наличие в сигнатуре процедуры строго обязательно.
Выясним еще одну неочевидную причину, которая часто блокирует работу расписания. В БСП встроен механизм безопасности, защищающий внешние ресурсы от ложных срабатываний из тестовых копий баз данных. Если информационная база была перенесена на другой сервер, развернута из резервной копии или у нее изменилась строка подключения, БСП автоматически блокирует работу всех регламентных заданий, связанных с интеграцией.
При этом ручной запуск ("Выполнить сейчас") продолжает работать, так как система считает это осознанным действием администратора в текущем сеансе.
Выполним следующие шаги для диагностики и решения:
Рассмотрим разницу в контексте выполнения задачи. Когда вы нажимаете кнопку ручного запуска, код выполняется в контексте вашего текущего сеанса (или фонового задания, запущенного под вашей учетной записью). Если обработка записывает файлы на диск (например, выгружает данные в сетевую папку), операция проходит успешно, так как у вашей учетной записи Windows есть права на эту папку.
Когда задание стартует автоматически по расписанию, оно выполняется под управлением службы сервера 1С:Предприятие. По умолчанию эта служба работает от имени системного пользователя usr1cv8.
Проанализируем важные правила настройки путей для серверного выполнения:
Z:\SKUD_Data\export.xml не будут работать по расписанию, так как у службы сервера 1С не примонтированы сетевые диски пользователей. Используйте только сетевые UNC-пути, например: \\ServerName\SKUD_Data\export.xml.usr1cv8 (или той учетной записи, от имени которой запущена служба 1C:Enterprise 8.3 Server Agent) права на Чтение и Запись.Начиная с версии платформы 8.3.9, в 1С реализован механизм защиты от выполнения потенциально опасного кода, содержащегося во внешних отчетах и обработках. При автоматическом фоновом запуске платформе требуется явное подтверждение безопасности запускаемого файла .epf.
Для устранения этой проблемы выполним настройку прав:
Для крупных серверных инфраструктур радикальным решением является отключение этой защиты на уровне всего кластера серверов 1С. Для этого в конфигурационный файл сервера conf.cfg (обычно расположен в каталоге C:\Program Files\1cv8\conf\) добавляют следующую строку:
DisableUnsafeActionProtection=.*
Посмотрим на код функции регистрации обработки из примера автора:
П = ДополнительныеОтчетыИОбработки.SведенияОВнешнейОбработке("");
Передача пустой строки в качестве параметра версии БСП заставляет систему инициализировать параметры совместимости по умолчанию. Это может приводить к тому, что БСП некорректно генерирует метаданные для планировщика задач СУБД. Рекомендуется явно указывать версию БСП, которая используется в вашей конфигурации. Например, для ЗУП 3.1 это может быть версия "3.0.1.1":
П = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.0.1.1");
Чтобы локализовать проблему и понять, запускается ли вообще само регламентное задание по расписанию, временно упростим код обработки до минимума. Мы уберем весь сложный функционал выгрузки файлов и добавим прямую запись в Журнал регистрации. Это позволит нам однозначно понять, срабатывает ли триггер планировщика.
Заменим процедуру выгрузки в модуле обработки на следующий код:
Процедура ВыгрузитьДанные()
ЗаписьЖурналаРегистрации(
"ТестВнешнейОбработки",
УровеньЖурналаРегистрации.Информация,
,
,
"Регламентное задание внешней обработки успешно сработало по расписанию!"
);
КонецПроцедуры
После этого обновим внешнюю обработку в справочнике БСП и настроим расписание на запуск каждые 2 минуты. Если через 2-4 минуты в Журнале регистрации появится запись с событием "ТестВнешнейОбработки", значит планировщик платформы и БСП работают корректно. В таком случае проблему следует искать исключительно в правах доступа серверной учетной записи к сетевым папкам или СУБД при выполнении основного кода выгрузки.