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