|   |   | 
| 
 | 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) Это ж просто - если Идентификатор Реквизита совпадает с идентификатором реквизита объекта - то это Реквизит справочника.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |