Имя: Пароль:
1C
1С v8
Распечатать внешнюю печатную форму из обработки АРМ
0 Серёжа_
программист
 
10.04.18
06:13
Вообщем есть кучка ВПФ, которые подключены к документу ПередачаВАренду. Есть обработка АРММенеджера, из которой клиент хочет  распечатывать эти документы.

В обработке АРММенеджера в командном меню печать, добавил кнопку для печати документа. В обработчике кнопки получил внешнюю обработку из справочника ДополнительныеОтчетыИОбработки и пытаюсь вызвать экспортную процедуру печать. На что получаю ошибку "Метод объекта печать не обнаружен"

Экспортная процедура печать в ВПФ присутствует.

Конфигурация 1с Такси и аренда автомобилей

Код процедуры откуда происходит вызов:

Процедура ПечатьИзВПФ(ИмяВПФ, ПараметрКоманды);
    СсылкаНаВПФ = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(ИмяВПФ);
    Если СсылкаНаВПФ.Пустая() Тогда
        Сообщить("В справочнике 'Внешние обработки' не нашли внешнюю печатную форму с наименованием '"+ИмяВПФ+"'");
        Возврат;
    КонецЕсли;
        
    Попытка
        ИмяВременногоФайла = КаталогВременныхФайлов()+"тмп_впф.epf";
    Исключение
        Сообщить ("Невозможно создать файл обработке в каталоге временных файлов <<"+
        +КаталогВременныхФайлов()+">>. Возможно, не хватает прав доступа в Windows в папку для данного сеанса 1С ");
        Возврат;
    КонецПопытки;    
    
    Попытка
        ДвоичныеДанные = СсылкаНаВПФ.ХранилищеОбработки.Получить();        
        ДвоичныеДанные.Записать(ИмяВременногоФайла);
    Исключение
        Сообщить("Ошибка получения объекта из хранилища обработки");
    КонецПопытки;    
        
    Попытка
        ОбрОбъект = ВнешниеОбработки.Создать(ИмяВременногоФайла);
        ОбрОбъект.Документ = ПараметрКоманды;
    Исключение
        Сообщить("Ошибка создания объекта из временного файла обработки "+ИмяВременногоФайла);
        Возврат;
    КонецПопытки;
    
    // Проба печати
    Попытка
        ТаблДок = ОбрОбъект.Печать();
        ТаблДок.Вывести();
    Исключение
        А=1; // Точка останова для отладки!
        Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке() )); // ВНЕШНЮЮ печатную форму из справончика ВПФ можно спокойно поправить!
    КонецПопытки;    
            
КонецПроцедуры
1 Мимохожий Однако
 
10.04.18
06:18
Экспорт позабыл
2 Серёжа_
программист
 
10.04.18
06:23
(1) Экспорт есть

Вот код процедуры которую необходимо вызвать

Процедура Печать(ИдентификаторКоманды,ОбъектыНазначения) Экспорт

    СсылкаНаОбъект = ОбъектыНазначения[0];
    РеквизитыДокумента = ПолучитьРеквизитыДокумента(СсылкаНаОбъект); //функция получает реквизиты из документа
    
    Макет = ПолучитьМакет(СсылкаНаОбъект); //серверная функция, записывает макет в файл и возвращает полное имя файла

    Попытка
        Шаблон = ПолучитьCOMОбъект(Макет); //инициализируем COM-объект
    Исключение
        КомОбъект = 0;
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = ОписаниеОшибки();
        Сообщение.Сообщить();
        
        Возврат;
    КонецПопытки;  

    Если Шаблон = Неопределено Тогда
        Возврат;
    КонецЕсли;

    //здесь делаем всякие штуки типа заполнения и прочего

    Замена = Шаблон.Content.Find;
    //Заменить заранее определенные ключевые конструкции на требуемый текст.
    Замена.Execute("<НомерДоговора>", Ложь, Истина, Ложь, , , Истина, , Ложь, """" + РеквизитыДокумента.НомерДоговора + """");
    Замена = Шаблон.Content.Find;
    Замена.Execute("<ДатаДоговора>", Ложь, Истина, Ложь, , , Истина, , Ложь, """" + РеквизитыДокумента.ДатаДоговора + """");
    Замена = Шаблон.Content.Find;
    Замена.Execute("<МодельТС>", Ложь, Истина, Ложь, , , Истина, , Ложь, " " + РеквизитыДокумента.МодельТС + " ");
    Замена = Шаблон.Content.Find;
    Замена.Execute("<Марка>", Ложь, Истина, Ложь, , , Истина, , Ложь, " " + РеквизитыДокумента.Марка + " ");
    Замена = Шаблон.Content.Find;
    Замена.Execute("<ГосЗнак>", Ложь, Истина, Ложь, , , Истина, , Ложь, " " + РеквизитыДокумента.ГосЗнак + " ");
    Замена = Шаблон.Content.Find;
    Замена.Execute("<Вин>", Ложь, Истина, Ложь, , , Истина, , Ложь, " " + РеквизитыДокумента.Вин + " ");
    Замена = Шаблон.Content.Find;
    Замена.Execute("<ГодИзготовления>", Ложь, Истина, Ложь, , , Истина, , Ложь, " " + РеквизитыДокумента.ГодИзготовления + " ");
    Замена = Шаблон.Content.Find;
    Замена.Execute("<МодельДВС>", Ложь, Истина, Ложь, , , Истина, , Ложь, " " + РеквизитыДокумента.МодельДВС + " ");    
    Замена = Шаблон.Content.Find;
    Замена.Execute("<НомерДВС>", Ложь, Истина, Ложь, , , Истина, , Ложь, " " + РеквизитыДокумента.НомерДВС + " ");
    Замена = Шаблон.Content.Find;
    Замена.Execute("<ЦветКузова>", Ложь, Истина, Ложь, , , Истина, , Ложь, " " + РеквизитыДокумента.ЦветКузова + " ");
    Замена = Шаблон.Content.Find;
    Замена.Execute("<МощностьДВС>", Ложь, Истина, Ложь, , , Истина, , Ложь, " " + РеквизитыДокумента.МощностьДВС + " ЛС");
    Замена = Шаблон.Content.Find;
    Замена.Execute("<Серия>", Ложь, Истина, Ложь, , , Истина, , Ложь, " " + РеквизитыДокумента.Серия + " ");
    Замена = Шаблон.Content.Find;
    Замена.Execute("<Номер>", Ложь, Истина, Ложь, , , Истина, , Ложь, " " + РеквизитыДокумента.Номер + " ");
    Замена = Шаблон.Content.Find;
    Замена.Execute("<Топливо>", Ложь, Истина, Ложь, , , Истина, , Ложь, " " + РеквизитыДокумента.Топливо + " ");
    Замена = Шаблон.Content.Find;
    Замена.Execute("<ФИОКлиента>", Ложь, Истина, Ложь, , , Истина, , Ложь, "" + РеквизитыДокумента.Контрагент + " ");
    Замена = Шаблон.Content.Find;
    Замена.Execute("<ДатаДоговора>", Ложь, Истина, Ложь, , , Истина, , Ложь, """" + РеквизитыДокумента.ДатаДоговора + """");

    //Конец всяких штук
    
    Шаблон.Fields.UpDate();
    Шаблон.Activate();
    Шаблон.Application.Visible = 1; //указываем, что надо показать юзеру наш COM-объект
    Шаблон.Save(); //записываем изменения

    Шаблон = 0;


КонецПроцедуры
3 Мимохожий Однако
 
10.04.18
06:26
Про это расскажи:
Шаблон = ПолучитьCOMОбъект(Макет);//инициализируем COM-объект
4 Серёжа_
программист
 
10.04.18
06:27
(3) Макет актив документ (Ворд), он инициализируется на сервере, потом функция возвращает путь к файлу и открывает макет на клиенте.
5 Мимохожий Однако
 
10.04.18
06:32
(2) Отладчиком внутрь этой процедуры попадаешь?
6 Мимохожий Однако
 
10.04.18
06:33
Процедуру используешь как функцию. Это любопытно.
7 Серёжа_
программист
 
10.04.18
06:35
(5) Нет, отладчик не залетает в процедуру
8 Серёжа_
программист
 
10.04.18
06:37
(6) Там проблемка в том, что макет можно инициализировать только на сервере, а открывать документ ворд нужно на клиенте, поэтому такие извраты)
9 Мимохожий Однако
 
10.04.18
06:42
ТаблДок = ОбрОбъект.Печать()
Проблема в том, что
1. используешь процедуру как печать.
2. из функции (если переделаешь процедуру) никогда не получишь ТабДок, т.к. используешь актив док
10 Мимохожий Однако
 
10.04.18
06:43
ОбрОбъект Какой тип значения?
11 Серёжа_
программист
 
10.04.18
06:47
(10) В нем лежит внешняя обработка
12 Мимохожий Однако
 
10.04.18
06:51
(11) "Сумлеваюсь я" ©Дед Щукарь
13 Мимохожий Однако
 
10.04.18
06:53
Повторюсь. Не удастся получить табличный документ из файла с Word
14 Серёжа_
программист
 
10.04.18
06:54
15 Серёжа_
программист
 
10.04.18
06:55
(13) Ну это просто переменная так называется из примера. Мне нужно просто выполнить процедуру печать, она открывает документ ворд и производит замену
16 Мимохожий Однако
 
10.04.18
06:57
(15) Так процедура или функция? В каком модуле разместил? Отлаживаешь уже подключенную обработку или в обработке есть форма для отладки? УФ или ОФ?
17 Серёжа_
программист
 
10.04.18
07:04
(16) Процедура. Вообще она размещена в основном модуле формы обработки. Пробовал перемещать в модуль объекта, результат тот же. Её хотябы просто вызвать, а дальше уже можно плясать
18 Серёжа_
программист
 
10.04.18
07:05
(17) Отлаживаю подключенную
19 Серёжа_
программист
 
10.04.18
07:05
УФ
20 Серёжа_
программист
 
10.04.18
07:12
Ну и соответствено ВПФ рабочая, если формировать из документа ПередачаВАренду, то все корректно отрабатывает
21 Мимохожий Однако
 
10.04.18
07:23
Добавь в свою обработку форму для отладки, из которой вызываешь процедуру печати. В инете об этом написано много. На ИС-е посмотри.
Процедуру печати размести в модуле обработки, а не в модуле формы.
При вызове из формы серверной процедуры не забудь про метод Реквизит формы в значение.
22 Серёжа_
программист
 
10.04.18
07:43
(21) Ну я создаю любую тестовую процедуру либо функцию в модуле обработки, подключаю её в справочник внешних обработок. И всеравно не получается ёё вызвать. Не находит метод объекта "ИмяПроцедуры"
23 Мимохожий Однако
 
10.04.18
08:01
Какая БСП используется в твоей конфигурации? Почитай документацию по этой версии.
..
Добавь в свою обработку Форму. В этой форме добавь реквизит СсылкаНаДокумент и команду, которая вызывает из этой формы печать. Отлаживай. Когда отладишь, тогда и подключай к справочнику Внешние обработки.
24 Серёжа_
программист
 
10.04.18
08:04
(23) 1.1.3.1
25 Мимохожий Однако
 
10.04.18
08:09
Мантра:
Добавь в свою обработку Форму.
Добавь в свою обработку Форму.
Добавь в свою обработку Форму.
26 Серёжа_
программист
 
10.04.18
10:52
(25) Мантра мантрой. Дело не в ВПФ, если я добавляю ее обработку напрямую в конфу. То процедура адекватно вызывается сразу.