Иерархия окон в 1С 8.2

28.12.09

Разработка - Работа с интерфейсом

Результаты первоначального исследования окон 8.2.

Для работы с окнами 1С необходимы следующие хэндлы окон:
1. h1C – хэндл главного окна
2. hMDI – хэндл окна MDI (для 8.2 неактуально)
3. hReport - хэндл окна активной формы отчета (обработки)
4. hReportDialog - хэндл «подложки» (слой, куда можно поместить видимые компоненты)

Главное окно 8.2 имеет класс V8TopLevelFrameSDI, для вызывающей библиотеки может быть найдено как окно данного класса (с условием, что PID этого окна равен PID библиотеки, т.к. они принадлежат одному процессу)

function EnumWindows82Proc(WND: hwnd; LPARAM: lParam): bool; stdcall;
var ThrID, PID: DWORD;
var b:array[0..254] of AnsiChar;
begin
  ThrID := GetWindowThreadProcessId(wnd, PID);
  GetClassName(wnd,@b,255);

  {ищем только "своё" главное окно}
  if (b='V8TopLevelFrameSDI') and (PID=GetCurrentProcessId()) then begin
  Main82Handle:=wnd;
  end;
end;

function TMiracleClass.GetMain82: Integer;
begin
  Main82Handle:=0;
  EnumWindows(@EnumWindows82Proc, 0);
  RESULT:=Main82Handle;
end;
Примечание: для сторонней программы главное окно можно найти через
FindWindow('V8TopLevelFrameSDI',nil) – самое верхнее
или
FindWindow('V8TopLevelFrameSDI',ЗаголовокЭтогоОкна)

