Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Динамическое добавление кнопки на форму без редактирования формы. (облегчаем обновление)

Динамическое добавление кнопки на форму без редактирования формы. (облегчаем обновление)
Я
   efoi2___
 
12.07.18 - 10:15
Всем доброго времени суток!

Столкнулся со следующей проблемой, вернее не проблемой, а идеей.

В конфигурации УТ 10.3 необходимо добавить функционал в некоторое количество документов. Для реализации функционала достаточно добавить одну кнопку на форму, в КоманднуюПанельТовары. (использовать обработки заполнения ТЧ заказчик не хочет по религиозным соображениям (Кнопка должна быть видна сразу)).

Естественно корежить кучу форм у меня желания нет. Коллеги по цеху предложили следующую идею - Создавать кнопку из общего модуля динамически. Т.е. находим процедуру, которая вызывается во всех документах при открытии - в моем случае это "УстановитьДоступностьПоляВводаНомера" там добавляем кнопку в форму с помощью "Элементы.КоманднаяПанельТовары.Кнопки.Добавить".

В действия кнопки выбираем процедуру на форме в которой есть любая процедура или функция из общего модуля, а в этой процедуре прописываем уже логику доработки.

Но есть проблема для логики доработки мне нужно получить форму, откуда была вызвана эта общая процедура, а так же нужно получить имя кнопки, чтобы остановить выполнение общей процедуры после моей логики. Соответственно в этой общей процедуре должны быть параметры "ЭтаФорма" и "Элемент".

Я не смог найти такую процедуру во всех документах.

И встает вопрос, как в общей процедуре понять, что она была вызвана именно моей динамической кнопкой если в ее параметрах нет "Элемент"а?
Или может можно по полученной форме понять какая кнопка нажата?
У кого есть идеи или опыт реализации чего-то подобного?

Заранее всем спасибо!
 
 
   Cyberhawk
 
1 - 12.07.18 - 10:17
У формы "Текущий элемент" есть свойство?
   efoi2___
 
2 - 12.07.18 - 10:18
(1) Есть, но в текущем элементе отображается текущее поле, а не кнопка.
   Mankubus
 
3 - 12.07.18 - 10:33
(0) когда добавляешь кнопку программно видно в какую форму добавляешь? можно к имени кнопки добавлять имя документа/формы и т.д.
   efoi2___
 
4 - 12.07.18 - 10:47
(3) Я не могу получить имя кнопки. т.к. в параметре элемента нет. Но могу получить форму, а соответственно и сам документ. А мне нужно понять, что процедура вызвана по нажатию кнопки, а не по стандартному вызову этой процедуры.
   Cyberhawk
 
5 - 12.07.18 - 10:57
А, так ты в качестве обработчика кнопки делаешь типовой метод модуля формы?
   Cyberhawk
 
6 - 12.07.18 - 10:58
Ну раз нет такого подходящего метода, то добавь в каждую форму свой универсальный метод наподобие "Подключаемый_ВыполнениеКоманды" и не парь мозг
   DrShad
 
7 - 12.07.18 - 11:01
а не проще посмотреть как на форму добавляется обработка табличной части и сделать по аналогии?
   efoi2___
 
8 - 12.07.18 - 11:14
(6) Не хочется изменять 12 форм. Мне проще в общем модуле 2 изменения учесть при обновлении, чем в 12 формах.
   efoi2___
 
9 - 12.07.18 - 11:16
(7) тот вариант не подошел, я пробовал.
   hhhh
 
10 - 12.07.18 - 11:27
(8) ну, добавление копипастом процедурки в 12 форм у вас займет 2 минуты 30 секунд, а так вы будете месяц трахаться со своими идеями.
 
 Рекламное место пустует
   ponaroshku
 
11 - 12.07.18 - 11:28
(0) реализовывала в упп
брала только не установку номера
СоздатьКнопкиПечати()
   ponaroshku
 
