При разработке и подключении внешних печатных форм (ВПФ) разработчики часто сталкиваются с ошибкой: «Не удалось сформировать внешнюю печатную форму! Метод объекта не обнаружен (Печать)». Давайте разберем причину возникновения этой неполадки, рассмотрим правильную структуру модуля внешней обработки и выясним, как корректно вызывать формирование документа.
Проанализируем механику вызова внешних печатных форм платформой 1С. При подключении внешней обработки конфигурация пытается вызвать предопределенный метод формирования печатной формы из модуля объекта обработки. Если имя процедуры задано произвольно (например, ПечатьWord вместо Печать) или метод не объявлен с ключевым словом Экспорт, внешняя обработка не предоставляет платформе публичную точку входа, что и приводит к ошибке Метод объекта не обнаружен (Печать).
Разберем по шагам, как исправить исходный код обработки, чтобы печать заработала корректно:
Печать() Экспорт. Именно к ней обращается типовой механизм печати обычных форм.СсылкаНаОбъект. Если он пустой, дальнейшее формирование прерывается.Посмотрим на исправленный пример точки входа в модуле объекта обработки:
Функция Печать() Экспорт
Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
Возврат Неопределено;
КонецЕсли;
Возврат ПечатьФорма();
КонецФункции
Рассмотрим подробнее реализацию функции ПечатьФорма(), где происходит обращение к макету типа ActiveDocument (MS Word), выборка контактных данных контрагента через запрос и подстановка значений в закладки документа:
Функция ПечатьФорма()
Макет = ЭтотОбъект.ПолучитьМакет("Форма");
MSWord = Макет.Получить();
Попытка
Документ = MSWord.Application.Documents(1);
Документ.Activate();
// Замена параметров в тексте документа
Замена = Документ.Content.Find;
Замена.Execute("[НомерДоговора]", Ложь, Истина, Ложь, , , Истина, , Истина, СокрЛП(СсылкаНаОбъект.НомерДоговора));
Замена = Документ.Content.Find;
Замена.Execute("[ДатаДоговора]", Ложь, Истина, Ложь, , , Истина, , Ложь, СсылкаНаОбъект.ДатаДоговора);
// Заполнение контактной информации по закладке "Таблица3"
MSWord.Bookmarks(СокрЛП("Таблица3")).Select();
Документ.Paragraphs.Add();
Rng = MSWord.Application.Selection.Range;
КонтактнаяИнформация = ПолучитьРеквизиты(СсылкаНаОбъект.Контрагент);
мСтрокаМФакт = "";
мСтрокаМЮр = "";
мСтрокаМТел = "";
Для Каждого Строка Из КонтактнаяИнформация Цикл
Если Строка.Вид = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента Тогда
мСтрокаМФакт = СокрЛП(Строка.Представление);
ИначеЕсли Строка.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента Тогда
мСтрокаМЮр = СокрЛП(Строка.Представление);
ИначеЕсли Строка.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента Тогда
мСтрокаМТел = СокрЛП(Строка.Представление);
КонецЕсли;
КонецЦикла;
Rng.InsertAfter(Строка("Фактический адрес: " + мСтрокаМФакт + ", Юридический адрес: " + мСтрокаМЮр + ", телефон " + мСтрокаМТел));
Rng.InsertParagraphAfter();
// Заполнение банковских реквизитов по закладке "Таблица4"
MSWord.Bookmarks(СокрЛП("Таблица4")).Select();
Документ.Paragraphs.Add();
Rng = MSWord.Application.Selection.Range;
БанковскиеСчета = ПолучитьНомер(СсылкаНаОбъект.Контрагент);
мСтрокаМСчет = "";
мСтрокаМКор = "";
мСтрокаМБик = "";
Для Каждого Строка Из БанковскиеСчета Цикл
мСтрокаМСчет = СокрЛП(Строка.НомерСчета);
мСтрокаМКор = СокрЛП(Строка.КоррСчет);
мСтрокаМБик = СокрЛП(Строка.Код);
КонецЦикла;
Rng.InsertAfter(Строка("р/с: " + мСтрокаМСчет + ", к/с: " + мСтрокаМКор + ", БИК " + мСтрокаМБик));
Rng.InsertParagraphAfter();
MSWord.Application.Visible = Истина;
MSWord.Activate();
Исключение
Сообщить(ОписаниеОшибки());
MSWord.Application.Quit();
MSWord = Неопределено;
КонецПопытки;
Возврат Неопределено;
КонецФункции
Функция ПолучитьРеквизиты(Плательщик)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КонтактнаяИнформация.Объект,
| КонтактнаяИнформация.Тип КАК Тип,
| КонтактнаяИнформация.Вид,
| КонтактнаяИнформация.Представление
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект = &Организация
|УПОРЯДОЧИТЬ ПО
| Тип
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("Организация", Плательщик);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Рассмотрим важные архитектурные различия, если разработка ведется для современных конфигураций на базе Библиотеки стандартных подсистем (БСП):
СведенияОВнешнейОбработке(): модуль объекта обязательно должен содержать регистрационные данные (вид внешней обработки, команды, назначение и версию БСП).Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт. Если обработка со старой сигнатурой Функция Печать() Экспорт подключается в конфигурацию на БСП, платформа также выдаст ошибку о несоответствии или отсутствии метода.ActiveDocument и прямое обращение к COM-объектам MS Office через Application не поддерживаются на серверах под управлением Linux и в веб-клиенте. Если печать в Word необходима, в БСП для команды настраивается вариант вызова ВызовКлиентскогоМетода или ОткрытиеФормы, а сам код запускается строго в контексте клиента под ОС Windows.Исключение важно не только закрывать приложение через Quit(), но и занулять ссылки (MSWord = Неопределено), чтобы процесс WINWORD.EXE не зависал в памяти операционной системы.