Имя: Пароль:
1C
1С v8
Динамическое добавление кнопки на форму без редактирования формы. (облегчаем обновление)
,
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) Код сам пишется, есть обработочка на ИСе которая формирует код создания элементов программно.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс