При настройке и разработке регламентных заданий в платформе 1С:Предприятие разработчики нередко сталкиваются с ситуацией, когда задание завершается аварийно, а в журнале регистрации фиксируется запись вида: «Метод задания не найден: ИмяМодуля:ИмяПроцедуры()». При этом сама экспортная процедура существует в конфигурации, синтаксический контроль проходит успешно, а флаги общего модуля выставлены.
Разберем подробно причины возникновения этой ошибки, рассмотрим типовые скрытые нюансы настройки метаданных и разберем по шагам способы локализации и устранения проблемы.
Самая распространенная причина ошибки — синтаксическая неточность при заполнении реквизита Имя метода в ветке метаданных РегламентныеЗадания. В этом поле должно указываться имя общего модуля и имя экспортной процедуры через точку без дополнительных символов и без круглых скобок на конце.
Проанализируем типичные ошибки ввода:
ДополнительноКТиповойСервер.ЗагрузитьКурсыВалютРегламентнымЗаданием(), платформа воспримет круглые скобки как часть имени процедуры. При попытке перехода по кнопке с лупой среда разработки предложит создать новую процедуру вида ЗагрузитьКурсыВалютРегламентнымЗаданием() ().Правильный формат строки в метаданных: ИмяОбщегоМодуля.ИмяЭкспортнойПроцедуры.
Регламентные и фоновые задания всегда выполняются на стороне сервера в отдельном потоке. Чтобы метод был доступен платформе во время старта фонового задания, общий модуль должен удовлетворять строгим условиям:
Сервер. Если модуль доступен только на клиенте или во внешнем соединении, фоновый процесс сервера его не увидит.Глобальный, пространство имен модуля становится общим, и вызов в формате Модуль.Метод приводит к исключению.Экспорт и не должна быть функцией.Даже если у модуля установлены серверные флаги, тело процедуры или весь модуль могут быть ошибочно ограничены условиями компиляции.
Проверим код на наличие следующих инструкций препроцессора:
#Если Клиент Тогда
// Данный код не скомпилируется на сервере регламентных заданий
Процедура ЗагрузитьКурсыВалютРегламентнымЗаданием() Экспорт
// Логика
КонецПроцедуры
#КонецЕсли
Для корректной работы процедуры регламентного задания она должна компилироваться на сервере без клиентских ограничений (например, без директив #Если ТолстыйКлиентОбычноеПриложение или #Если Клиент).
Если регламентное задание является предопределенным, платформа при первом обновлении конфигурации БД регистрирует его экземпляр во внутренней таблице базы данных. Если в дальнейшем разработчик исправляет опечатку в имени метода в конфигураторе (например, убирает лишние скобки), в уже существующей записи в базе данных может остаться старая ссылка на несуществующий метод.
Разберем, как актуализировать задание в базе:
В клиент-серверном варианте работы кластер серверов (процессы rphost) активно кэширует скомпилированные модули и метаданные. При динамическом обновлении конфигурации (так называемом «демоническом обновлении») рабочий процесс, обслуживающий фоновые задания, может продолжать использовать старую версию модуля, где новая процедура еще отсутствует.
Для устранения проблемы кэширования выполним следующие действия:
1C:Enterprise Server Agent) либо перезапустим рабочие процессы через утилиту администрирования кластера.Чтобы не ожидать срабатывания планировщика по расписанию и оперативно выявить ошибки, проверим запуск метода программно через менеджер фоновых заданий во внешней обработке:
&НаСервере
Процедура ПроверитьЗапускРегламентногоЗаданияНаСервере()
ИмяМетода = "ДополнительноКТиповойСервер.ЗагрузитьКурсыВалютРегламентнымЗаданием";
ПараметрыЗадания = Новый Массив;
Попытка
Задание = ФоновыеЗадания.Выполнить(ИмяМетода, ПараметрыЗадания, , "Тестовый запуск метода");
Задание.ОжидатьЗавершения();
Сообщить("Задание успешно выполнено!");
Исключение
ИнформацияОбОшибке = ОписаниеОшибки();
Сообщить("Ошибка при вызове метода: " + ИнформацияОбОшибке);
КонецПопытки;
КонецПроцедуры
Этот способ позволяет сразу перехватить реальное исключение времени выполнения и убедиться, что процедура корректно компилируется и доступна серверному контексту.