Формы 8.2 хоть и принадлежат процессу главного окна, но не являются его дочками, а являются окнами верхнего уровня. Окна имеют класс V8TopLevelFrameSDIsec
Для вызывающей библиотеки хэндл формы можно найти через GetActiveWindow, со стороны через 
FindWindow('V8TopLevelFrameSDIsec',nil) – активная
или
FindWindow('V8TopLevelFrameSDIsec',ЗаголовокНужнойФормы)
А вот дальше начинается весьма запутанная иерархия дочерних окон активной формы.
Методом научного тыка (кстати, удобный - рекомендую[//infostart.ru/public/59436/index.php?fimages=yes&PAGEN_1=7#comm], пост 124) был определен хэндл «подложки», как раз тот слой, где внедренные компоненты видимы на форме
wnd:=FindWindow('V8TopLevelFrameSDIsec',nil); // найдется активная форма
wnd:=GetTopWindow(wnd);// первый V8LayouterTabsWindow
wnd:=GetTopWindow(wnd);// его первый V8FormElement
w:=FindWindowEx(wnd,0,'V8LayouterTabsWindow',nil);// его первый V8LayouterTabsWindow
wnd:=FindWindowEx(wnd,w,'V8LayouterTabsWindow',nil); //его второй V8LayouterTabsWindow
wnd:=GetTopWindow(wnd);// его первый V8FormElement
wnd:=GetTopWindow(wnd);// его первый V8LayouterTabsWindow
wnd:=GetTopWindow(wnd);// его первый V8FormElement - он самый!!!!
{внедряем компонент дельфи}
PB:=TProgressBar.CreateParented(wnd);
PB.UpdateControlState;
PB.Left:=10;
PB.Top:=40;
PB.Width:=200;
PB.Height:=20;
PB.Visible:=true;
PB.Enabled:=true;
PB.Position:=60;
(результат на картинке)

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61797    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54403    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    16698    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    10738    750    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    9615    151    acces969    31    

118

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3666    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12080    1    5    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. vip 26.12.09 05:57 Сейчас в теме
Молодец.
Лиха беда начало.
Любопытно, зачем 1С использует свои классы окон.
Для понтов?
2. Abadonna 3958 26.12.09 06:02 Сейчас в теме
(1) Начиная с 8.1 у них пошли свои... Наверное, для понтов ;)
3. artbear 1448 26.12.09 07:26 Сейчас в теме
Интересно.
Но ИМХО очень важное дело с окнами 8, которое пока никто не решил - это получение текста окна :(
4. artbear 1448 26.12.09 07:32 Сейчас в теме
Например, очень интересная задача - получение текста модуля в Конфигураторе
25. Abadonna 3958 19.01.10 19:42 Сейчас в теме
(4)
Например, очень интересная задача - получение текста модуля в Конфигураторе

Вот такая безрадостная фигня пока ;(
1. Окошко ввода совсем не желает вести себя как нормальный контрол оpгана упpавления pедактиpованием. В частности не реагирует на стандартную API SendMessage(handle,em_GetLineCount,0,0), которая должна вернуть количество строк в органе управления.
2. Нажатие любой клавиши выдает неопознанную виндой мессагу 0x0118, при этом для любой клавиши wParam=0000FFFF, а lParam=BF84AC9A (всегда, блин!)
см. рис.
Прикрепленные файлы:
26. Душелов 4013 19.01.10 20:53 Сейчас в теме
(25) Формат бы этих сообщений получить...
5. AmoreMe 150 26.12.09 17:49 Сейчас в теме
Для того что вы говорите нужно организовать межпроцессный обмен, на мой взгляд инжект DLL самый лучший вариант. Но о вкусах как говорится... А уж потом помятуя, что все контролы - окна, работать с ними как с обычными окнами... (API никто не отменял и какие бы классы кто не писал, все крутится вокруг стандартного API). А текст в конфигураторе это похоже RichEdit, ну или какая его эманация! Суть дела не меняет... (Кстати в этом случае получится не просто читать текст, но и менять его из своего приложения или контролировать ввод...)
6. Abadonna 3958 26.12.09 17:54 Сейчас в теме
(5)
(API никто не отменял и какие бы классы кто не писал, все крутится вокруг стандартного API). А текст в конфигураторе это похоже RichEdit

Че ж думаешь, никто не проверил его, например, на стандартную API
SendMessage(wnd, em_GetLineCount,0,0)? Думаешь я и мессаги там не проконтролировал? Там только только через переопредление оконной процедуры добраться можно, или через перехват родных библиотек :(
7. Abadonna 3958 26.12.09 17:57 Сейчас в теме
+(6) А метод отоляринголога для получения текста модуля в конфигураторе реализован в http://infostart.ru/public/19946/
8. Ish_2 1104 26.12.09 20:39 Сейчас в теме
Хоть и не понял ни слова , а любопытствую . Скажи мне , Абадонна , по-простому. Зачем это нужно , обращение к окнам 1с из внешнего приложения ? Просто любопытно расковырять оконный интерфейс 1с ?
Или это можно где-то применить ?

Только предупреждаю ,я еле-еле вспомнил школьное определение Handle : логический номер назначаемый объекту (файлу , устройству и т.п).
9. Abadonna 3958 27.12.09 04:58 Сейчас в теме
(8)
Зачем это нужно , обращение к окнам 1с из внешнего приложения ?

Из внешнего приложения не особенно и надо, а вот тут (картинка 6)
http://infostart.ru/public/59436/index.php?fimages=yes#images без этого никак не обойтись, на этом все и построено. А отлаживать- куда как удобнее из внешнего
10. Ish_2 1104 27.12.09 13:17 Сейчас в теме
(9) Кроме глубокомысленного : "кому что нравится" - сказать мне нечего.
11. Abadonna 3958 27.12.09 15:35 Сейчас в теме
(10)
Кроме глубокомысленного : "кому что нравится" -

Глубомысленное давно уж написано на воротах: "Каждому своё" ;)
14. artbear 1448 28.12.09 07:56 Сейчас в теме
(8) Не обязательно из внешнего приложения обращаться.
Если бы была возможность работы с окнами 1С, текстами и т.д., вполне можно было, например, упростить себе работу в Конфигураторе, сделав некое грубое подобие Опенконф для 77 с его скриптами и плагинами :)
Лично меня этот проблема очень занимает, но пока не удается решить :(
15. Abadonna 3958 28.12.09 08:05 Сейчас в теме
(14) Вот и я про то же. Если уж один из авторов 1с++ пока на разобрался, то
(API никто не отменял и какие бы классы кто не писал, все крутится вокруг стандартного API).

никак не катит
16. Ish_2 1104 28.12.09 09:34 Сейчас в теме
(14) Ага. Понятно. Опенконф полгода назад поставил. Он быстрее и функциональнее чем встроенный редактор 1сv8.
22. cleaner_it 220 12.01.10 05:37 Сейчас в теме
(16) можно поинтересоваться, а где взяли опенконф под 1С 8? Никак найти не могу, вот уже года три. Может ищу не там/не так?...
23. artbear 1448 12.01.10 06:55 Сейчас в теме
(22) Автор (16) ИМХО подразумевал, что поставил Опенконф для 77.
Для 8 Опенконф-а не существует, есть только некие зачатки скриптов
http://www.1cpp.ru/forum/YaBB.pl?num=1227553473/0
Посмотри ветку в начале и в конце
12. Ish_2 1104 27.12.09 15:47 Сейчас в теме
11) Хм.. А ,пожалуй , я с тобой согласен.
На воротах храма ВК-ашников такая надпись смотрелась бы многозначительно. И всяк входящий сюда - задумался бы.
13. Abadonna 3958 27.12.09 15:50 Сейчас в теме
(12)
Нет тут, как в аське,символа с двумя пивными кружками :(
А НАДО!!!! Доржи!!!!!!!!!!!!!?????????????
18. support 4484 28.12.09 12:13 Сейчас в теме
(13) Да, не хватает. ;)
http://infostart.ru/profile/53/blog/868/
Вот, альтернативный:
17. Арчибальд 2706 28.12.09 10:01 Сейчас в теме
Где только черти не носят Абадонну... Надысь алиментами интересовался, теперь вот окошками :o
19. Abadonna 3958 28.12.09 13:54 Сейчас в теме
(17)
. Надысь алиментами интересовался, теперь вот окошками

Смотрю вот сейчас на окошко... Открыть - понимаю, закрыть - понимаю, но как, блин, свернуть? :))))
20. ilya005 123 30.12.09 03:22 Сейчас в теме
Это конечно всё здорово, НО!!!
Вы не подумали, ЗАЧЕМ 1с выпустила 8.2 ?!
Что бы кто-то потом дорабатывал ее в delphi,c, .net Итд ?
я всегда думал, что это не совсем так и вот доводы:
1. 8.2 изначально делалась как МУЛЬТИ платформенное решение, в браузере ее (теоретически) можно хоть на линуксе и на телефоне запустить! (как там ваш прогресс бар будет работать ? - НИКАК!)
2. в 8.2 сделали СВОЙ стандарт внешних компонент.
21. Душелов 4013 30.12.09 08:53 Сейчас в теме
(20) Для начала стоит Вам самим ознакомиться со стандартном внешних компонент, который предлает 1С.
24. Abadonna 3958 18.01.10 03:54 Сейчас в теме
(20)
Вы не подумали, ЗАЧЕМ 1с выпустила 8.2 ?!

Думаю, чтобы бабла еще срубить, а зачем еще? ;)
27. KroVladS 34 26.08.13 17:05 Сейчас в теме
(0)
класс V8TopLevelFrameSDI в 8.2 актуален только для Управляемых форм или для обычных тоже?

Обычные формы:

ищу
FindWindow(L"V8TopLevelFrameSDIsec",NULL);
ничего не находит.
FindWindow(NULL,L"1С:Предприятие - Конфигурация");
находит.

не могу найти окно обработки. не подскажите как?

можно ли встроить фрейм в окно обработки средствами WIN API?
28. Abadonna 3958 26.08.13 17:51 Сейчас в теме
(27) KroVladS,
1. Рекомендую использовать мелкософтовский SpyXX - удобная штука.
SPYXX
2. Для обычного приложения иерархия совсем другая, похожая на иерархию окон 7.7
Хендл MDI-окна
hMDI:=FindWindowEx(MainHandle,0,'V8MDIClient',''); где MainHandle - хендл главного окна
Хендл активной обработки
hActiveForm:=GetTopWindow(hMDI);
Прикрепленные файлы:
KroVladS; +1 Ответить
29. KroVladS 34 26.08.13 18:59 Сейчас в теме
30. KroVladS 34 28.08.13 14:23 Сейчас в теме
(28)
Ещё один глупый вопрос.

Есть dll библиотека которая отправляет видеопоток в окно по его Хендлу.
По COM подключить её нельзя т.к. отсутствуют точки входа.
Обернул её в внешнюю компоненту NativeAPI, отправляю в окно обработки 1с, всё хорошо пока фокус захвачен dll (вместо паузы использую MessageBoxA(hMDI,"","",MB_OK)), как только 1с возвращают фокус она видит что над её формой нагло надругались и падает.

в какую сторону капать ?
31. Abadonna 3958 02.09.13 06:50 Сейчас в теме
(30) KroVladS, в своей Native используй компонент TMediaPlayer - и всех проблем. Там можно и в MDI отправить, и в активную форму, и вообще в отдельное окно.
33. Abadonna 3958 02.09.13 07:06 Сейчас в теме
(30) KroVladS, Блинский клин! Классно свайт обновили: "Изменить" отправляет хз куда, только не в редактирование, файлы прикрепить не дает...
К /31/ посмотри картинку в http://infostart.ru/public/18629/
Как раз TMediaPlayer на активной форме 1С
34. KroVladS 34 03.09.13 15:33 Сейчас в теме
(33)
Спасибо за ответ. но задача несколько иная и компонент TMediaPlayer не подойдет.
т.к. необходимо использовать именно эту библиотеку.

Если копнуть чуть глубже, падает сама dll из-за ошибки доступа к памяти.
Есть сишный проект построенный на этой dll вроде работает, делаю те-же вызовы из NativeAPI всё падает.

В общем это офтопный офтоп.
35. KroVladS 34 04.09.13 16:40 Сейчас в теме
(33)

офтоп
Обернул dll библиотеку в ActiveX и 1с перестала падать.
з.ы. да я извращенец, но работает же :)
36. Abadonna 3958 04.09.13 16:50 Сейчас в теме
(35) KroVladS, там еще нюанс мог быть...
Ты поток на хендл активной формы выводил? А, скорее всего надо было на то, что я называю hReportDialog
37. KroVladS 34 04.09.13 16:52 Сейчас в теме
(36)
И на хендл активной формы.
И на стандартный элемент картинка.
И вставлял на форму стандартный ActivX элемент MS Forms 2.0 Frame

Всё одно падал.
38. Abadonna 3958 04.09.13 16:57 Сейчас в теме
(37) KroVladS, сюда не пробовал?:
........................
wnd:=FindWindowEx(wnd,w,'V8LayouterTabsWindow',nil); //его второй V8LayouterTabsWindow
wnd:=GetTopWindow(wnd);// его первый V8FormElement
wnd:=GetTopWindow(wnd);// его первый V8LayouterTabsWindow
wnd:=GetTopWindow(wnd);// его первый V8FormElement - он самый!!!!
____________
Последний как раз hReportDialog
_________________
Тебе на обычные формы надо? Тогда напишу как там его найти
39. KroVladS 34 04.09.13 17:11 Сейчас в теме
(38)
Именно туда и выводил.
Для неуправляемых форм.

HWND hWnd1с = FindWindow(L"V8TopLevelFrame",NULL);
HWND hMDI = FindWindowEx(hWnd1с,NULL,L"V8MDIClient",NULL);
hMDI =GetTopWindow(hMDI);
hMDI =GetTopWindow(hMDI);
hMDI =GetTopWindow(hMDI);
hMDI =GetTopWindow(hMDI);// <-- Элемент картинка на форме
//лишний уровень
// hMDI =GetTopWindow(hMDI);

код правда сишный
40. Abadonna 3958 04.09.13 17:16 Сейчас в теме
(39) KroVladS, стоп-стоп-стоп! Еще раз вопрос повторяю: форма обычная или управляемая?
42. KroVladS 34 04.09.13 17:19 Сейчас в теме
32. Abadonna 3958 02.09.13 06:57 Сейчас в теме
/+31/
Прикрепленные файлы:
41. KroVladS 34 04.09.13 17:19 Сейчас в теме
43. Abadonna 3958 04.09.13 17:23 Сейчас в теме
(41) KroVladS,
hReport:=GetTopWindow(hMDI);

hReportDialog:=GetTopWindow(GetTopWindow(hReport));

три раза TOP от MDI - вот тут железно любые компоненты рисуются
44. KroVladS 34 04.09.13 17:31 Сейчас в теме
(43)
В одном из первых сообщений я дезинформировал Вас
как только 1с возвращают фокус она видит что над её формой нагло надругались и падает.


На самом деле
Если копнуть чуть глубже, падает сама dll из-за ошибки доступа к памяти.
45. rootuk 12.03.14 22:25 Сейчас в теме
Подскажите, пожалуйста, могу я с помощью данного подхода изменить шрифт кнопки в командной панели? (это 1С сделать не дает), или задать размер колонки меньше ширина слова, которое в нем(как будто пользователь сам уменьшил размер колонки)?
46. user1014203 03.09.18 14:50 Сейчас в теме
Подскажите можно ли в ВК по nativeAPI получить хендл окна с помощью GetAppMainFrame? Пишу ВК на VS C++, но пока не удается вызвать GetAppMainFrame. Получаю ошибку
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
47. markers 274 03.09.18 18:41 Сейчас в теме
(46) Не совсем корректный ответ, но вдруг пригодится: hwndLayout = FindWindowEx(NULL, NULL, L"V8TopLevelFrame", NULL);
48. user1014203 04.09.18 07:31 Сейчас в теме
(47)Боюсь вдруг юзер запустит 2 процесса 1С, или если будет диалоговое окно, то формы будет две, в С# использовал GetAppMainFrame без каких либо проблем, но сейчас нужно nativeAPI, поэтому перешел на С++, но ни как не могу вызвать GetAppMainFrame все время валится с ошибкой.
49. markers 274 04.09.18 11:24 Сейчас в теме
(48) Согласен, по тому и написал что не совсем корректный ответ. Однако, если я не ошибаюсь, NativeApi компонента не имеет возможности взаимодействовать с окном 1С, только созданные по технологии COM.
PS: Наверняка я не прав.
50. user1014203 04.09.18 11:32 Сейчас в теме
(49)Возможно вы правы, я тоже уже склоняюсь к такому варианту, но не уверен. Надеюсь кто то сможет подсказать.
Оставьте свое сообщение