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