Имя: Пароль:
1C
1С v8
Внешнее ПО на упр. формах
0 breezee
 
21.09.16
19:44
Добрый вечер! Есть внешнее ПО по печати конвертов. На обычных формах отрабатывало нормально, обработку с вызовом ПО перенесли на управляемые в другую базу- когда второй раз идет обращение к ПО - база виснет и ПО тоже. В чем может быть проблема? Какая принципиальная разница к обращению к внешнему ПО на управляемых и обычных формах?
1 mehfk
 
21.09.16
19:46
Что подразумевается под "обращением к внешнему ПО"?
2 Джинн
 
21.09.16
19:46
(0) Разница в том, кто к нему обращается - сервер или клиент.
3 Asmody
 
21.09.16
19:46
(0) И как вы к нему обращайтесь?
4 breezee
 
21.09.16
19:49
(1)
Я открываю программно обращаюсь к com объекту и открываю программу. Все на клиенет
pepro= ПолучитьCOMОбъект("","PEPro.Application");


&НаКлиенте
Функция ПередПечатьюКонверта()
    Перем current_foreground_win;
    current_foreground_win= "";
    Если api_version>0 Тогда
        pepro.SetFlagShowFormsAsModal(0);
        pepro.SetFlagParseZipIndexFromAddress(1);
        Если счётчик_печати<>0 тогда
            current_foreground_win= pepro.OpenDummyFormToSetAsForeground();
            
            Если Актив = Ложь Тогда
            АктивизироватьПрограмму("Печать конвертов!");
            Актив = Истина;
            КонецЕсли;
        
        КонецЕсли;
        счётчик_печати= счётчик_печати+1;
    КонецЕсли;
    Возврат current_foreground_win;
КонецФункции


Получаю Процедура АктивизироватьПрограмму(title)
    Перем сч;
    сч= 0;
    пока ((shell.AppActivate(title)=0) and (сч<999)) цикл
        сч= сч+1;
    конеццикла;
    
    если сч=999 тогда
        сообщить("не могу активизировать " + title);
    иначе
        shell.AppActivate(title);
    конецесли;
КонецПроцедуры
5 H A D G E H O G s
 
21.09.16
19:56
Формочка открывается модально, но не может прорисоваться, так как форма 1С ждет ее закрытия, не?

Попробовать выполнять этот кот по нажатию кнопки
6 Torquader
 
21.09.16
19:56
Вопрос первый - если два раза создать объект этой программы - что происходит ?
Потому как, управляемые формы могут открываться в разных вкладках (окнах), и, возможно, вы запускаете второй экземпляр того, что должно быть в одном.
7 Torquader
 
21.09.16
19:58
(5) Просто, на Windows 7 решили, что посторонняя программа может стать активной, только если она в текущем активном потоке ввода - то есть перед установкой активного окна нужно подключаться к текущему активному потоку.
8 breezee
 
21.09.16
20:05
(5) У меня же прям отдельное приложение, а не форма открывается в 1С. Хотя за идею спасибо. Надо сделать наерное, чтобы 2 раза не открывалось
(6) Должны передаться новые документы на печать каждый раз, при открытии
Вообше каждый раз после вызова ПО и после того как ОП отработало вызвается вот этот код. Я так понял он и закрывает формы
Процедура ПослеПечатиКонверта(current_foreground_win)
    Если api_version>0 и счётчик_печати<>1 Тогда
        pepro.CloseDummyFormAndSetAsForeground(current_foreground_win);
    КонецЕсли;
КонецПроцедуры

(7) У пользователя XP (сам удивился)
9 breezee
 
21.09.16
20:08
(8) "current_foreground_win" это "специальное фиктивное маленькое "подготовительное" немодальное окошко, чтобы иметь возможность перенести его на передний план"

а "CloseDummyFormAndSetAsForeground" - "метод позволяет закрыть специальное фиктивное маленькое "подготовительное" немодальное окошко, и заставить его перенести на передний план перед своим закрытием другое."

Т.е. окно нормально закрывается
10 breezee
 
21.09.16
20:26
Посмотрел описание функций, подумал что могуть быть проблемы с "SafeLoadDatabase"- "Для загрузки базы данных и проверки того, что она загружена"
На самом деле тычу пальцем в небо. Как этом можно отладить вообще?
11 H A D G E H O G s
 
21.09.16
20:34
(10) ты код в кнопку перенести попробовал?
12 breezee
 
21.09.16
20:36
(11) Так и так по кнопке печать вызывается. Когда второй раз пользователь нажимает - все виснит
13 breezee
 
21.09.16
20:40
Лално, всем спасибо, завтра еще раз попробую пройтись отладкой
14 Torquader
 
21.09.16
21:04
Зачем тебе переносить какие-то другие окна - достаточно активизировать ту программу, которую ты запустил, а перед её закрытием - активизировать 1С.
Ещё не забывай, что OLE меж процессами работает через очередь сообщений, то есть или нужно закрывать окно (и разрушать очередь) после того, как от тебя отсоединились, или на соединении объекта вызывать DisconnectObject для того, чтобы Proxy в другом процессе завершилась и не ждала у моря погоды.
Объект-то может остаться в "подвешенном состоянии" с первого закрытия, и, когда ты его второй раз цепляешь, то получаешь из таблицы объектов "уже труп".
15 Garykom
 
гуру
21.09.16
21:05
Лучшее решение выкинуть эту http://russianit.ru/software/printenvelopepro/ и печатать сразу из 1С.
16 Torquader
 
21.09.16
21:13
(15) Я, помнится, когда диссертация защищал - писал такую сам для матричного принтера, чтобы на конвертах печатать - она просто из файла брала данные и печатала - там основной вопрос - управление взятием и выпуском бумаги - на современных лазерных принтерах - очень неактуальный вопрос.
17 Garykom
 
гуру
21.09.16
21:24
Угу у нас "печать на конвертах" очень смешная, в .doc делается шаблон с полями/переменными типа [ОтправительНаименование], [ПолучательАдрес] и т.д. и из 1С этот шаблон заполняется и на принтер.
18 Garykom
 
гуру
21.09.16
21:25
(17)+ Шаблоны в word/writer чтобы пользователи сами могли подправить/добавить не дергая программеров.
Список полей в обработке печати в мануале.
19 Torquader
 
21.09.16
21:46
(18) У меня также и было, только шаблон рисовался редакторе, где писалось в какой строке (координаты сверху и снизу) и что напечатать - и что делать, если не влазит.