12 - 12.07.18 - 11:28
(11) в модуле формированиепечатныхформ
   ponaroshku
 
13 - 12.07.18 - 11:30
(10) не согласна
у нас УПП с доработками, формы периодически меняются, учесть все изменения, ковырять формы для корректного обновления базы 24/7 - моветон. Раз сделал программную прорисовку, следи за своим модулем, пусть программно прорисовывается кнопка
   Кац
 
14 - 12.07.18 - 11:46
обычные формы <> легкое обновление
   efoi2___
 
15 - 12.07.18 - 14:42
(11) А как Вы в общем модуле отлавливали Ваше событие?
   Вафель
 
16 - 12.07.18 - 14:45
ут 10 не обновляется же. зачем так заморачиваться тогда?
   Mraque
 
17 - 12.07.18 - 14:50
Из процедуры "УстановитьДоступностьПоляВводаНомера" вызываешь:

ИмяТвоегоОбщегоМодуля.ИмяПроцедурыПоДобавлениюРеквизитов(МетаданныеОбъекта.Имя, ФормаОбъекта);


В самой процедуре обращение следующее:
ЭлементыФормы = ФормаОбъекта.ЭлементыФормы;

А с элементами формы уже делаешь что хочешь, в том числе и добавляешь.
   Mraque
 
18 - 12.07.18 - 14:52
Но потребуется еще сделать дополнительную проверку на то, какая именно форма открывается (Списка, выбора или обычная). С этим думаю сам в отладчике разберешься.
   Mraque
 
19 - 12.07.18 - 14:55
Код для добавления кнопки, например:
            НоваяКнопка                     = ЭлементыФормы.ТвояКоманднаяПанель.Кнопки.Добавить("ИмяКнопки", ТипКнопкиКоманднойПанели.Действие, "Заголовок кнопки", Новый Действие("КоманднаяПанельТвояКоманднаяПанельИмяПроцедурыВМодулеФормы"));
            НоваяКнопка.Отображение         = ОтображениеКнопкиКоманднойПанели.Надпись;


В модуле формы у тебя соответственно процедура с именем "КоманднаяПанельТвояКоманднаяПанельИмяПроцедурыВМодулеФормы"
   efoi2___
 
20 - 12.07.18 - 15:13
(19) Не хочется добавлять в модуль формы что-либо.
   Mraque
 
21 - 12.07.18 - 15:15
Код в модуле формы, свой добавленный (именно свои новые процедуры), никоим образом не затрудняет обновление.
   Franchiser
 
22 - 12.07.18 - 15:25
Делаешь процедуру в глобальном модуле
В ПриСозданинаСервере() интересующих форм добавляещь в конце вызов этой процедуры. В глобальный модуль передаешь форму как параметр.
   Mraque
 
23 - 12.07.18 - 15:36
(22) Это в УФ, а тут обычные формы УТ 10.3 )))
   Strogg
 
24 - 12.07.18 - 15:50
у нас сделано так: в форме нужных документов в процедуре "При открытии" есть ссылка на ОМ ПостроительИнтерфейса. В нем прописаны процедуры посроения требуемых объектов. Ну а сами элементы описаны в другом ОМ - конструкторИнтерфейса - в нем описано создание всех, требуемых нам элементов управления.
Ну и, сами обработчики событий, естественно, находятся в модуле формы
   Вафель
 
25 - 12.07.18 - 16:00
(24) А что не сделели общие обработчики?
   Strogg
 
26 - 12.07.18 - 16:20
(25) у нас не такая задача как у ТС. Где-то в тч колонка добавляется, где-то страница новая добавляется, в общем, для каждого типа метаданных своя процедура построения интерфейса.
   Garykom
 
27 - 12.07.18 - 16:28
(0) >Я не смог найти такую процедуру во всех документах.

Добавь ее самостоятельно во все документы (модули формы) - другого варианта нет.

