можно настроить программнымиметодами перехват в оле/программе окна сообщений. все что туда выводится - будет писаться в текстовый лог.
.
если ошибка синтаксическая/времени выполнения - оттопырь журнал регистрации и посмотри записи. Если ошибка типа "документ не проведен, потому что не хватает товара" - то в ЖР ничего не будет
Можно временно в модуль добавить код для записи в текстовый файл строк со значениями контролируемых переменных (займет несколько строк). По ним отлавливать ошибки.
Для упрощения поиска окна можно прописать его
v7.EvalExpr("ЗаголовокСистемы(""Заголовок Для Поиска Окна"")");
Тогда Названия окна для поиска будет
"1С: Предприятие - "+СокрЛП(Метаданные.Идентификатор)+": "+ЗаголовокСистемы()
Утилита 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.
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);
}
}
}