Подскажите, пожалуйста: возможно ли программно закрепить окно формы в 8.3.7 при открытии ( имеется в виду новая возможность «Одновременное отображение двух окон в интерфейсе Такси»). на сайте ИТС есть только описание из режима Предприятие, а как сделать и можно ли сделать это программно ни слова не сказано Источник: ©
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Типа того? это для начальной страницы.
УстановитьПривилегированныйРежим(Истина);
НастройкиРабСтолаАдмин = Новый НастройкиНачальнойСтраницы;
СоставФормАдмин = НастройкиРабСтолаАдмин.ПолучитьСоставФорм();
СоставФормАдмин.ЛеваяКолонка.Очистить();
СоставФормАдмин.ПраваяКолонка.Очистить();
СоставФормАдмин.ЛеваяКолонка.Добавить("Задача.Задача1.ФормаСписка");
СоставФормАдмин.ПраваяКолонка.Добавить("Отчет.Отчет1.Форма");
НастройкиРабСтолаАдмин.УстановитьСоставФорм(СоставФормАдмин);
Если ТекСотрудник.Роль = "Администратор" Тогда
ХранилищеСистемныхНастроек.Сохранить("Общее/НастройкиНачальнойСтраницы",,НастройкиРабСтолаАдмин,,СокрЛП(ПользовательИнфБазы.Имя));
ХранилищеСистемныхНастроек.Сохранить("Общее/НастройкиИнтерфейсаКлиентскогоПриложения",,НастройкиИнтерфейсаАдмин,,СокрЛП(ПользовательИнфБазы.Имя));
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
Показать
не совсем. Речь идет не о начальной странице, а о новой возможности платформы 8.3.7 : http://v8.1c.ru/o7/201502wnds/index.htm . Закрепить форму ( в моем случае снизу) только нужно сделать программно, чтобы менеджер не мог ее открепить и закрыть.
тогда с этим попробуйте
НастройкиИнтерфейсаАдмин = Новый НастройкиИнтерфейсаКлиентскогоПриложения;
СоставИнтерфейсаАдмин = НастройкиИнтерфейсаАдмин.ПолучитьСостав();
Для Каждого Эл Из СоставИнтерфейсаАдмин.Верх Цикл
// действия
КонецЦикла;
СоставИнтерфейсаАдмин.Низ.Очистить();
СоставИнтерфейсаАдмин.Низ.Добавить(Новый ЭлементНастройкиСоставаИнтерфейсаКлиентскогоПриложения("ПанельОткрытых"));
НастройкиИнтерфейсаАдмин.УстановитьСостав(СоставИнтерфейсаАдмин);
Показать
Опять не то. При открытии 1С у меня открывается форма отчета по продажам план/факт (+ формируется отчет). необходимо сделать так чтобы когда пользователь открывает любую форму чего угодно( например список номенклатуры, карточку контрагента, список документов, конкретный документ) экран делился на 2 части: сверху то что он открыл а снизу сформированный отчет по продажам план/факт, чтобы он постоянно видел что не выполняет план и ему нужно работать. Вот такая хотелка руководства. Механизм добавлен как я понимаю только в 8.3.7 ( http://v8.1c.ru/o7/201502wnds/index.htm) - есть описание как сделать в пользовательском режиме, а как и возможно ли сделать программно не понятно...
(7) makiiim, Вот есть обработка http://infostart.ru/public/290483/ , которая программно переключает режим компактности.
По этому программному методу, я инфы не видел от 1С. Но... люди найшли способ.
Скорее всего, есть не описанный метод и по Вашему заданию. Нужно поковыряться в хранилищах настроек.
По этому программному методу, я инфы не видел от 1С. Но... люди найшли способ.
Скорее всего, есть не описанный метод и по Вашему заданию. Нужно поковыряться в хранилищах настроек.
Временно, пока 1сники не реализуют функции работы с окнами, сделал скриптом: При открытии формы
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЗакрыватьПриВыборе = Ложь;
ЗакрыватьПриЗакрытииВладельца = Истина;
//ЗакрепитьСправа после открытия формы;
ПодключитьОбработчикОжидания("ЗакрепитьСправа",0.1,Истина);
КонецПроцедуры
&НаКлиенте
Процедура ЗакрепитьСправа()
Если ЭтаФорма.ВводДоступен() Тогда
WSHShell = Новый COMОбъект("WScript.Shell");
WSHShell.SendKeys("%");
WSHShell.SendKeys("{DOWN 5}");
WSHShell.SendKeys("{RIGHT}");
WSHShell.SendKeys("{UP 5}");
WSHShell.SendKeys("{ENTER}");
ОтключитьОбработчикОжидания("ЗакрепитьСправа");
КонецЕсли;
КонецПроцедуры;
Показать
(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}");
ОтключитьОбработчикОжидания("ЗакрепитьСправа");
КонецЕсли;
КонецПроцедуры
Показать
(13)
(15)
(16)
Сделал внешнюю компоненту Native на C++ для использования методов Windows API
Общий модуль приложения:
Процедуры в общем модуле (Клиент):
И код в форме подбора:
// в моей конфе настроено расположение окон и я знаю что от левого верхнего угла со смещением x+208, y+128 попадаю в заголовок окна, нажимаю правой кнопкой мыши и далее кнопками попадаю в нужный пункт меню.
Позднее закину исходники. Можно будет любой метод WinAPI самостоятельно впихнуть в dll.
(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
Вышло новое обновление платформы, сменился интерфейс, перестал работать вариант посылки горячих клавиш через виндовс скрипт хост.
Может, появилось какое-нибудь другое решение? Пользователи уже привыкли работать с прикрепленным окном, теперь страдают.
Может, появилось какое-нибудь другое решение? Пользователи уже привыкли работать с прикрепленным окном, теперь страдают.
Для версий с 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С:
по мотивам Win 32 API в 1C:
Идея: нажать мышкой в нужном месте
Алгоритм: Запомнить положение курсора мыши, найти положение угла-право-верх окна 1С x,y, установить курсор со сдвигом x-50, y+120? нажать мышь, отпустить мышь, далее SendKeys, а затем вернуть курсор в начальное состояние.
качаем компоненту для работы с WinApi:
регистрируем обе (для 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);
КонецЕсли;
КонецПроцедуры
Показать
(17)
тестировал на версии 1С 8.3.16.1148 x86
На локальном компе Win10 работает, по RDP Win7 работает.
Но ни как не получается заставить работать на терминальном сервере Win2012R2
Новый COMОбъект("DynamicWrapperX")
выводит ошибку "класс не зарегистрирован"
Может какой добрый человек скомпилирует нативную компоненту для 1С по приведенному выше алгоритму.
тестировал на версии 1С 8.3.16.1148 x86
На локальном компе Win10 работает, по RDP Win7 работает.
Но ни как не получается заставить работать на терминальном сервере Win2012R2
Новый COMОбъект("DynamicWrapperX")
выводит ошибку "класс не зарегистрирован"
Может какой добрый человек скомпилирует нативную компоненту для 1С по приведенному выше алгоритму.
Если вопрос еще актуален, то на 8.3.17 для закрепления справа работает следующая конструкция:
WSHShell.SendKeys("%(-)");
WSHShell.SendKeys("{DOWN 2}");
WSHShell.SendKeys("{RIGHT}");
WSHShell.SendKeys("{DOWN 3}");
WSHShell.SendKeys("{ENTER}");
WSHShell.SendKeys("%(-)");
WSHShell.SendKeys("{DOWN 2}");
WSHShell.SendKeys("{RIGHT}");
WSHShell.SendKeys("{DOWN 3}");
WSHShell.SendKeys("{ENTER}");
(20) Получилось, только в моем случае было
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЗакрыватьПриВыборе = Ложь;
ЗакрыватьПриЗакрытииВладельца = Истина;
//ЗакрепитьСправа после открытия формы;
ПодключитьОбработчикОжидания("ЗакрепитьСправа",0.1,Истина);
КонецПроцедуры
&НаКлиенте
Процедура ЗакрепитьСправа()
Если ЭтаФорма.ВводДоступен() Тогда
WSHShell = Новый COMОбъект("WScript.Shell");
WSHShell.SendKeys("%(-)");
WSHShell.SendKeys("{DOWN 1}");
WSHShell.SendKeys("{RIGHT}");
WSHShell.SendKeys("{DOWN 3}");
WSHShell.SendKeys("{ENTER}");
ОтключитьОбработчикОжидания("ЗакрепитьСправа");
КонецЕсли;
КонецПроцедуры;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот