|
Динамическое добавление кнопки на форму без редактирования формы. (облегчаем обновление) | ☑ | ||
---|---|---|---|---|
0
efoi2___
12.07.18
✎
10:15
|
Всем доброго времени суток!
Столкнулся со следующей проблемой, вернее не проблемой, а идеей. В конфигурации УТ 10.3 необходимо добавить функционал в некоторое количество документов. Для реализации функционала достаточно добавить одну кнопку на форму, в КоманднуюПанельТовары. (использовать обработки заполнения ТЧ заказчик не хочет по религиозным соображениям (Кнопка должна быть видна сразу)). Естественно корежить кучу форм у меня желания нет. Коллеги по цеху предложили следующую идею - Создавать кнопку из общего модуля динамически. Т.е. находим процедуру, которая вызывается во всех документах при открытии - в моем случае это "УстановитьДоступностьПоляВводаНомера" там добавляем кнопку в форму с помощью "Элементы.КоманднаяПанельТовары.Кнопки.Добавить". В действия кнопки выбираем процедуру на форме в которой есть любая процедура или функция из общего модуля, а в этой процедуре прописываем уже логику доработки. Но есть проблема для логики доработки мне нужно получить форму, откуда была вызвана эта общая процедура, а так же нужно получить имя кнопки, чтобы остановить выполнение общей процедуры после моей логики. Соответственно в этой общей процедуре должны быть параметры "ЭтаФорма" и "Элемент". Я не смог найти такую процедуру во всех документах. И встает вопрос, как в общей процедуре понять, что она была вызвана именно моей динамической кнопкой если в ее параметрах нет "Элемент"а? Или может можно по полученной форме понять какая кнопка нажата? У кого есть идеи или опыт реализации чего-то подобного? Заранее всем спасибо! |
|||
1
Cyberhawk
12.07.18
✎
10:17
|
У формы "Текущий элемент" есть свойство?
|
|||
2
efoi2___
12.07.18
✎
10:18
|
(1) Есть, но в текущем элементе отображается текущее поле, а не кнопка.
|
|||
3
Mankubus
12.07.18
✎
10:33
|
(0) когда добавляешь кнопку программно видно в какую форму добавляешь? можно к имени кнопки добавлять имя документа/формы и т.д.
|
|||
4
efoi2___
12.07.18
✎
10:47
|
(3) Я не могу получить имя кнопки. т.к. в параметре элемента нет. Но могу получить форму, а соответственно и сам документ. А мне нужно понять, что процедура вызвана по нажатию кнопки, а не по стандартному вызову этой процедуры.
|
|||
5
Cyberhawk
12.07.18
✎
10:57
|
А, так ты в качестве обработчика кнопки делаешь типовой метод модуля формы?
|
|||
6
Cyberhawk
12.07.18
✎
10:58
|
Ну раз нет такого подходящего метода, то добавь в каждую форму свой универсальный метод наподобие "Подключаемый_ВыполнениеКоманды" и не парь мозг
|
|||
7
DrShad
12.07.18
✎
11:01
|
а не проще посмотреть как на форму добавляется обработка табличной части и сделать по аналогии?
|
|||
8
efoi2___
12.07.18
✎
11:14
|
(6) Не хочется изменять 12 форм. Мне проще в общем модуле 2 изменения учесть при обновлении, чем в 12 формах.
|
|||
9
efoi2___
12.07.18
✎
11:16
|
(7) тот вариант не подошел, я пробовал.
|
|||
10
hhhh
12.07.18
✎
11:27
|
(8) ну, добавление копипастом процедурки в 12 форм у вас займет 2 минуты 30 секунд, а так вы будете месяц трахаться со своими идеями.
|
|||
11
ponaroshku
12.07.18
✎
11:28
|
(0) реализовывала в упп
брала только не установку номера СоздатьКнопкиПечати() |
|||
12
ponaroshku
12.07.18
✎
11:28
|
(11) в модуле формированиепечатныхформ
|
|||
13
ponaroshku
12.07.18
✎
11:30
|
(10) не согласна
у нас УПП с доработками, формы периодически меняются, учесть все изменения, ковырять формы для корректного обновления базы 24/7 - моветон. Раз сделал программную прорисовку, следи за своим модулем, пусть программно прорисовывается кнопка |
|||
14
Кац
12.07.18
✎
11:46
|
обычные формы <> легкое обновление
|
|||
15
efoi2___
12.07.18
✎
14:42
|
(11) А как Вы в общем модуле отлавливали Ваше событие?
|
|||
16
Вафель
12.07.18
✎
14:45
|
ут 10 не обновляется же. зачем так заморачиваться тогда?
|
|||
17
Mraque
12.07.18
✎
14:50
|
Из процедуры "УстановитьДоступностьПоляВводаНомера" вызываешь:
ИмяТвоегоОбщегоМодуля.ИмяПроцедурыПоДобавлениюРеквизитов(МетаданныеОбъекта.Имя, ФормаОбъекта); В самой процедуре обращение следующее: ЭлементыФормы = ФормаОбъекта.ЭлементыФормы; А с элементами формы уже делаешь что хочешь, в том числе и добавляешь. |
|||
18
Mraque
12.07.18
✎
14:52
|
Но потребуется еще сделать дополнительную проверку на то, какая именно форма открывается (Списка, выбора или обычная). С этим думаю сам в отладчике разберешься.
|
|||
19
Mraque
12.07.18
✎
14:55
|
Код для добавления кнопки, например:
НоваяКнопка = ЭлементыФормы.ТвояКоманднаяПанель.Кнопки.Добавить("ИмяКнопки", ТипКнопкиКоманднойПанели.Действие, "Заголовок кнопки", Новый Действие("КоманднаяПанельТвояКоманднаяПанельИмяПроцедурыВМодулеФормы")); НоваяКнопка.Отображение = ОтображениеКнопкиКоманднойПанели.Надпись; В модуле формы у тебя соответственно процедура с именем "КоманднаяПанельТвояКоманднаяПанельИмяПроцедурыВМодулеФормы" |
|||
20
efoi2___
12.07.18
✎
15:13
|
(19) Не хочется добавлять в модуль формы что-либо.
|
|||
21
Mraque
12.07.18
✎
15:15
|
Код в модуле формы, свой добавленный (именно свои новые процедуры), никоим образом не затрудняет обновление.
|
|||
22
Franchiser
гуру
12.07.18
✎
15:25
|
Делаешь процедуру в глобальном модуле
В ПриСозданинаСервере() интересующих форм добавляещь в конце вызов этой процедуры. В глобальный модуль передаешь форму как параметр. |
|||
23
Mraque
12.07.18
✎
15:36
|
(22) Это в УФ, а тут обычные формы УТ 10.3 )))
|
|||
24
Strogg
12.07.18
✎
15:50
|
у нас сделано так: в форме нужных документов в процедуре "При открытии" есть ссылка на ОМ ПостроительИнтерфейса. В нем прописаны процедуры посроения требуемых объектов. Ну а сами элементы описаны в другом ОМ - конструкторИнтерфейса - в нем описано создание всех, требуемых нам элементов управления.
Ну и, сами обработчики событий, естественно, находятся в модуле формы |
|||
25
Вафель
12.07.18
✎
16:00
|
(24) А что не сделели общие обработчики?
|
|||
26
Strogg
12.07.18
✎
16:20
|
(25) у нас не такая задача как у ТС. Где-то в тч колонка добавляется, где-то страница новая добавляется, в общем, для каждого типа метаданных своя процедура построения интерфейса.
|
|||
27
Garykom
гуру
12.07.18
✎
16:28
|
(0) >Я не смог найти такую процедуру во всех документах.
Добавь ее самостоятельно во все документы (модули формы) - другого варианта нет. Эта задача на УФ да решается, сча еще механизм расширений есть что еще помогает не корежить типовую конфу. |
|||
28
Eiffil123
12.07.18
✎
16:53
|
(27) но в итоге выходят изменения в типовой форме, как отслеживать и актуализировать форму в расширении?
|
|||
29
Garykom
гуру
12.07.18
✎
17:09
|
(28) Не в самой форме а ее модуле, ты же новую свою процедуру/функцию добавил какие проблемы там вызвать процедуру своего общего модуля и там обработать изменения в типовой форме?
Ну переименовали "КоманднуюПанельТовары" так и фиг с ним, выпускаешь новое расширение где это учтено. |
|||
30
Eiffil123
12.07.18
✎
17:41
|
(29) Ну если я кнопку на форму добавил, а в типовой в новом релизе саму форму поменяли. Нужно же как-то сравнивать типовую и ту, что в расширении.
|
|||
31
Garykom
гуру
12.07.18
✎
19:40
|
(30) Ты программно добавляй кнопку кодом в модуле.
И в коде пропиши куда на форме добавлять - поймешь если форму поменяли. |
|||
32
efoi2___
13.07.18
✎
11:00
|
Сделал так, поставил проверку на реквизит "Договор контрагента", если есть реквизит, то используем его процедуру в общем модуле. Но если нет реквизита (например в корректировке заказ), то используем другую процедуру
//Добавляем новую кнопку Попытка Если ПроцессингСервер_РК.ПодключитьКнопкуРК(МетаданныеОбъекта.Имя) Тогда Если не МетаданныеОбъекта.Реквизиты.Найти("ДоговорКонтрагента") = Неопределено Тогда ДействиеКнопки = Новый Действие("ДоговорКонтрагентаНачалоВыбора"); Иначе ДействиеКнопки = Новый Действие("ТоварыРазмещениеНачалоВыбора"); КонецЕсли; Элементы = ФормаОбъекта.ЭлементыФормы; НоваяКнопка = Элементы.КоманднаяПанельТовары.Кнопки.Добавить("RemCard", ТипКнопкиКоманднойПанели.Действие, "RemCard", ДействиеКнопки); НоваяКнопка.Пометка = Истина; НоваяКнопка.Картинка = БиблиотекаКартинок.Логотип_РК; НоваяКнопка.Отображение = ОтображениеКнопкиКоманднойПанели.НадписьКартинка; КонецЕсли; Исключение Сообщить("Возникла ошибка в модуле ""RemCard"""); Сообщить(ОписаниеОшибки()); КонецПопытки; а в общем модуле: Процедура НачалоВыбораЗначенияРазмещения(ФормаДокумента, ЭлементФормы, СтандартнаяОбработка, ИспользоватьВнутренниеЗаказы = Неопределено) Экспорт Если ЭлементФормы.Имя = "RemCard" Тогда ПроцессингСервер_РК.ОткрытьФормуРК(ФормаДокумента); Возврат; КонецЕсли; |
|||
33
efoi2___
13.07.18
✎
11:01
|
И волки сыты и формы целы) всем спасибо!
|
|||
34
Eiffil123
13.07.18
✎
16:35
|
(31) программно не очень удобно, код нужно писать (не две строки).
|
|||
35
efoi2___
13.07.18
✎
17:03
|
(34) Каждому свое, мне проще внести изменения в 1-2 общих модулях, чем в 12 формах.
|
|||
36
Вафель
13.07.18
✎
17:06
|
вообще чтоб легко обновлять можно делать так
|
|||
37
Garykom
гуру
13.07.18
✎
18:36
|
(34) Код сам пишется, есть обработочка на ИСе которая формирует код создания элементов программно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |