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


1С:Предприятие ::

Метки: 

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

Я
   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 или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует