chessman, предлагаю объединить в класс и мои доработки, основанные на одной из первых версий сабжа.
В архиве не хватает только свойства класса Общие.СистемныеФункции
Процедура ПриПолучении_ГлавноеОкно1С(ЗначениеАтрибута)
Если ПустоеЗначение(ГлавноеОкно1С) = 1 Тогда
Сам = Сам(Контекст);
Враппер = СоздатьОбъект("DynamicWrapper");
Враппер.Register("user32.dll", "FindWindowExA", "i=llsl", "f=s", "r=l");
Враппер.Register("user32.dll", "FindWindowW", "i=ll", "f=s", "r=l");
Враппер.Register("user32.dll", "GetWindow", "i=ll", "f=s", "r=l");
Враппер.Register("user32.dll", "GetParent", "i=l", "f=s", "r=l");
Враппер.Register("User32.dll", "GetWindowThreadProcessId", "i=ll", "f=s", "r=l");
Враппер.Register("User32.dll", "FindWindowEx", "i=hhsl", "r=h");
Враппер.Register("User32.dll", "GetDesktopWindow", "r=h");
dWnd = Враппер.GetDesktopWindow();
GW_CHILD = 5;
GW_HWNDNEXT = 2;
hWnd = Враппер.GetWindow(dWnd, GW_CHILD);
Пока hWnd > 0 Цикл
curThread = Враппер.GetWindowThreadProcessId(hWnd, 0);
Если curThread = Сам.Поток1С Тогда
Если Враппер.FindWindowEx(hWnd, 0, "MDIClient", 0) > 0 Тогда
ГлавноеОкно1С = hWnd;
hWnd = 0;
Иначе
hWnd = Враппер.GetWindow(hWnd, GW_HWNDNEXT);
КонецЕсли;
Иначе
hWnd = Враппер.GetWindow(hWnd, GW_HWNDNEXT);
КонецЕсли;
КонецЦикла;
КонецЕсли;
ЗначениеАтрибута = ГлавноеОкно1С;
КонецПроцедуры
Это чтобы вопросов не было, так то у тебя там оно уже есть...
P.S.: Сделано на коленках где-то полгода назад, но плотно используется во всех конфах в долгих обработках.