|
v7: Программно вывести на форму кнопку с привязкой обработчика можно? | ☑ | ||
---|---|---|---|---|
0
Chai Nic
22.08.23
✎
17:04
|
Используя formex и т.п. внешние компоненты, хочется, чтобы в каждом документе (без ручного прописывания) появилась некая кнопка, которая бы открывала скажем общий журнал документов, с позиционированием на текущем. Идеально было бы разместить эту кнопку в панели инструментов формы.
Это возможно сделать? |
|||
1
Chai Nic
22.08.23
✎
19:42
|
Нашел способ. Можно вызвать нижеуказанную процедуру в ПослеОткрытия(Конт), убедившись что находимся в контексте формы документа. Не идеально (после изменения размера формы кнопка не переползает), но работает.
Процедура ДобавитьКнопкуПереходаВЖурнал(Конт) Расш=СоздатьОбъект("РасширениеФормы"); Расш.УстановитьФорму(Конт.Форма); Кнопка=Расш.ДобавитьАтрибут("КнопкаПерейтиКЖурналу",3); Кнопка.Формула="ОткрытьФорму(""Журнал.Общий"",ТекущийДокумент());"; Кнопка.Заголовок="Ж"; Кнопка.Подсказка="Перейти в журнал"; Кнопка.УстановитьКоординаты(Расш.Ширина-20,1,20,20); КонецПроцедуры |
|||
2
Злопчинский
22.08.23
✎
23:22
|
Поздравляю!
|
|||
3
Duke1C
23.08.23
✎
12:42
|
(0) Конфигурация не типовая чтоль?
|
|||
4
Duke1C
23.08.23
✎
12:44
|
А то в типовых в каждом документе есть кнопка "Действия", а там "Перейти в журнал"
|
|||
5
Chai Nic
23.08.23
✎
12:55
|
(3) Да, нетиповая.
|
|||
6
Злопчинский
23.08.23
✎
12:59
|
А смысл?
в этом самопальном велосипеде что - вмдов документов несколько сотен? проще сваять кнопку с формулой к глобальной процедуре и полвесить жестко на форму. Потом тупо копипастом размножить на остальные документы. чем не подходит? |
|||
7
Chai Nic
23.08.23
✎
13:06
|
(6) А лень. Глобально проще)
|
|||
8
Chai Nic
23.08.23
✎
13:06
|
+(7) Сотен не сотен, но до полусотни наберется
|
|||
9
Злопчинский
23.08.23
✎
17:12
|
(8) один хрен код в каждый вставлять придётся тем или иным образом.
|
|||
10
Злопчинский
23.08.23
✎
17:13
|
Чисто интересно что за самопи, ка, в какой области использования?
|
|||
11
Chai Nic
23.08.23
✎
17:17
|
(9) Неа. В том то и суть, что достаточно глобального модуля. И в каждой форме появится кнопка.
|
|||
12
Chai Nic
23.08.23
✎
17:18
|
(10) Бухгалтерия и производство, с конца 90-х дорабатывается и переписывается
|
|||
13
Злопчинский
23.08.23
✎
17:32
|
(11) а Конт откуда возьмёшь? Как он в процедуру передаваться будет?
|
|||
14
Chai Nic
23.08.23
✎
17:56
|
(13) Это магия. Возникает после подключения внешней компоненты formex.
|
|||
15
Djelf
23.08.23
✎
20:30
|
Я хотел как-то такое впилить в почти типовую и убрать все кнопки, и делать их программно, но что-то меня остонавило...
Видимо лень или жаба... Скорее первое, чем второе. |
|||
16
Злопчинский
23.08.23
✎
21:19
|
(14) сомневаюсь, растолкуй
|
|||
17
Злопчинский
23.08.23
✎
21:37
|
Тем более что фигурирует ПослеОткрытия()
А такой глобальное пред определённой у формекса вроде нет... |
|||
18
Chai Nic
24.08.23
✎
06:23
|
(17) Цитата из документации формекса
-- Порядок вызова Первоначально предопределенная процедура ищется в модуле активной формы. Если процедура присутствует в модуле формы, то она вызывается. В противном случае процедура ищется во всех загруженных глобальных модулях, в порядке их загрузки, начиная с основного глобального модуля. Вызов дополнительных предопределенных процедур сквозной. Т.е. не останавливается после первой найденной процедуры, а идет дальше, через локальный контекст, основной глобальный модуль и все дополнительный глобальные модули. |
|||
19
Bigbro
24.08.23
✎
06:38
|
мне когда требовалось в ПриОткрытии в каждый объект конфы дописать вызов своей процедуры - разобрал через gcomp в тексты прописал вызов батником и собрал обратно.
или в ПриЗаписи уже не помню |
|||
20
Злопчинский
24.08.23
✎
08:09
|
(18) ты ж смотри, действительно!
. вот это не понял "Вызов дополнительных предопределенных процедур сквозной. Т.е. не останавливается после первой найденной процедуры, а идет дальше, через локальный контекст, основной глобальный модуль и все дополнительный глобальные модули." |
|||
21
Злопчинский
24.08.23
✎
08:10
|
(19) у Альфа для этого вроде как раз был сделан Inserter
|
|||
22
Chai Nic
24.08.23
✎
08:11
|
Я вообще хотел в "ПослеОбновленияФормы" вписать, чтобы кнопка всегда была в правом верхнем углу даже при изменении размеров окна, но там при попытке изменения размеров и положения кнопки наглухо вылетает 1с. Очевидно, изменение элемента формы вызывает событие обновления, и происходит внутреннее зацикливание.
|
|||
23
АгентБезопасной Нацио
24.08.23
✎
08:23
|
Такое замечательно делается через Перехватчик. С анализом прав пользователя (т.е. кнопки только у тех документов, в которых пользователям разрешены действия, с учетом даты запрета, персональных разрешений) и всё такое
|
|||
24
Chai Nic
24.08.23
✎
19:34
|
(23) Перехватчик тут не нужен, и без него всё перехватывается.
|
|||
25
Злопчинский
24.08.23
✎
22:08
|
(24) Перехватывается что?
(22) изменил размеры окна, через ОО (например, или как-то иначе) считал новые координаты, переместил кнопку... |
|||
26
Chai Nic
24.08.23
✎
22:22
|
(25)
"Перехватывается что?" ПослеОткрытия срабатывает в глобальном модуле с автоматической передачей контекста. "изменил размеры окна, через ОО (например, или как-то иначе) считал новые координаты, переместил кнопку." Можно пример? Каким событием ловится изменение размера окна? Я пробовал через ПослеОбновленияФормы, но 1с вылетает при попытке изменить положение кнопки в этом обработчике. |
|||
27
Злопчинский
24.08.23
✎
23:06
|
(26) для начала тупо
в ПослеОбновленияФормы запустить ОО с коротким таймингом (50-100-200 подобрать, 50 обычно хватает) и уже в ОО, когда обновление формы отработало - отрисовать кнопку на новом месте. Ну и держать флажок 1/0 чтобы в цикл обновления не уйти... . событие размера окна - ну так же ж формексовская же ж Процедура ПриИзмененииРазмераОкна(<Контекст>,<ТипСобытия>,<Ширина>,<Высота>) . ? |
|||
28
victuan1
25.08.23
✎
04:16
|
(27) Возможно, не все поняли что такое ООО (обработка ожидания).
|
|||
29
DJ Anthon
25.08.23
✎
05:38
|
я делал контекстное меню для правой кнопки мыши, где можно было прямо из формы записать, провести, пометить на удаление, перейти в список, получить инфу об объекте, и т. д.
|
|||
30
Chai Nic
25.08.23
✎
06:30
|
(29) Хорошая идея, надо будет так тоже сделать. Только придется для сохранения стандартного поведения перебирать атрибуты формы с проверкой, не попал ли курсор мыши на то, где ПКМ должна отрабатывать штатно.
|
|||
31
DJ Anthon
25.08.23
✎
07:58
|
а где в v7 она отрабатывает штатно? могу скинуть код, мне он уже не нужон
|
|||
32
Chai Nic
25.08.23
✎
08:02
|
(31) Ну например на полях ввода появляется контекстное меню с копировать-вставить. Или на табличных частях, где то же, плюс возможность двигать строки. Это штатное поведение ПКМ, которое надо сохранить.
"могу скинуть код" Да, было бы неплохо |
|||
33
vladmenleo
25.08.23
✎
08:07
|
(32) Делал контекстное меню с табличным полем, там вообще хорошо есть событие Держи код может пригодится
Процедура КнопкаТабПолеПриКонтекстномМеню(ТП,ТипРегиона, Кол,Стр) Если ТипРегиона <> 3 Тогда Возврат; КонецЕсли; Попытка лДок = ТП.ТекущиеДанные.Док; Исключение лДок = ПолучитьПустоеЗначение("Документ"); КонецПопытки; Если ПустоеЗначение(лДок) = 1 Тогда Возврат; КонецЕсли; Док=СоздатьОбъект("Документ"); Док.НайтиДокумент(лДок); СП = СоздатьОбъект("СписокЗначений"); СП.ДобавитьЗначение(1,"[icon:1]Новый" + СимволТабуляции + СимволТабуляции + СимволТабуляции + "Insert"); СП.ДобавитьЗначение(12, "[icon:2]Открыть" + СимволТабуляции + СимволТабуляции + СимволТабуляции + "Shift+Enter"); Если лДок.Проведен() = 1 Тогда СП.ДобавитьЗначение(10, "[icon:22]Открыть операцию"); КонецЕсли; СП.ДобавитьЗначение(4,"[icon:21]Просмотр"); СП.ДобавитьЗначение(8,"[icon:3]Копировать" + СимволТабуляции + СимволТабуляции + "F9"); СП.ДобавитьЗначение(3, "[icon:4]" + ?(лДок.ПометкаУдаления() = 1,"Снять пометку удаления", "Пометить на удаление") + СимволТабуляции + "Del"); СП.ДобавитьЗначение(9,"[icon:9]Ввести на основании" + СимволТабуляции + "Alt + F9"); СП.ДобавитьЗначение("-"); Если лДок.Проведен() = 1 Тогда СП.ДобавитьЗначение(2,"Сделать не проведенным"); СП.ДобавитьЗначение(7,"[icon:19]Движения документа"); КонецЕсли; СП.ДобавитьЗначение(5,"[icon:20]Подчиненные документы"); СП.ДобавитьЗначение(6,"[icon:16]Дерево документов"); зн = 1; глСервис = СоздатьОбъект("Сервис"); Если глСервис.ВыбратьЗначение(СП,зн, "Выберите действие с докуменом ", 0, 2, КартинкаМеню) <> 1 Тогда Возврат; КонецЕсли; Если зн = 1 Тогда НовыйДок(); ИначеЕсли зн = 8 Тогда // новый копирование НовыйКопированием(); ИначеЕсли зн = 9 Тогда // ввести на основании НовыйДок(1); ИначеЕсли зн = 2 Тогда ОтменитьПроведениеДок(); ИначеЕсли зн = 3 Тогда УдалитьДок(); ИначеЕсли зн = 4 Тогда // Просмотр ОткрытьФорму(Док.ТекущийДокумент(),,1); ИначеЕсли зн = 12 Тогда // Открыть ОткрытьФорму(Док.ТекущийДокумент()); ИначеЕсли зн = 10 Тогда // Открыть операцию Конт = ""; ОткрытьФорму("Операция", Конт, Док.ТекущийДокумент()); ИначеЕсли зн = 5 Тогда ОткрытьФорму("Журнал.Подчиненные.ФормаСписка",,Док.ТекущийДокумент()); ИначеЕсли зн = 6 Тогда глСформироватьДеревоДокументов(Док.ТекущийДокумент()); ИначеЕсли зн = 7 Тогда глСервис.ОткрытьДвиженияОбъекта(Док.ТекущийДокумент()); КонецЕсли; КонецПроцедуры // КнопкаТабПолеПриКонтекстномМеню() Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Alt, Shift, Ctrl, Символ, ФСО) Если КодКлавиши = 27 Тогда ФСО = 0; ИначеЕсли (КодКлавиши = 13) и (Shift = 1) и (Alt = 0) и (Ctrl = 0) Тогда // Открыть Shift+Enter ФСО = 0; РедактироватьДок(); ИначеЕсли (КодКлавиши = 45) и (Shift = 0) и (Alt = 0) и (Ctrl = 0) Тогда // Новый Insert ФСО = 0; НовыйДок(); ИначеЕсли (КодКлавиши = 46) и (Shift = 0) и (Alt = 0) и (Ctrl = 0) Тогда // Del ФСО = 0; УдалитьДок(); ИначеЕсли (КодКлавиши = 120) и (Shift = 0) и (Alt = 0) и (Ctrl = 0) Тогда // F9 ФСО = 0; НовыйКопированием(); ИначеЕсли (КодКлавиши = 120) и (Shift = 0) и (Alt = 1) и (Ctrl = 0) Тогда // на основании Alt + F9 ФСО = 0; НовыйДок(1); КонецЕсли; КонецПроцедуры |
|||
34
DJ Anthon
25.08.23
✎
08:12
|
(32) не, я сделал на свободном месте формы чтобы щелкать. между полями, например ) кажется, через формекс это было. самое интересное в том, что открытый документ блокируется и его нельзя сдвинуть по времени или пометить на удаление прямо из формы, но я нашел способ. если его развернуть во весь экран (а потом обратно), но на микросекунду он разблокируется. в этот момент и происходит выполнение контекстно зависимого кода. костыль, но я другого способа не нашёл, как не меняя форму что-то сделать с документом.
|
|||
35
DJ Anthon
25.08.23
✎
08:13
|
скину, как комп распакую, я только переехал )
|
|||
36
Djelf
25.08.23
✎
08:50
|
(1) Кнопку надо создавать в ПослеСозданияФормы(Конт), т.е. до момента автопривязок формы, а она присходить где-то в момент между ПослеСозданияФормы и ПослеОткрытия.
|
|||
37
Arbuz
25.08.23
✎
17:38
|
(34) Не в первый раз слышу уже такое ("если его развернуть во весь экран (а потом обратно), но на микросекунду он разблокируется"), вот бы увидеть подтверждение. Что-то верится с трудом.
|
|||
38
Злопчинский
25.08.23
✎
18:42
|
(34) "в этот момент"- в какой? как отловить этот момент? и запустить в нем код?
|
|||
39
DJ Anthon
28.08.23
✎
21:33
|
md, doc, dll, exe, ert:
https://files.fm/u/327b94wep или тестовая база, если так удобнее https://files.fm/u/hc6wm2dyj (37) можете проверить сами. правда, парочку действий я выполняю, закрыв просто форму и открыв снова, тут я чутка приврал по памяти, но, например, заполнение или очистка табличной части работает именно через описанный выше механизм. (38) в комментах всё описано (в глобальном модуле), но учтите, что это было 13 лет назад, с чувством юмора у меня тогда было плохо ;) |
|||
40
DJ Anthon
28.08.23
✎
21:39
|
для лл https://yapx.ru/image/WaS3w
|
|||
41
Злопчинский
29.08.23
✎
01:01
|
я тут наткнулся на то, что в открытой форме элемента справочника - просто так поменять родителя - фиг вам... Говорит "Объект не может быть перепозиционирован"
. воспроизвести: на форму элемент аспр положить кнопку с действием Родитель = ""; |
|||
42
DJ Anthon
29.08.23
✎
05:31
|
(41) а через закрытие-открытие формы?
|
|||
43
Злопчинский
29.08.23
✎
11:20
|
Это как?
|
|||
44
DJ Anthon
29.08.23
✎
11:47
|
(43) сохранить значения, закрыть форму, поменять родителя в справочнике, открыть форму, загрузить значения. ну вон как я сделал )
|
|||
45
Djelf
29.08.23
✎
12:09
|
(41) Ты хотел чего то иного, кроме того что написано в СП?
|
|||
46
Злопчинский
29.08.23
✎
13:04
|
(44) э, это неспортивно! такой хоккей нам не нужен! ;-)
(45) вот оно что... (44) можно и по другому, вывернуться можно различными способами |
|||
47
АгентБезопасной Нацио
29.08.23
✎
14:58
|
(46) Пиши прямым запросом :-)
|
|||
48
Arbuz
29.08.23
✎
17:22
|
(39) Ну, как я и говорил - никакой эксклюзивной магии "микросекундного разблокирования", всё делается "закрыв просто форму и открыв снова" ;р
|
|||
49
Djelf
29.08.23
✎
17:46
|
(48) Просто не пишите в него так (с)1С ;)
|
|||
50
Злопчинский
29.08.23
✎
22:32
|
(48) сильно много гемора. надо сохранять состояние контекста формы в части измененных реквизитов...
|
|||
51
Злопчинский
29.08.23
✎
22:33
|
при этом надо понять - какие реквизиты формы есть реквизиты справочника, а какие - просто реквизиты формы...
|
|||
52
АгентБезопасной Нацио
30.08.23
✎
08:35
|
(51) Это ж просто - если Идентификатор Реквизита совпадает с идентификатором реквизита объекта - то это Реквизит справочника.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |