Имя: Пароль:
1C
 
ERP 2.0 Управляемые формы
0 burnylpc
 
02.02.18
12:41
ERP 2.0
Была задача: на форму стандартного документа (регистрация наработок) поместить кнопку, по нажатии которой должна каким-то образом заполнится ТЧ в форме документа.
Что сделано: вынесла в расширение общий модуль "МодификацияКонфигурацииКлиентПереопределяемый". В нем через процедуру "УА2_ВыполнитьПереопределяемуюКоманду" на форму программно добавляю кнопку с командой. По этой команде открывается форма выбора ОС. Пользователь выбирает ОС, и собственно по нему (по выбранному значению) должна заполнится ТЧ.

Вот код:
&После("ВыполнитьПереопределяемуюКоманду")
// Вызывается в формах при выборе команды, которая добавлена программно
//
// Параметры:
//  Форма                     - УправляемаяФорма - форма в которой расположена команда
//  Команда                     - КомандаФормы - выбранная команда
//  ДополнительныеПараметры     - Структура - дополнительные параметры
//
// Тут будем выполнять команду добавленную в "МодификацияКонфигурацииПереопределяемый.УА2_ПриСозданииНаСервере"
Процедура УА2_ВыполнитьПереопределяемуюКоманду(Форма, Команда, ДополнительныеПараметры) Экспорт
    
    Если Команда.Имя = "УА2_ВыбратьУзлыПоОС" Тогда
        
        ФормаВыбора = ПолучитьФорму("Справочник.ОбъектыЭксплуатации.ФормаВыбора",);
                    
        ОписаниеОповещения = Новый ОписаниеОповещения("РазузловатьОС", ОбщегоНазначенияВызовСервера, Форма.Объект);     
        ФормаВыбора.ОписаниеОповещенияОЗакрытии = ОписаниеОповещения;            
        
        ФормаВыбора.Открыть();                                      
                
    КонецЕсли;

КонецПроцедуры

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

После выбора ОС пытаюсь оповестить форму документа

//процедура в модуле ОбщегоНазначенияВызовСервера.
Процедура РазузловатьОС(ОбъектЭксплуатации, ДанныеФормы) Экспорт        
        ....
    ОбъектДокумент = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.РегистрацияНаработок"));    
        ......
    ЗначениеВДанныеФормы(ОбъектДокумент, ДанныеФормы);    

КонецПроцедуры

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

Все отрабатывает без ошибок, но форма документа не обновляется. ПОДСКАЖИТЕ, ЧТО Я НЕ ТАК ДЕЛАЮ?

п/с вариант с выносом самой формы документа в расширения не рассматривается
1 ГдеСобака Зарыта
 
02.02.18
12:45
Ну надо еще и саму форму оповестить
2 burnylpc
 
02.02.18
12:59
т.е. нужно все таки еще саму форму изменять?
3 Defender aka LINN
 
02.02.18
13:01
А что мешает использовать внешние обработки заполнения?
4 burnylpc
 
02.02.18
13:03
Что за внешние обработки заполнения, подскажите, где хоть прочитать про них? Это что-то стандартное или это обработки из справочника внешних обработок?
5 ГдеСобака Зарыта
 
02.02.18
13:09
Наверно по закрытии формы выбора ОС надо вызвать клиентскую процедуру, которая вызовет на сервере РазузловатьОС(), а потом оповестит форму документа через Оповестить().
Но внешняя обработка заполнения все-таки лучше
6 Вафель
 
02.02.18
13:11
(5) так вызываетя же процедура, там оповещение накинуто
7 ГдеСобака Зарыта
 
02.02.18
13:17
(6) Но на сервере ты форму документа не оповестишь после изменения. Поэтому и надо клиентскую процедуру, которая будет разузловку вызывать
8 Вафель
 
02.02.18
13:19
на каком сервере? тут с клиента идет выбор.
9 ГдеСобака Зарыта
 
02.02.18
13:19
Да, сорри, я туплю по пятницам
10 Вафель
 
02.02.18
13:21
нужно в процедуре РазузловатьОС обращаться к
ФормаДокумента.Объект и его заполнять
11 ГдеСобака Зарыта
 
02.02.18
13:24
Хотя почему туплю? Форма выбора ОС закрылась и по оповещению вызвала процедуру на сервере РАзузловать(). На сервере объект изменили и теперь надо его форму обновить. Ведь так? А как ты оповестишь с сервера открытую форму документа?
12 burnylpc
 
