Видимое OLE соединение

1. eshtrey 16.06.15 18:20 Сейчас в теме
Можно ли сделать OLE соединение видимым, что бы глазами увидеть ошибку в окне сообщений? Необходимо для отладки. По OLE будет запускаться обработка.
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. _Z1 38 16.06.15 19:25 Сейчас в теме
(0) По моему нельзя.
Можно отладить глобальную функцию в локальной базе
а потом эту функцию вызывать по OLE
+
3. CheBurator 3119 16.06.15 21:52 Сейчас в теме
можно настроить программнымиметодами перехват в оле/программе окна сообщений. все что туда выводится - будет писаться в текстовый лог.
.
если ошибка синтаксическая/времени выполнения - оттопырь журнал регистрации и посмотри записи. Если ошибка типа "документ не проведен, потому что не хватает товара" - то в ЖР ничего не будет
+
4. eshtrey 17.06.15 09:09 Сейчас в теме
Может у ЕПРСТ есть ответ, про что то похожее он писал тут http://www.forum.mista.ru/topic.php?id=345728
6ое сообщение
+
5. VitusBering 5 17.06.15 09:10 Сейчас в теме
Можно временно в модуль добавить код для записи в текстовый файл строк со значениями контролируемых переменных (займет несколько строк). По ним отлавливать ошибки.
+
6. eshtrey 17.06.15 09:30 Сейчас в теме
(5) VitusBering, пока так и делаю, но это не очень удобно
+
7. Serginio 938 17.06.15 11:53 Сейчас в теме
Посмотри Show1c.exe или самому недолго написать
+
10. Gkmy 28 17.06.15 13:16 Сейчас в теме
(7)
Прикрепленные файлы:
Show1c.7z
+
9. Serginio 938 17.06.15 12:19 Сейчас в теме
Для упрощения поиска окна можно прописать его
v7.EvalExpr("ЗаголовокСистемы(""Заголовок Для Поиска Окна"")");
Тогда Названия окна для поиска будет
"1С: Предприятие - "+СокрЛП(Метаданные.Идентификатор)+": "+ЗаголовокСистемы()
+
11. Gkmy 28 17.06.15 13:19 Сейчас в теме
Утилита Show1c.exe разворачивает окно (SW_MAXIMIZE) последнего запущенного экземпляра 1c-Предприятия.

Поясню, зачем это надо.

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

Следующий кусок кода позволить сделать "видимой" открытую через OLE 1С:
о=СоздатьОбъект("V77.Application");       // это собственно
о.Initialize(в77.RMTrade,"/D","");        // вызов 1С через OLE
КомандаСистемы(КаталогИБ()+"Show1c.exe"); // а это мы запускаем утилитку "борьбы с невидимками",
                                          // естественно, путь к утилитке у вас может 
                                          // быть собственный


2. Как это реализовано?

Алгоритм этой утилитки достаточно прост: при помощи EnumWndProc находим все окна со строкой "Предприятие"
в названии, получаем для каждого окна процесс (GetWindowThreadProcessId, потом OpenProcess).
При помощи GetProcessTimes получаем для каждого время прошедшее с момента запуска. Выбираем процесс
с наименьшим временем жизни (вроде как только что запущенный), говорим ему ShowWindow(hWnd,SW_MAXIMIZE)...

Все.

Все вопросы и предложения: fastcode@fromru.com,
также кому надо могу выслать сырцы для MsVC.
eshtrey; +1
12. eshtrey 17.06.15 14:30 Сейчас в теме
(11) Gkmy, то что надо, спасибо
+
13. Serginio 938 17.06.15 16:13 Сейчас в теме
(11) В принципе можно показать и невидимое окно

public static void ПоказатьОкно(string НазваниеОкна)
        {
           string Заголовок="1С:Предприятие";

            foreach (var processRunning in System.Diagnostics.Process.GetProcesses())
            {
                if (processRunning.ProcessName.StartsWith("1cv7"))
                    foreach (IntPtr handle in EnumerateProcessWindowHandles(processRunning))
            {
                var wndCaption = new StringBuilder(1000);
                SendMessage(handle, WM_GETTEXT, wndCaption.Capacity, wndCaption);
                if (wndCaption.Length >= Заголовок.Length)
                        if (wndCaption.ToString(0,Заголовок.Length)==Заголовок)
                            if (!IsWindowVisible(handle))
                             ShowWindow(handle, 5);

         

         
            }
         
            }
        }
Показать
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот