|   |   | 
| 
 | Доработка формы не добавляя ее в расширение | ☑ | ||
|---|---|---|---|---|
| 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) В типовых ПриОткрытии, как правило, есть вызов какого-нибудь модуля типа СобытияФорм... Его и можно заимствовать, проанализировать имя формы и добавить что нужно.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |