При разработке механизмов автоматизации в 1С:Предприятие 8, особенно в конфигурациях на базе обычных форм (например, УТ 10.3, УПП 1.3), разработчики часто сталкиваются с ситуацией: код, который идеально работает в интерактивном режиме под пользователем, внезапно «ломается» при запуске в фоновом задании. Система выдает ошибку «Метод объекта не обнаружен», хотя метод точно существует, помечен как экспортный и успешно вызывается из других мест. Рассмотрим подробно, почему это происходит и как правильно адаптировать код для работы на сервере. Для изучения самих механизмов выполнения можно воспользоваться готовым примером работы с фоновыми заданиями без применения БСП.
Для начала проанализируем ситуацию: фоновое задание всегда выполняется на стороне сервера. Даже если вы инициируете его из «Толстого клиента», управление передается серверному кластеру 1С. В этот момент выполнение кода переходит в изолированный сеанс, который обладает двумя критическими особенностями:
Как показывает практика и обсуждение в сообществе, наиболее частая причина — использование директив #Если Клиент Тогда (или #If Client Then). В старых типовых конфигурациях многие модули (например, УниверсальныеМеханизмы) проектировались исключительно для работы в интерфейсе. Программисты тех лет часто оборачивали целые блоки кода или даже все содержимое модуля в клиентские директивы. Для массового поиска недоступных на сервере процедур можно использовать инструмент для анализа конфигураций на наличие ошибок вызова экспортных методов.
Посмотрим на пример кода, который вызовет ошибку в фоновом задании:
#Если Клиент Тогда
Процедура ПечатьДокумента(Ссылка) Экспорт
// Код формирования печатной формы
ТабДок = Ссылка.ПолучитьМакет("Макет");
// ...
КонецПроцедуры
#КонецЕсли
Когда этот код загружается сервером для выполнения фонового задания, блок внутри #Если Клиент Тогда игнорируется. В результате попытка вызова УниверсальныеМеханизмы.ПечатьДокумента() приводит к ошибке «Метод объекта не обнаружен», так как серверная часть приложения этот метод «не видит».
Если вы убедились, что внутри кода нет лишних директив препроцессора, необходимо проверить настройки самого общего модуля в дереве метаданных. Перейдем к свойствам модуля и проверим следующие флаги:
Часто фоновое задание «не видит» метод не из-за самой структуры модуля, а из-за того, что внутри этого метода вызываются объекты, недоступные на сервере. В УТ 10.3 печатные формы часто завязаны на работу с деревом макетов или формами выбора принтера. Рассмотрим типичную ошибку при вызове метода ПолучитьДеревоМакетовПечати.
Если внутри процедуры, которую вы вызываете, встречается код открытия формы или вопрос пользователю, система сгенерирует исключение. На сервере недопустимы:
Предупреждение(), Вопрос(), Сообщить() (без указания статуса).ПолучитьФорму() или ОткрытьФорму().ПостроительОтчета, если они инициализируют визуальные настройки интерфейса.Чтобы решить эту проблему, проанализируем код вызываемой процедуры. Если в ней есть интерактивные части, их нужно вынести в отдельные блоки или добавить условие:
Если НЕ НаСервере() Тогда
// Здесь код, который нужен только пользователю
ОткрытьФорму("...");
КонецЕсли;
Если вам нужно программно сформировать PDF из фонового задания, задействуя типовые механизмы, выполним следующие шаги:
УниверсальныеМеханизмы), исключив из нее все упоминания форм и директивы #Если Клиент.Печать в модуле объекта документа.Пример вызова печати на сервере без участия интерфейсных механизмов:
// В фоновом задании
ОбъектДок = СсылкаНаДокумент.ПолучитьОбъект();
ТабДок = ОбъектДок.Печать("СчетЗаказ", 1, Ложь); // Вызываем напрямую метод печати объекта
ПутьКФайлу = КаталогВременныхФайлов() + "print.pdf";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
При работе в фоновом режиме на сервере помните о правах доступа. Сервер 1С обычно запускается под специальной системной учетной записью (например, USR1CV8). Рассмотрим важные моменты:
"C:\Users\Admin\Desktop". На сервере этого пути может не существовать. Используйте функцию КаталогВременныхФайлов().Поскольку фоновое задание нельзя просто «остановить» точкой останова в обычном режиме, выполним следующие действия для поиска ошибки:
-debug в строке запуска службы 1С).Подводя итог: если фоновое задание «не видит» методы, в 99% случаев проблема в контексте компиляции. Либо модуль не помечен как серверный, либо код скрыт директивами препроцессора, либо внутри метода происходит обращение к клиенту, которое сервер не может обработать. Тщательный анализ инструкций #Если и очистка серверного кода от визуальных элементов — ключ к решению задачи.