|
Доработка формы не добавляя ее в расширение | ☑ | ||
---|---|---|---|---|
0
Александр999888
04.12.23
✎
08:59
|
Всем привет. Кто может подсказать, есть ли такая возможность. Добавляю реквизиты на форму в расширении программно и пытаюсь назначить событие при изменении этих реквизитов. Если данный обработчик события располагается в модуле формы то вопросов нет. Но не хотелось бы тянуть форму в расширение. Как назначить обработчик, но не добавлять форму в расширение? Форма.Элементы.ТипУслуги.УстановитьДействие("ПриИзменении","ПриИзмененииТипУслуги"); Второй параметр виден, только если он описан в модуле формы. Он только строка. Обратиться к общему модулю нельзя. Как обойти?
|
|||
1
arsik
04.12.23
✎
09:03
|
Процедура должна быть экспортируемой и располагаться в модуле формы, при этом количество параметров должно совпадать с необходимым количеством параметров события, инициирующего вызов действия. |
|||
2
Donkey_hot
04.12.23
✎
09:19
|
(0) Никак. А чем вариант с расширением Вам не нравится? Ок, у многих есть предубеждение по поводу хранения в расширении данных. Но уж формы-то перерисовывать - самое то...
|
|||
3
Александр999888
04.12.23
✎
09:38
|
(2) Добавляя форму в расширение тянутся автоматом очень много объектов. Соответственно, если подтянуть основные 10-15 форм, то в расширении будет половина типовой конфы. А если обойти, то несколько общих модулей.
|
|||
4
Donkey_hot
04.12.23
✎
09:52
|
(3) Там от объекта не так уж и много, имя и несколько основных свойств...
|
|||
5
Александр999888
04.12.23
✎
13:54
|
В модуле формы есть команда - Подключаемый_ВыполнитьПереопределяемуюКоманду, в которой ссылка на общий модуль. Думаю в этом общем модуле можно прописать необходимое поведение, но не получается назначить команду на событие при изменении. Есть у кого мысли на этот счет?
|
|||
6
Лирик
04.12.23
✎
14:06
|
(5) Мне кажется вы не туда смотрите. Объекты в расширение "тянутся" только когда вы добавляете в расширение основной объект формы. Судя по всему вы это делаете, что бы добавить реквизит формы. Я прав? Но сами реквизиты тоже можно добавить программно.
Если да, то вот статья с инфостарта, и там таких много. https://infostart.ru/1c/articles/1018735/ |
|||
7
Александр999888
04.12.23
✎
14:27
|
(6) Если тянуть основной объект формы, да, тянется очень много. Но и если добавить только форму, она подтянется не одна. Да, объектов будет меньше чем при добавлении основного объекта формы. Но они будут. Сами реквизиты я добавил программно в общем модуле. Добавил событие при изменении тоже программно в том же модуле. Но обработчик он ищет только в модуле формы. А я хочу привязать обработчик, который будет в общем модуле, чтобы не трогать модуль формы.
Если никак нельзя назначить, тогда какой смысл программного добавления реквизитов в общем модуле? Все равно тянуть форму, и уж там, в модуле формы добавить и реквизиты, и там же обработчики описать. Но, не хочется тянуть форму. Хочется обойтись только общими модулями. |
|||
8
ildary
04.12.23
✎
14:30
|
(0) не знаю, насколько подойдёт такой способ, но он работает (пример добавления на форму документа ЗаказПоставщику):
Добавить в ОМ.ПодключаемыеКомандыПереопределяемый Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт Если НастройкиФормы.ИмяФормы = "Документ.ЗаказПоставщику.Форма.ФормаДокумента" Тогда Команда = Команды.Добавить(); Команда.Идентификатор = "КомандаНовая"; Команда.Представление = "Команда новая"; Команда.Обработчик = "МодификацияКонфигурацииВызовСервераПереопределяемый.ЗаказПоставщикуФормаДокументаКомандаНовая"; Команда.РежимЗаписи = "НеЗаписывать"; Команда.Вид = "ГруппаСтатусПриоритет"; //Команда.Подменю = "ГруппаСтатусПриоритет"; //Команда.Вид = "КоманднаяПанель"; //Команда.Вид = "Печать"; //Команда.Вид = "Отчеты"; КонецЕсли; ... Добавить в ОМ.МодификацияКонфигурацииВызовСервераПереопределяемый Процедура ЗаказПоставщикуФормаДокументаКомандаНовая(Знач МассивСсылок, Знач ПараметрыВыполнения) Экспорт Форма = ПараметрыВыполнения.Форма; ... КонецПроцедуры |
|||
9
Александр999888
04.12.23
✎
15:56
|
(8) Как ты назначаешь данную команду на событие формы?
|
|||
10
YFedor
04.12.23
✎
16:04
|
(9) Общий модуль "МодификацияКонфигурацииПереопределяемый"
|
|||
11
ildary
04.12.23
✎
16:13
|
(9) в Процедура ПриОпределенииКомандПодключенныхКОбъекту()
строка Команда.Обработчик = "МодификацияКонфигурацииВызовСервераПереопределяемый.ЗаказПоставщикуФормаДокументаКомандаНовая"; |
|||
12
Garykom
04.12.23
✎
16:16
|
(10) Есть много форм в которых не то что вызовов "МодификацияКонфигурацииПереопределяемый" нет
Даже нет обработчиков "ПриСозданииНаСервере" и т.д. |
|||
13
YFedor
04.12.23
✎
16:18
|
(12) Несомненно, но мы же не знаем какая конфигурация у автора, а он скрывает.
|
|||
14
Александр999888
04.12.23
✎
17:19
|
В форме все присутствует. В процедуре ПриОпределенииКомандПодключенныхКОбъекту написал добавление команды. В отладе пробежало.
Добавил Обработчик в МодификацияКонфигурацииПереопределяемый. Как запустить обработчик по событию на форме? Форма.Элементы.ТипУслуги.УстановитьДействие("ПриИзменении","КомандаНовая1"); Так же не прокатит, он же тут в Модуль формы смотрит Нужно при изменении реквизита на форме запустить данную переопределяемую команду. ЧЯДНТ? |
|||
15
YFedor
04.12.23
✎
17:21
|
(14) Т.е. событие не формы, а элемента формы?
|
|||
16
YFedor
04.12.23
✎
17:31
|
(14) У меня как-то так:
1) Модуль.МодификацияКонфигурацииПереопределяемый - в расширении &После("ПриСозданииНаСервере") // ---- © YaFedor 2023 ----------------------- // Переопределяемая процедура, вызываемая из одноименного обработчика события формы. // // Параметры: // Форма - ФормаКлиентскогоПриложения - форма, из обработчика события которой происходит вызов процедуры. // Отказ - Булево - // СтандартнаяОбработка - Булево - // Процедура РасширеннаяПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт Если ВреГ(Форма.ИмяФормы) = ВреГ("Документ.ЗаказКлиента.Форма.ФормаДокумента") // Добавляем действие по пересчету веса в текущей строке моя_МодификацияФормСервер.ДобавитьОбработчикПересчетаВеса(Форма); КонецЕсли; КонецПроцедуры // ---- © YaFedor 2023 ----------------------- &После("ВыполнитьПереопределяемуюКоманду") // Вызывается в формах при выборе команды, которая добавлена программно // // Параметры: // Форма - ФормаКлиентскогоПриложения - форма в которой расположена команда // Команда - КомандаФормы - выбранная команда // ДополнительныеПараметры - Структура - дополнительные параметры. // Процедура РасширеннаяВыполнитьПереопределяемуюКоманду(Форма, Команда, ДополнительныеПараметры) Экспорт // Пересчет веса после изменения строки таблицы "Товары" Если ТипЗнч(Команда) = Тип("ТаблицаФормы") Тогда Если ВреГ(Команда.Имя) = ВреГ("Товары") Тогда // Пересчитываем вес всей табличной части, т.к. нужно еще считать итого ПересчитатьВесВТабличнойЧасти(Форма); КонецЕсли; КонецЕсли; КонецПроцедуры // ---- © YaFedor 2023 ----------------------- // Пересчитывает вес товара по всем строкам табличной части "Товары" Процедура ПересчитатьВесВТабличнойЧасти(_форма) Экспорт // чего-то там делаем КонецПроцедуры 2) Модуль.моя_МодификацияФормСервер - в расширении // ---- © YaFedor 2023 ----------------------- // При изменении в таблице "Товары" происходит пересчет веса Процедура ДобавитьОбработчикПересчетаВеса(_форма) Экспорт _форма.Элементы.Товары.УстановитьДействие("ПриИзменении", "Подключаемый_ВыполнитьПереопределяемуюКоманду"); КонецПроцедуры |
|||
17
ildary
04.12.23
✎
19:39
|
(14) обработчик по событию на форме вызывается через подсистему подключаемых команд, ничего самому уже делать не надо - достаточно написать, что я выложил в (8) - и всё заработает.
|
|||
18
Александр999888
05.12.23
✎
10:28
|
(17) (16) Спасибо вам. Все заработало!!!
|
|||
19
spiller26
05.12.23
✎
17:26
|
Дополню, кому будет интересно. Для БП 3.0
1.) Кидаем в расширение. ОМ.ПодключаемыеКоманды &После("ПриСозданииНаСервере") Процедура тесткн_ПриСозданииНаСервере(Форма, Знач ПараметрыРазмещения) ИмяФормы = Форма.ИмяФормы; Если ИмяФормы = "Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаОбщая" ИЛИ ИмяФормы = "Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары" Тогда КомандаФормы = Форма.Команды.Добавить("тесткн_МояКоманда"); КомандаФормы.Действие = "Подключаемый_ВыполнитьПереопределяемуюКоманду"; ЭлементКнопка = Форма.Элементы.Добавить("тесткн_МояКнопка", Тип("КнопкаФормы"), Форма.Элементы["ГруппаКнопкиКоманднойПанели"]); ЭлементКнопка.Заголовок = "тесткн МояКнопка"; ЭлементКнопка.ИмяКоманды = "тесткн_МояКоманда"; КонецЕсли; КонецПроцедуры 2.) Кидаем в расширение. ОМ.СобытияФормыИСКлиент (т.к. в форме есть Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда), котора ссылается на этот модуль) &После("ВыполнитьПереопределяемуюКоманду") Процедура тесткн_ВыполнитьПереопределяемуюКоманду(Форма, Команда, ДополнительныеПараметры) Если Форма.ИмяФормы = "Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаОбщая" ИЛИ Форма.ИмяФормы = "Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары" Тогда Если Команда.Имя = "тесткн_МояКоманда" Тогда тесткн_ДополнительноНаКлиенте.тесткн_ОбработатьИзмененияПоКнопке_МояКнопка(Форма); КонецЕсли; КонецЕсли; КонецПроцедуры |
|||
20
Александр999888
08.12.23
✎
10:44
|
А кто может еще подсказать?. С Изменением событий элемента формы прокатывает. А как быть с событием формы "ПриОткрытии"?
Если в ПриСозданииНаСервере прописать Форма.УстановитьДействие("ПриОткрытии","Подключаемый_ВыполнитьПереопределяемуюКоманду"); То при выполнении Процедура ВыполнитьПереопределяемуюКоманду(Форма, Команда, ДополнительныеПараметры) Параметр "команда" неопределен. Если прописать "Свою" допустим функцию, то она ПЕРЕОПРЕДЕЛЯЕТ стандартную процедуру при открытии. А нужно не переопределить, а дополнить. |
|||
21
Смотрящий
08.12.23
✎
10:53
|
||||
22
Александр999888
08.12.23
✎
11:01
|
(21) Ненене, без добавления формы в расширение
|
|||
23
Смотрящий
08.12.23
✎
11:08
|
(22) Да хрен его знает, никогда подобным не занимался. Форма спокойно забирается в расширение без кучи реквизитов. Да и если что то потянуло за собой - спокойно удаляется и работаешь не через жопу.
|
|||
24
Donkey_hot
08.12.23
✎
11:14
|
(20) В типовых ПриОткрытии, как правило, есть вызов какого-нибудь модуля типа СобытияФорм... Его и можно заимствовать, проанализировать имя формы и добавить что нужно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |