Работа с фоновыми заданиями в среде 1С:Предприятие часто преподносит сюрпризы даже опытным разработчикам. Одной из самых распространенных проблем является ситуация, когда код, успешно работающий «по кнопке» в интерактивном режиме, внезапно выдает ошибку «Метод объекта не обнаружен» при попытке выполнить его в фоне. Особенно часто это происходит при формировании печатных форм и сохранении табличных документов в форматы вроде DOCX или PDF.
В этой статье мы подробно разберем, почему фоновое задание «не видит» экспортные процедуры, как правильно организовать серверную печать и на что обратить внимание при настройке прав доступа и окружения сервера.
Проанализируем типичную ситуацию: у нас есть процедура ПечатьЗаказа, которая объявлена как Экспорт в модуле объекта документа. Однако при вызове из фонового задания система сообщает, что метод не найден. Выясним причину этого поведения.
Фоновые задания всегда выполняются на сервере. Даже если ваша конфигурация использует обычные формы (ОФ) и клиентское приложение запущено в режиме толстого клиента, фоновый процесс не имеет интерфейсной части. Основная ошибка кроется в использовании директив препроцессора в модуле объекта. Рассмотрим пример кода, который приведет к ошибке:
#Если Клиент Тогда
Процедура ПечатьЗаказа(ИмяМакета) Экспорт
// Код формирования печатной формы
КонецПроцедуры
#КонецЕсли
В данном случае, когда фоновое задание (работающее на сервере) пытается обратиться к методу ПечатьЗаказа, оно его «не видит», так как для серверного контекста код внутри блока #Если Клиент Тогда просто не существует. Для решения проблемы необходимо вынести процедуру за пределы клиентских директив или использовать соответствующие серверные блоки:
// Правильное расположение в модуле объекта
Процедура ПечатьЗаказа(ИмяМакета) Экспорт
// Этот код будет доступен и на клиенте, и на сервере (в фоновом задании)
КонецПроцедуры
Важно помнить, что внутри такой процедуры нельзя использовать методы, доступные только на клиенте (например, Предупреждение(), Вопрос() или ОткрытьФорму()), иначе фоновое задание завершится с другой ошибкой.
Разберем архитектурный аспект. Часто разработчики по привычке получают объект документа через Ссылка.ПолучитьОбъект(), чтобы вызвать процедуру печати. В контексте фоновых заданий это неоптимально и потенциально опасно.
Рассмотрим, почему лучше использовать модуль менеджера:
Посмотрим на пример правильной организации вызова печати в фоновом задании:
// В фоновом задании
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Обращаемся к модулю менеджера, не создавая объект
ТабДок = Документы.ЗаказПокупателя.СформироватьПечать(Выборка.Ссылка);
Путь = "C:\Temp\" + Выборка.Номер + ".docx";
ТабДок.Записать(Путь, ТипФайлаТабличногоДокумента.DOCX);
КонецЦикла;
Если метод ПечатьЗаказа нашелся, но ошибка возникает на этапе ТабличныйДокумент.Записать(), проанализируем ситуацию с правами. Фоновое задание исполняется от имени системной учетной записи, под которой запущена служба 1C:Enterprise Server Administration (обычно это USR1CV8).
У этой учетной записи часто нет прав на запись в корень диска C:\ или в папки профилей пользователей. Рассмотрим рекомендации по работе с файлами:
КаталогВременныхФайлов() для получения пути, в который сервер гарантированно может записывать данные.DOCX (для платформы ниже 8.3.6 требовались установленные библиотеки, в современных версиях это работает «из коробки»).Выясним еще одну неочевидную причину сбоев при записи табличного документа. При формировании DOCX или PDF платформа 1С выполняет рендеринг документа. Для этого ей необходимы шрифты, указанные в макете.
Если на сервере (особенно под управлением Linux) отсутствуют шрифты Arial, Times New Roman или Calibri, метод Записать() может отработать некорректно или выдать ошибку. Также некоторые механизмы печати в 1С обращаются к настройкам «принтера по умолчанию». У системной службы принтер может быть не настроен, что иногда приводит к ошибкам позиционирования областей в ТабДок.
Поскольку отладчик не подключается к фоновым заданиям автоматически, разберем шаги для локализации ошибки:
-debug.Сервис — Параметры — Отладка — Подключение. В списке «Автоматическое подключение» установите флажок «Фоновые задания».ЗаписьЖурналаРегистрации(). Оберните проблемный участок в блок Попытка...Исключение и записывайте ОписаниеОшибки() в журнал.Проанализируем пример кода для логирования:
Попытка
ТабличныйДокумент.Записать(ПолныйПуть, ТипФайлаТабличногоДокумента.DOCX);
Исключение
ЗаписьЖурналаРегистрации("ФоноваяПечать", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка при сохранении файла: " + ОписаниеОшибки());
КонецПопытки;
Подводя итог, отметим: решение проблемы «Метод объекта не обнаружен» в 90% случаев заключается в проверке директив компиляции. Оставшиеся 10% приходятся на ошибки прав доступа к каталогам и некорректную инициализацию параметров сеанса, которые в фоновых заданиях могут быть пустыми. Следуя принципам выноса логики в модули менеджера и использования серверного контекста, вы обеспечите стабильную работу системы печати.