Как вызывать процедуры управляемой формы извне и решить ошибку «Метод объекта не обнаружен» во внешней печатной форме

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью тесного взаимодействия между различными объектами системы. Типичный пример — вызов процедур и функций управляемой формы из внешней обработки или программное формирование внешних печатных форм (ВПФ). На первый взгляд задачи кажутся тривиальными, но на практике разработчики регулярно натыкаются на ошибки компиляции, контекстные ограничения и сообщения вида «Метод объекта не обнаружен». В этой статье мы подробно разберем по шагам, почему возникают эти проблемы, как правильно организовать вызовы процедур формы извне и как штатно работать с внешними печатными формами в рамках Библиотеки стандартных подсистем (БСП).

Часть 1. Вызов процедур управляемой формы из внешней обработки

Представим ситуацию: мы получили форму некоторого объекта на клиенте, открыли ее и теперь хотим программно запустить одну из процедур, расположенных в ее модуле. Например, мы хотим инициировать заполнение реквизитов по умолчанию или выполнить промежуточный расчет.

Выясним причину, почему при попытке вызвать метод формы из внешней обработки система может выдать ошибку Метод объекта не обнаружен, даже если этот метод физически присутствует в коде формы.

Для успешного вызова процедуры управляемой формы из внешнего кода должны соблюдаться два важнейших условия:

  1. Наличие ключевого слова Экспорт: Любой метод (процедура или функция), к которому планируется обращаться извне, обязательно должен быть объявлен с ключевым словом Экспорт. Без этого директива видимости метода будет ограничена исключительно самим модулем формы.
  2. Контекст компиляции (&НаКлиенте / &НаСервере): Это ключевой момент работы управляемого приложения. Форма как интерактивный объект создается и существует на стороне клиента. Соответственно, из внешнего кода на клиенте мы можем вызвать только те экспортные методы формы, которые скомпилированы с директивой &НаКлиенте.

Проанализируем ситуацию на примере. Пусть в модуле управляемой формы документа объявлена следующая процедура:


&НаКлиенте
Процедура ЗаполнитьРеквизитыНаКлиенте() Экспорт
    // Логика заполнения на клиенте
    ЗаполнитьРеквизитыНаСервере();
КонецПроцедуры

Такой метод мы сможем без проблем вызвать из нашей внешней обработки после получения формы на клиенте:


ПараметрыФормы = Новый Структура;
ФормаДокумента = ПолучитьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента", ПараметрыФормы);
ФормаДокумента.Открыть();
// Успешный вызов клиентского экспортного метода
ФормаДокумента.ЗаполнитьРеквизитыНаКлиенте();

А теперь рассмотрим подробнее, что произойдет, если процедура в форме объявлена с директивой &НаСервере:


&НаСервере
Процедура ЗаполнитьСчетамиПоУмолчаниюНаСервере() Экспорт
    // Серверная логика заполнения реквизитов формы
КонецПроцедуры

Попытка вызвать метод ФормаДокумента.ЗаполнитьСчетамиПоУмолчаниюНаСервере() из клиентского кода внешней обработки неизбежно приведет к ошибке Метод объекта не обнаружен. Платформа не позволяет напрямую обращаться к серверным методам формы с клиента из внешнего контекста, даже если они объявлены как экспортные. Напрямую вызывать серверные методы формы может только сам клиентский контекст этой же формы.

Рефакторинг и архитектурные правила

Хотя добавление ключевого слова Экспорт к клиентским процедурам формы решает сиюминутную задачу, такое решение часто является полумерой и признаком неоптимальной архитектуры. Давайте разберем, почему.

Модуль формы в концепции управляемого приложения предназначен исключительно для управления элементами интерфейса, визуализации данных и первичной обработки действий пользователя. Бизнес-логика (расчеты, заполнение табличных частей, проведение) не должна размещаться в форме. Если вам требуется регулярно вызывать алгоритм заполнения из различных мест (из других документов, внешних обработок, фоновых заданий), этот алгоритм необходимо перенести:

  1. В модуль менеджера соответствующего прикладного объекта.
  2. В модуль объекта (к которому из формы можно обратиться через преобразование РеквизитФормыВЗначение).
  3. В специализированный общий модуль (с установленными свойствами "Сервер" и "Вызов сервера" при необходимости).

Такой подход обеспечит чистоту кода, его повторное использование и полное отсутствие проблем с доступностью методов из внешних обработок.

Часть 2. Почему возникает ошибка «Метод объекта не обнаружен» при печати внешней формы

Перейдем ко второму вопросу, который часто ставит в тупик разработчиков. Мы пытаемся программно распечатать внешнюю печатную форму (ВПФ). Для этого получаем объект обработки из справочника ДополнительныеОтчетыИОбработки, обращаемся к экспортному методу Печать модуля объекта, но получаем ошибку:

«Метод объекта не обнаружен (Печать)», хотя мы абсолютно уверены, что процедура Печать объявлена в модуле объекта внешней обработки и помечена словом Экспорт.

Давайте выясним основные причины такого поведения платформы 1С:

1. Скрытая ошибка компиляции модуля объекта

Это самая распространенная и неочевидная причина. Когда мы программно получаем объект внешней обработки через метод БСП ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(), платформа пытается скомпилировать весь модуль объекта этой обработки. Если в коде модуля присутствует хотя бы одна синтаксическая ошибка (например, пропущена точка с запятой, неправильно написана директива, идет обращение к несуществующему методу или переменной), компиляция аварийно завершается.

При этом платформа не останавливает выполнение основного кода и не выводит понятное сообщение об ошибке синтаксиса в модуле обработки. Вместо этого объект создается в "урезанном" виде — его модуль просто не загружается в память. Как результат, при попытке вызвать экспортный метод Печать() система сообщает, что метод объекта не обнаружен.

Как решить эту проблему? Откройте файл внешней печатной формы в конфигураторе. Нажмите клавиши Ctrl + F7 (или выберите меню "Отладка" -> "Синтаксический контроль"). В появившемся окне настроек обязательно отметьте флажками "Сервер", "Тонкий клиент" и "Вызов сервера". Исправьте абсолютно все предупреждения и ошибки компиляции, сохраните обработку и обновите ее в справочнике информационной базы.

2. Ограничения безопасного режима выполнения

По умолчанию все внешние обработки и печатные формы регистрируются в БСП в безопасном режиме (свойство БезопасныйРежим = Истина). В этом режиме накладываются жесткие ограничения на использование некоторых системных методов, работу с файловой системой, COM-объектами и привилегированным кодом. Если при компиляции или инициализации модуля обработки происходит обращение к запрещенному функционалу, загрузка модуля прерывается. Это также приводит к потере видимости экспортных методов модуля объекта.

Решение: Временно переведите карточку внешней печатной формы в справочнике "Дополнительные отчеты и обработки" в небезопасный режим (или настройте необходимые разрешения в профиле безопасности) и проверьте работоспособность вызова.

3. Неверное количество параметров при вызове

Стандартный интерфейс БСП для печатных форм строго регламентирует сигнатуру процедуры Печать. Она должна принимать ровно четыре параметра:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

Если вы пытаетесь вызвать этот метод без передачи параметров (например, просто ВПФОбъект.Печать()) или передаете неверное их количество, платформа 1С может интерпретировать этот вызов некорректно и выдать ошибку отсутствия метода вместо ошибки несоответствия количества параметров.

Штатное программное формирование печатной формы по стандартам БСП

Вместо того чтобы вручную конструировать вызовы, получать объект обработки и пытаться эмулировать контекст выполнения, Библиотека стандартных подсистем предоставляет готовый, надежный и безопасный инструмент для программной печати — метод ПечатьПоВнешнемуИсточнику общего модуля УправлениеПечатью.

Давайте разберем по шагам, как правильно использовать этот механизм в своем коде. Это исключит любые проблемы с контекстом компиляции, безопасным режимом и неверным составом параметров.


// Шаг 1. Находим ссылку на элемент справочника дополнительных обработок
СсылкаНаВПФ = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Квитанция (ЖКХ) нов", Истина);

Если СсылкаНаВПФ.Пустая() Тогда
    ВызватьИсключение "Внешняя печатная форма не найдена в справочнике!";
КонецЕсли;

// Шаг 2. Заполняем параметры источника
ПараметрыИсточника = Новый Структура;
// Указываем идентификатор команды (задается в функции "СведенияОВнешнейОбработке" самой ВПФ)
ПараметрыИсточника.Вставить("ИдентификаторКоманды", "КвитанцияЖКХнов");
// Передаем массив объектов (документов), для которых строится печатная форма
МассивДокументов = Новый Массив;
МассивДокументов.Добавить(СсылкаНаДокумент);
ПараметрыИсточника.Вставить("ОбъектыНазначения", МассивДокументов);

// Шаг 3. Подготавливаем служебные коллекции для БСП
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ПараметрыИсточника.ИдентификаторКоманды);
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();

// Шаг 4. Вызываем встроенный метод БСП, который сам инициализирует ВПФ в правильном режиме
УправлениеПечатью.ПечатьПоВнешнемуИсточнику(
    СсылкаНаВПФ,
    ПараметрыИсточника,
    КоллекцияПечатныхФорм,
    ОбъектыПечати,
    ПараметрыВывода
);

// Шаг 5. Получаем и выводим готовый табличный документ
Если КоллекцияПечатныхФорм.Количество() > 0 Тогда
    СтрокаПечатнойФормы = КоллекцияПечатныхФорм[0];
    ТабличныйДокумент = СтрокаПечатнойФормы.ТабличныйДокумент;
    
    // Теперь мы можем отобразить его пользователю или отправить на печать
    ТабличныйДокумент.Показать("Печать квитанции");
Иначе
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось сформировать печатную форму.");
КонецЕсли;

Используя данный метод, мы доверяем всю работу по созданию экземпляра внешней обработки, проверке ее безопасности и передаче контекста механизмам БСП. Это гарантирует стабильную работу вашей системы при обновлениях платформы и конфигурации.

← На главную