закрепить окно формы в 8.3.7

1. makiiim 14.12.15 15:20 Сейчас в теме
Подскажите, пожалуйста: возможно ли программно закрепить окно формы в 8.3.7 при открытии ( имеется в виду новая возможность «Одновременное отображение двух окон в интерфейсе Такси»). на сайте ИТС есть только описание из режима Предприятие, а как сделать и можно ли сделать это программно ни слова не сказано Источник: ©
+
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ЧерныйКот 14.12.15 15:36 Сейчас в теме
Типа того? это для начальной страницы.

		
УстановитьПривилегированныйРежим(Истина);
                НастройкиРабСтолаАдмин = Новый НастройкиНачальнойСтраницы;
		СоставФормАдмин = НастройкиРабСтолаАдмин.ПолучитьСоставФорм();
		СоставФормАдмин.ЛеваяКолонка.Очистить();
		СоставФормАдмин.ПраваяКолонка.Очистить();
		СоставФормАдмин.ЛеваяКолонка.Добавить("Задача.Задача1.ФормаСписка");
		СоставФормАдмин.ПраваяКолонка.Добавить("Отчет.Отчет1.Форма");
		НастройкиРабСтолаАдмин.УстановитьСоставФорм(СоставФормАдмин);

		Если ТекСотрудник.Роль = "Администратор" Тогда
					ХранилищеСистемныхНастроек.Сохранить("Общее/НастройкиНачальнойСтраницы",,НастройкиРабСтолаАдмин,,СокрЛП(ПользовательИнфБазы.Имя)); 
					ХранилищеСистемныхНастроек.Сохранить("Общее/НастройкиИнтерфейсаКлиентскогоПриложения",,НастройкиИнтерфейсаАдмин,,СокрЛП(ПользовательИнфБазы.Имя));
               КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
Показать
+
3. makiiim 14.12.15 15:41 Сейчас в теме
не совсем. Речь идет не о начальной странице, а о новой возможности платформы 8.3.7 : http://v8.1c.ru/o7/201502wnds/index.htm . Закрепить форму ( в моем случае снизу) только нужно сделать программно, чтобы менеджер не мог ее открепить и закрыть.
+
4. ЧерныйКот 14.12.15 16:01 Сейчас в теме
тогда с этим попробуйте
		НастройкиИнтерфейсаАдмин = Новый НастройкиИнтерфейсаКлиентскогоПриложения;
		СоставИнтерфейсаАдмин = НастройкиИнтерфейсаАдмин.ПолучитьСостав();
		Для Каждого Эл Из СоставИнтерфейсаАдмин.Верх Цикл
			// действия
		КонецЦикла;
		СоставИнтерфейсаАдмин.Низ.Очистить();
		СоставИнтерфейсаАдмин.Низ.Добавить(Новый ЭлементНастройкиСоставаИнтерфейсаКлиентскогоПриложения("ПанельОткрытых"));
		НастройкиИнтерфейсаАдмин.УстановитьСостав(СоставИнтерфейсаАдмин);
Показать
+
5. makiiim 15.12.15 11:24 Сейчас в теме
Опять не то. При открытии 1С у меня открывается форма отчета по продажам план/факт (+ формируется отчет). необходимо сделать так чтобы когда пользователь открывает любую форму чего угодно( например список номенклатуры, карточку контрагента, список документов, конкретный документ) экран делился на 2 части: сверху то что он открыл а снизу сформированный отчет по продажам план/факт, чтобы он постоянно видел что не выполняет план и ему нужно работать. Вот такая хотелка руководства. Механизм добавлен как я понимаю только в 8.3.7 ( http://v8.1c.ru/o7/201502wnds/index.htm) - есть описание как сделать в пользовательском режиме, а как и возможно ли сделать программно не понятно...
tmh_mazin_p; +1
6. dj_serega 391 15.12.15 11:31 Сейчас в теме
(5) makiiim, а что есть в "ХранилищеСистемныхНастроек"?
+
7. makiiim 15.12.15 11:57 Сейчас в теме
(6) что вы хотите услышать, не понял: настройки начальной страницы, настройки интерфейса клиентского приложения ... и т.д
+
8. dj_serega 391 15.12.15 12:23 Сейчас в теме
(7) makiiim, Вот есть обработка http://infostart.ru/public/290483/ , которая программно переключает режим компактности.
По этому программному методу, я инфы не видел от 1С. Но... люди найшли способ.

Скорее всего, есть не описанный метод и по Вашему заданию. Нужно поковыряться в хранилищах настроек.
+
9. intehof 04.05.16 11:46 Сейчас в теме
Временно, пока 1сники не реализуют функции работы с окнами, сделал скриптом: При открытии формы

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ЗакрыватьПриВыборе = Ложь;
	ЗакрыватьПриЗакрытииВладельца = Истина;
	//ЗакрепитьСправа после открытия формы;
	ПодключитьОбработчикОжидания("ЗакрепитьСправа",0.1,Истина);
КонецПроцедуры

&НаКлиенте
Процедура ЗакрепитьСправа()
    Если ЭтаФорма.ВводДоступен() Тогда
		WSHShell = Новый COMОбъект("WScript.Shell");
		WSHShell.SendKeys("%");
		WSHShell.SendKeys("{DOWN 5}");
		WSHShell.SendKeys("{RIGHT}");
		WSHShell.SendKeys("{UP 5}");
		WSHShell.SendKeys("{ENTER}");
        ОтключитьОбработчикОжидания("ЗакрепитьСправа");
    КонецЕсли;
КонецПроцедуры;
Показать
DrAku1a; Timic; Nkolp; user624351_support; seller7; dachnik; HAMMER_59; vvp117; German; Dvornik; LsrGroup; PORGY3000; +12
10. LsrGroup 15.09.16 18:03 Сейчас в теме
Может заодно кто подскажет, как после открытия и закрепления (например как предлагается в (9) ) установить нужную ширину окна?
+
12. Nkolp 16 08.04.19 16:21 Сейчас в теме
(9) в продолжение )
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
   //Закрепить Справа или Сверху после открытия формы;
   //ПодключитьОбработчикОжидания("ЗакрепитьСправа",0.1,Истина);
   ПодключитьОбработчикОжидания("ЗакрепитьСверху",0.1,Истина);
КонецПроцедуры
&НаКлиенте
Процедура ЗакрепитьСверху()
    Если ЭтаФорма.ВводДоступен() Тогда
        WSHShell = Новый COMОбъект("WScript.Shell");
        WSHShell.SendKeys("%");
	WSHShell.SendKeys("{RIGHT 12}");
        WSHShell.SendKeys("{DOWN 5}");
       	WSHShell.SendKeys("{ENTER}");
        ОтключитьОбработчикОжидания("ЗакрепитьСверху");
    КонецЕсли;
КонецПроцедуры


&НаКлиенте
Процедура ЗакрепитьСправа()
    Если ЭтаФорма.ВводДоступен() Тогда
        WSHShell = Новый COMОбъект("WScript.Shell");
        WSHShell.SendKeys("%");
        WSHShell.SendKeys("{DOWN 5}");
		WSHShell.SendKeys("{RIGHT}");
		WSHShell.SendKeys("{UP 5}");
        WSHShell.SendKeys("{ENTER}");
        ОтключитьОбработчикОжидания("ЗакрепитьСправа");
    КонецЕсли;
КонецПроцедуры
Показать
tmh_mazin_p; +1
11. dachnik 26 03.04.18 14:33 Сейчас в теме
Случайно не реализовали еще в последних релизах платформы программное управление выводом форм в окно интерфейса "Такси"?
+
13. g1uk 19.07.19 14:32 Сейчас в теме
Шел 2019 год, релиз 8.3.15.... Не реализовали еще?
+
14. SeverBaP 5 28.08.19 16:19 Сейчас в теме
19. intehof 04.03.20 22:27 Сейчас в теме
(13)
(15)
(16)
Сделал внешнюю компоненту Native на C++ для использования методов Windows API
Общий модуль приложения:
Перем глCallWindowsAPI Экспорт;
Процедура ПриНачалеРаботыСистемы()
	МенеджерОборудованияКлиент.ПодключитьМетодыWindowsAPI();	
КонецПроцедуры


Процедуры в общем модуле (Клиент):
Процедура ПодключитьМетодыWindowsAPI() Экспорт
	КомпонентаУстановлена = ПодключитьВнешнююКомпоненту("ОбщийМакет.CallWindowsAPI", "CallWindowsAPI", ТипВнешнейКомпоненты.Native); 
	Если КомпонентаУстановлена Тогда
		глCallWindowsAPI = Новый ("AddIn.CallWindowsAPI.CallWindowsAPI");	
	Иначе
		ОповещениеПодключения = Новый ОписаниеОповещения("НачатьУстановкуВнешнейКомпонентыЗавершение", ЭтотОбъект,);
		НачатьУстановкуВнешнейКомпоненты(ОповещениеПодключения, "ОбщийМакет.CallWindowsAPI");
	КонецЕсли;	
КонецПроцедуры 

Процедура НачатьУстановкуВнешнейКомпонентыЗавершение(ДополнительныеПараметры) Экспорт 
	ПодключитьВнешнююКомпоненту("ОбщийМакет.CallWindowsAPI", "CallWindowsAPI", ТипВнешнейКомпоненты.Native);
	глCallWindowsAPI = Новый ("AddIn.CallWindowsAPI.CallWindowsAPI");
КонецПроцедуры 
Показать


И код в форме подбора:
// в моей конфе настроено расположение окон и я знаю что от левого верхнего угла со смещением x+208, y+128 попадаю в заголовок окна, нажимаю правой кнопкой мыши и далее кнопками попадаю в нужный пункт меню.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ПодключитьОбработчикОжидания("ЗакрепитьСправа",0.1,Истина);
КонецПроцедуры

&НаКлиенте
Процедура ЗакрепитьСправа()
	Если ЭтаФорма.ВводДоступен() Тогда
		ПозицияКурсора = глCallWindowsAPI.GetCursorPosition();
		ПозицияОкна = глCallWindowsAPI.GetActiveWindowPosition();
		масссивПозицияКурсора = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПозицияКурсора, ",", Истина);
		масссивПозицияОкна = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПозицияОкна, ",", Истина);
		глCallWindowsAPI.ClickRightButtonMouse(Число(масссивПозицияОкна[0])+208,Число(масссивПозицияОкна[1])+128);
		WSHShell = Новый COMОбъект("WScript.Shell");
		WSHShell.SendKeys("{DOWN 3}");
		WSHShell.SendKeys("{ENTER}");
		глCallWindowsAPI.SetCursorPosition(Число(масссивПозицияКурсора[0]),Число(масссивПозицияКурсора[1]));
    КонецЕсли;
КонецПроцедуры
Показать


Позднее закину исходники. Можно будет любой метод WinAPI самостоятельно впихнуть в dll.
Прикрепленные файлы:
CallWindowsAPI.zip
Pawlick; +1
15. HAMMER_59 245 01.10.19 08:06 Сейчас в теме
Вышло новое обновление платформы, сменился интерфейс, перестал работать вариант посылки горячих клавиш через виндовс скрипт хост.

Может, появилось какое-нибудь другое решение? Пользователи уже привыкли работать с прикрепленным окном, теперь страдают.
+
16. FIGOR 20.01.20 13:03 Сейчас в теме
Тоже есть проблема в 8.3.15 попасть программно в меню окна "Окно" и его "Закрепить слева"
+
17. intehof 13.02.20 03:29 Сейчас в теме
Для версий с 8.3.15 пробую колхоз.

по мотивам Win 32 API в 1C: https://infostart.ru/public/18636/

Идея: нажать мышкой в нужном месте
Алгоритм: Запомнить положение курсора мыши, найти положение угла-право-верх окна 1С x,y, установить курсор со сдвигом x-50, y+120? нажать мышь, отпустить мышь, далее SendKeys, а затем вернуть курсор в начальное состояние.

качаем компоненту для работы с WinApi: http://dynwrapx.script-coding.com/dwx/pages/dynwrapx.php?lang=en
регистрируем обе (для 64bit OS):

regsvr32 "c:\Windows\System32\dynwrapx.dll" //сюда из папки 64
regsvr32 "c:\Windows\SysWoW64\dynwrapx.dll" - //сюда из папки 32

Код 1С:
&НаКлиенте
Процедура ЗакрепитьСправа()
	Если ЭтаФорма.ВводДоступен() Тогда
		WSHShell = Новый COMОбъект("WScript.Shell");
		Wrap = Новый COMОбъект("DynamicWrapperX");
		//инициалицация методов, про параметры не знаю.
		Wrap.Register("USER32.DLL", "GetCursorPos"		, "i=p", "r=l");		//получение координат курсора
		Wrap.Register("USER32.DLL", "SetCursorPos"		, "i=ll", "f=s", "r=l");//установка координат курсора
		Wrap.Register("USER32.DLL", "GetActiveWindow"	, "i=l" , "f=s", "r=l");//получение активного окна, дескриптор
		Wrap.Register("USER32.DLL", "GetWindowRect"		, "i=lp", "r=l"); 		//координаты окна
		Wrap.Register("user32.dll", "mouse_event"		, "i=uuuuu", "f=s");	//нажатие кнопки мыши
		
		// текущие координаты курсора
		Rect = Wrap.Space(128); //2DWORD 
		pStr = Wrap.StrPtr(Rect); //указатель
		Wrap.GetCursorPos(Rect);
		CurX = Wrap.NumGet(pStr,0,"l");
		CurY = Wrap.NumGet(pStr,4,"l");
		
		// дексриптор активного окна
		HWND = Wrap.GetActiveWindow(1);
		
		// координаты правого верхнего угла окна 1С
		Rect = Wrap.Space(256); //4DWORD
		pStr = Wrap.StrPtr(Rect);  //указатель
		Wrap.GetWindowRect(HWND, Rect);
		top = Wrap.NumGet(pStr,4,"l");
		right = Wrap.NumGet(pStr,8,"l");
		
		// поправка вылезания за экран
		МассивЭкранов = ПолучитьИнформациюЭкрановКлиента();
		ШиринаЭкрана = МассивЭкранов[0].Ширина;
		ВысотаЭкрана = МассивЭкранов[0].Высота;
		Если top < 0 Тогда top = 0 КонецЕсли;
		Если right > ШиринаЭкрана Тогда right = ШиринаЭкрана КонецЕсли;
		
		// устанавливаем курсор на кнопку 
		Wrap.SetCursorPos(right-50,top+120);
		// можно двигать мышкой по-другому
		//Wrap.mouse_event(32769, Окр((right-50)*65535/ШиринаЭкрана), Окр((top+120)*65535/ВысотаЭкрана), 0, 0); //32769-событие перемещения

		// нажимаем и отпускаем левую кнопку мыши
		Wrap.mouse_event(2, 0, 0, 0, 0); 
		Wrap.mouse_event(4, 0, 0, 0, 0);
		
		// стрелками идем к нужному пункту
		WSHShell.SendKeys("{DOWN}");
		WSHShell.SendKeys("{RIGHT}");
		WSHShell.SendKeys("{DOWN 3}");
		WSHShell.SendKeys("{ENTER}");
		
		// возвращаем курсор мыши на место
		Wrap.SetCursorPos(CurX,CurY);
    КонецЕсли;
КонецПроцедуры
Показать
+
18. intehof 13.02.20 08:56 Сейчас в теме
(17)
тестировал на версии 1С 8.3.16.1148 x86
На локальном компе Win10 работает, по RDP Win7 работает.

Но ни как не получается заставить работать на терминальном сервере Win2012R2

Новый COMОбъект("DynamicWrapperX")
выводит ошибку "класс не зарегистрирован"

Может какой добрый человек скомпилирует нативную компоненту для 1С по приведенному выше алгоритму.
+
20. Ozhered 04.01.21 10:38 Сейчас в теме
Если вопрос еще актуален, то на 8.3.17 для закрепления справа работает следующая конструкция:

WSHShell.SendKeys("%(-)");
WSHShell.SendKeys("{DOWN 2}");
WSHShell.SendKeys("{RIGHT}");
WSHShell.SendKeys("{DOWN 3}");
WSHShell.SendKeys("{ENTER}");
dr_dom; +1
21. dr_dom 58 04.02.21 17:05 Сейчас в теме
(20) Получилось, только в моем случае было
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ЗакрыватьПриВыборе = Ложь;
    ЗакрыватьПриЗакрытииВладельца = Истина;
    //ЗакрепитьСправа после открытия формы;
    ПодключитьОбработчикОжидания("ЗакрепитьСправа",0.1,Истина);
КонецПроцедуры

&НаКлиенте
Процедура ЗакрепитьСправа()
    Если ЭтаФорма.ВводДоступен() Тогда
        WSHShell = Новый COMОбъект("WScript.Shell");
        WSHShell.SendKeys("%(-)");
        WSHShell.SendKeys("{DOWN 1}");
        WSHShell.SendKeys("{RIGHT}");
        WSHShell.SendKeys("{DOWN 3}");
        WSHShell.SendKeys("{ENTER}");
        ОтключитьОбработчикОжидания("ЗакрепитьСправа");
    КонецЕсли;
КонецПроцедуры;
Показать
fravol; +1
Внимание! Тема сдана в архив

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