Эта задача на УФ да решается, сча еще механизм расширений есть что еще помогает не корежить типовую конфу.
   Eiffil123
 
28 - 12.07.18 - 16:53
(27) но в итоге выходят изменения в типовой форме, как отслеживать и актуализировать форму в расширении?
   Garykom
 
29 - 12.07.18 - 17:09
(28) Не в самой форме а ее модуле, ты же новую свою процедуру/функцию добавил какие проблемы там вызвать процедуру своего общего модуля и там обработать изменения в типовой форме?

Ну переименовали "КоманднуюПанельТовары" так и фиг с ним, выпускаешь новое расширение где это учтено.
   Eiffil123
 
30 - 12.07.18 - 17:41
(29) Ну если я кнопку на форму добавил, а в типовой в новом релизе саму форму поменяли. Нужно же как-то сравнивать типовую и ту, что в расширении.
   Garykom
 
31 - 12.07.18 - 19:40
(30) Ты программно добавляй кнопку кодом в модуле.
И в коде пропиши куда на форме добавлять - поймешь если форму поменяли.
   efoi2___
 
32 - 13.07.18 - 11:00
Сделал так, поставил проверку на реквизит "Договор контрагента", если есть реквизит, то используем его процедуру в общем модуле. Но если нет реквизита (например в корректировке заказ), то используем другую процедуру
//Добавляем новую кнопку

    Попытка        
        Если ПроцессингСервер_РК.ПодключитьКнопкуРК(МетаданныеОбъекта.Имя) Тогда
            Если не МетаданныеОбъекта.Реквизиты.Найти("ДоговорКонтрагента") = Неопределено Тогда 
                ДействиеКнопки = Новый Действие("ДоговорКонтрагентаНачалоВыбора");
            Иначе
                ДействиеКнопки = Новый Действие("ТоварыРазмещениеНачалоВыбора");
            КонецЕсли;
            
            Элементы = ФормаОбъекта.ЭлементыФормы;
            НоваяКнопка = Элементы.КоманднаяПанельТовары.Кнопки.Добавить("RemCard", 
                                                                        ТипКнопкиКоманднойПанели.Действие, 
                                                                        "RemCard",
                                                                        ДействиеКнопки);
            НоваяКнопка.Пометка = Истина;
            НоваяКнопка.Картинка = БиблиотекаКартинок.Логотип_РК;
            НоваяКнопка.Отображение = ОтображениеКнопкиКоманднойПанели.НадписьКартинка;
        КонецЕсли;
    Исключение 
        Сообщить("Возникла ошибка в модуле ""RemCard""");
        Сообщить(ОписаниеОшибки());
    КонецПопытки;


а в общем модуле:


Процедура НачалоВыбораЗначенияРазмещения(ФормаДокумента, ЭлементФормы, СтандартнаяОбработка, ИспользоватьВнутренниеЗаказы = Неопределено) Экспорт
    
    Если ЭлементФормы.Имя = "RemCard" Тогда 
        ПроцессингСервер_РК.ОткрытьФормуРК(ФормаДокумента);
        Возврат;    
    КонецЕсли;
   efoi2___
 
33 - 13.07.18 - 11:01
И волки сыты и формы целы) всем спасибо!
 
 
   Eiffil123
 
34 - 13.07.18 - 16:35
(31) программно не очень удобно, код нужно писать (не две строки).
   efoi2___
 
35 - 13.07.18 - 17:03
(34) Каждому свое, мне проще внести изменения в 1-2 общих модулях, чем в 12 формах.
   Вафель
 
36 - 13.07.18 - 17:06
вообще чтоб легко обновлять можно делать так
УстановитьДействие("ПередОткртием", "моеПередОткрытием")
Процедура моеПередОткрытием()
      ПередОткрытием();
      //свой код
КонецПроцедуры

   Garykom
 
37 - 13.07.18 - 18:36
(34) Код сам пишется, есть обработочка на ИСе которая формирует код создания элементов программно.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует