Имя: Пароль:
1C
1С v8
Как перекинуть печать ВПФ с формы в модуль объекта
0 DenYuliya
 
11.11.21
17:09
Добрый день.
Платформа 1С:Предприятие 8.3 (8.3.18.1289)
Есть ВПФ, выводящая на печать Word через COMОбъект.
Раньше прекрасно работала через форму (на форме кнопка, все процедуры - в модуле формы).
Формирование, заполнение, вызов и т.д. COMОбъект происходил в клиентской процедуре.

&НаКлиенте
Процедура ПечатьУведомлениеОЗадолженности(Команда)
\\\\ тут код
КонецПроцедуры


Тут понадобилось от формы отказаться, все перенести в модуль объекта.
Сделала новую обработку, создала форму, на ней реквизит "ссылка на объект" и кнопка "Печать".

В модуле формы пишу:

&НаСервере
Функция ПечатьПФНаСервере()
    ЭтотОбъектОбработка = РеквизитФормыВЗначение("Объект");
    ЭтотОбъектОбработка.Печать();
КонецФункции

&НаКлиенте
Процедура ПечатьПФ(Команда)
    ПечатьПФНаСервере();
КонецПроцедуры

В модуле объекта:

Функция Печать() Экспорт    
  ПечатьУведомлениеОЗадолженности();        
КонецФункции

&НаСервере
Процедура ПечатьУведомлениеОЗадолженности() Экспорт

    СтруктураДляЗаполнения = ПолучитьСтруктуруДляЗаполнения();
    
    Попытка
        ОбъектВорд = Новый COMОбъект("Word.Application");
    Исключение
        Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
    КонецПопытки;
    ОбъектВорд.Documents.Add("\\serv8\ftp\Шаблоны исков\Юр блок Колпино\Уведомление о задолженности.docx");
    Док = ОбъектВорд.ActiveDocument;

//////
КонецПроцедуры


Суть проблемы:
Раньше процедура ПечатьУведомлениеОЗадолженности() была клиентской и вот эта часть нормально отрабатывала.

ОбъектВорд.Documents.Add("\\serv8\ftp\Шаблоны\Уведомление о задолженности.docx");

А теперь если ПечатьУведомлениеОЗадолженности() оставить НаКлиенте - я не могу понять, как ее вызвать.
Если ПечатьУведомлениеОЗадолженности() сделать НаСервере - то  вываливается ошибка

Значение не является значением объектного типа (Documents)
{ВнешняяОбработка.УведомлениеОЗадолженности.МодульОбъекта(46)}:    ОбъектВорд.Documents.Add("\\serv8\ftp\Шаблоны исков\Юр блок Колпино\Уведомление о задолженности.docx");
{ВнешняяОбработка.УведомлениеОЗадолженности.МодульОбъекта(32)}:    ПечатьУведомлениеОЗадолженности();
{ВнешняяОбработка.УведомлениеОЗадолженности.Форма.Форма.Форма(5)}:    ЭтотОбъектОбработка.Печать();
{ВнешняяОбработка.УведомлениеОЗадолженности.Форма.Форма.Форма(10)}:    ПечатьПФНаСервере();


подскажите, где я туплю?
Спасибо большое!
1 SuperMario
 
11.11.21
17:25
А у Вас Word как приложение на сервере стоит?
Если так, то
    Попытка
        ОбъектВорд = Новый COMОбъект("Word.Application");
    Исключение
        Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
        
        >>>>!!!! На сервере отработала ошибка, Вам ничего не показала т.к. это интерагтивное событие и пошла дальше косячить!<<<<<<

    КонецПопытки;

Но , вообще, я не понимаю, зачем WORD вы на сервер запихнули? Если только сохранить как файл, тогда Ок.
2 DenYuliya
 
11.11.21
17:37
(1) нет
3 DenYuliya
 
11.11.21
17:39
(1) я что-то только после вашего вопроса задумалась о том. что стоит он только на другом серваке, где другие базы крутятся, а на этом-то реально нет... Что, никак, получается?
4 SuperMario
 
11.11.21
17:39
(2) А метод серверный!
5 DenYuliya
 
11.11.21
17:41
(4) а если его сделать клиентским, как он и был раньше - его никак не вызвать с команды на форме?
6 SuperMario
 
11.11.21
17:41
(3) Вы поручили серверу предприятия делать работу заполнения документа, а приложение ему не дали.
Вместо
Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
сделайте запись в журнал регистрации и потом возврат (это если по фен и шую)) ).
Не нужно никакого интерактива ;-)
7 Креатив
 
11.11.21
17:43
Интересно, а com-объект с клиента на сервер передать можно?
8 SuperMario
 
11.11.21
17:43
(5) Вы бы написали, чего добиваетесь? тогда проще было подсказать.
9 SuperMario
 
11.11.21
17:44
(7) Это несериализуемый тип.
10 DenYuliya
 
11.11.21
17:47
(8) я в изначальном посте писала - Есть ВПФ, выводящая на печать Word через COMОбъект.
Раньше прекрасно работала через форму (на форме кнопка, все процедуры - в модуле формы).
Формирование, заполнение, вызов и т.д. COM Объекта происходило в клиентской процедуре. Но у пользователя по кнопке "Печать" открывалась форма, где он нажимал "напечатать".

Решили избавиться от формы и все формировать в модуле объекта.

Но отладку-то как-то надо запускать? Поэтому форма осталась временно, чтобы там выбирать "ссылку на объект" и кнопку.  Вот пытаюсь понять, как бы "натянуть сову на глобус"
11 mTema32
 
11.11.21
17:52
(0) Клиентский механизм хотите выполнить на сервере. Это так не работает.
Задача поставлена некорректно.
12 mTema32
 
11.11.21
17:53
Вся идея такой реализации изначально падает если сервер под линуксом.
13 SuperMario
 
11.11.21
17:57
У Вас что за прикладное решение?  Применяете БСП?
В топе только версия платформы
14 DenYuliya
 
11.11.21
17:59
(13) отраслевка 1С:Учет в управляющих компаниях ЖКХ, ТСЖ и ЖСК, редакция 3.0 (3.0.103.1)
15 DenYuliya
 
11.11.21
18:05
(12) на винде
16 SuperMario
 
11.11.21
18:08
(14) на почту скинул рабочую печать трудового договора в Word-е.
17 SuperMario
 
11.11.21
18:09
За основу можно взять
18 SuperMario
 
11.11.21
18:16
Обрати внимание на то, что обработка вызывается из подсистемы печати
        .....
        .....
    ДобавитьКоманду(ТаблицаКоманд,НСтр("ru = 'Трудовой договор (WORD)'"),"ТрудовойДоговор",    "ВызовКлиентскогоМетода",Истина,"ПечатьMXL");

И Интерактивно из Формы (для отладки)
19 DenYuliya
 
11.11.21
18:17
(16) спасибо большое, посмотрю сейчас!
20 SuperMario
 
11.11.21
18:18
(19) я не сталкивался с "отраслевками". Но, думается, что БСП они применяют. тогда это Ваш случай)))
21 DenYuliya
 
11.11.21
19:07
(20) да, конечно, БСП есть, это же БИТ))). Смотрю уже, некоторые интересные моменты подергала у вас).
Хотя -  у вас тоже есть форма и формирование COM-объекта идет НаКлиенте, как и у меня. Идея-то была вообще убрать форму из обработки. Ну да ладно, больше провожусь. Хотя, конечно, интересно, можно ли в принципе это реализовать.
22 DenYuliya
 
11.11.21
22:03
(18) а можно глупый вопрос? Я так понимаю, в твоей обработке - ПФ  выводится по одному экземпляру на каждую строку ТЧ, ведь так? А где начинается обход ТЧ? Не могу понять, как это для COMОбъекта реализовать?

Что то типа

ДляКаждого Строка Из ТЧ_Сотрудники

///печать COMОбъект

Цикл
23 DenYuliya
 
11.11.21
22:09
(18) в продолжение (22)
У меня сейчас вот так, но выводится либо первая строка ТЧ. если она всего одна, либо последняя, если строк ТЧ - несколько.
Я так понимаю, надо впендюрить куда-то Цикл и что-то еще, да?

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

    СтруктураДляЗаполнения = ПолучитьСтруктуруДляЗаполнения();
    
    Попытка
        ОбъектВорд = Новый COMОбъект("Word.Application");
    Исключение
        Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
    КонецПопытки;

    ОбъектВорд.Documents.Add("\\serv8\ftp\Шаблоны исков\Уведомление о задолженности.docx");
    Док = ОбъектВорд.ActiveDocument;
        
    //заполнение закладки ПолноеНаименованиеОрганизации
    Док.Bookmarks("ПолноеНаименованиеОрганизации").Select();
    Док.Application.Selection.TypeText(СтруктураДляЗаполнения.ПолноеНаименованиеОрганизации);

        ///ну и куча заполнения параметров поштучно
    
    ОбъектВорд.Application.Visible=1;
    ОбъектВорд.Activate();    
    ОбъектВорд = 0;
    
КонецПроцедуры
24 SuperMario
 
12.11.21
09:51
(22) Это же трудовой договор на основе приема на работу))
Там нет многострочных частей.
25 SuperMario
 
12.11.21
09:55
(21) я подстраивался под ВызовКлиентскогоМетода БСП.

Вот подходящий материал
https://infostart.ru/1c/articles/694647/
26 SuperMario
 
12.11.21
09:59
+(22) но у меня где-то была печ. форма с заполнение таблицы WORD-а. Сложность вызывала создание самой таблицы в коде  с точным указанием кол-ва строк и колонок да еще в конкретном месте документа ))

Но это уже совсем другая история...
(С) Следствие вели с Леонидом Каневским
27 SuperMario
 
12.11.21
10:20
+(21)  Никак. Подумайте сами. На самом клиенте что бы сделать вызов нужно "нечто"(извините за тавтологию), которое на нем будет находиться и выполнять код.
Обработка, как объект (точнее её коллекция) находится на сервере. Что бы получить доступ к модулю объекта, его нужно создать (т.к. он после создания коллекции реквизитов формы сам объект разрушается).
РеквизитФоромыВЗначение("Объект") создаст объект ТОЛЬКО на сервере (если вы обратите внимание в конфигураторе на сам объект, то  он будет в скобках. Это означает, что этот объект только на сервере и передать его на клиента никак не можно).

Вот и попробуйте находясь на сервере добраться до клиента (вызвать клиентский метод).
28 DenYuliya
 
12.11.21
12:26
(24) я в нашей УПП посмотрела бегло этот документ, там есть ТЧ. Хотя может у нее другой смысл какой-то, я в ЗУП вообще "0"
29 DenYuliya
 
12.11.21
12:29
(26) да, это какой - то лютый треш((((. За ссыль в (25) спасибо, изучу.