02.02.18
13:25
Собственно, если конкретизировать сам вопрос, то получится: а как правильно заполнять форму через процедуры в общем модуле?
....
раскопала в станд.конфигурации процедуры (такие часто встречаются), которые находятся в общих модулях.
Вот пример:
Общий модуль БухгалтерскиеОтчетыВызовСервера, галки сервер, вызов сервера

// Вызывается из обработчика события "ПриСохраненииПользовательскихНастроекНаСервере" формы отчета.
//
// Параметры:
//    ФормаОтчета - УправляемаяФорма - Форма отчета.
//    Настройки - ПользовательскиеНастройкиКомпоновкиДанных - Сохраняемые настройки.
//    СохранятьТолькоРеквизиты - Булево - Признак сохранения только значений реквизитов отчета без настроек СКД.
//
Процедура ПриСохраненииПользовательскихНастроекНаСервере(ФормаОтчета, Настройки, СохранятьТолькоРеквизиты = Ложь) Экспорт
    
    ОтчетОбъект = ФормаОтчета.РеквизитФормыВЗначение("Отчет");
    
    ......................................................
    
КонецПроцедуры

Пробовала так же, но когда я передавала форму, то ругался, что форму на сервер передавать нельзя

Пример с данными
общ.м. ДоставкаТоваров, сервер

// Возвращает таблицу значений с колонками, скопированными из переданной коллекции.
//
// Параметры:
//  Коллекция     - ДанныеФормыДерево, ДанныеФормыКоллекция, ТаблицаЗначений     - источник данных, колонки которого
//      необходимо копировать.
//  ИменаКолонок - Строка                                                     - имена копируемых колонок, перечисленные через запятую.
//
// Возвращаемое значение:
//  ТаблицаЗначений - скопированная таблица.
//
Функция СкопироватьКолонкиКоллекции(Коллекция, ИменаКолонок) Экспорт
    ............................
    Возврат ДанныеФормыВЗначение(Коллекция, Тип("ТаблицаЗначений"));
    ............................
КонецФункции

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

У меня уже глаза замылились)) помогите, кто чем может)) я по любому что-то не так делаю, не понимаю что
13 Вафель
 
02.02.18
13:29
Получить из другой формы серверный контекст формы документ нельзя
14 burnylpc
 
02.02.18
13:32
(5) делала так, тоже не получается
15 burnylpc
 
02.02.18
13:34
Т.е. предлагаете все таки сделать внешнюю обработку? как мне тогда кнопку на форму вывести, подскажите пожалуйста
16 ГдеСобака Зарыта
 
02.02.18
13:40
(15) А так попробуй

ОписаниеОповещения = Новый ОписаниеОповещения("РазузловатьОСнаКлиенте", ОбщегоНазначенияКлиент, Форма);    
        ФормаВыбора.ОписаниеОповещенияОЗакрытии = ОписаниеОповещения;


Процедура РазузловатьОСнаКлиенте(ОбъектЭксплуатации, Форма) Экспорт        
       ОбщегоНазначенияВызовСервера.РазузловатьОС(ОбъектЭксплуатации, Форма.Объект)
Форма.Прочитать();    

КонецПроцедуры


Но вообще да, внешняя обработка
17 ГдеСобака Зарыта
 
02.02.18
13:42
(15) Через внешнюю обработку на форме стандартная команда появится "Заполнить".
18 Defender aka LINN
 
02.02.18
14:12
(4) В демо БСП есть примеры
19 burnylpc
 
02.02.18
14:44
Ура получилось!
Все такие через клиентскую процедуру
....
В итоге

В модуле МодификацияКонфигурацииКлиентПереопределяемый (клиент)

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

    
КонецПроцедуры


Процедура РазузловатьОС(ОбъектЭксплуатации, Форма) Экспорт                           
    
    МассивУзлов = ОбщегоНазначенияВызовСервера.РазузловатьОС(ОбъектЭксплуатации);     // серверный модуль. ОбщегоНазначенияВызовСервера. возвращает массив запросом
    
    Для каждого Узел из МассивУзлов Цикл
        
        НоваяСтрока = Форма.Объект.Наработки.Добавить();
        НоваяСтрока.ОбъектЭксплуатации = ОбъектЭксплуатации;
        НоваяСтрока.ОбъектФормы = ОбъектЭксплуатации;
        НоваяСтрока.УзелФормы = Узел;
        
    КонецЦикла;
    
КонецПроцедуры

без вскяких обновить(), прочитать() и обработок)))
Спасибо, что помогли разобраться!
Закон Брукера: Даже маленькая практика стоит большой теории.