Имя: Пароль:
1C
1С v8
клиентский и серверный контекст формы в общих модулях
0 vde69
 
03.10.19
10:20
есть 3 модуля
1. модуль формы там есть:
&НаКлиенте
Процедура ОбработкаОповещения(.....)
КлиентскийМодуль.ОбработкаОповещения(ЭтотОбъект)
КонецПроцедуры

2. клиентский общий модуль
Процедура ОбработкаОповещения(Форма) Экспорт
....
СерверныйМодуль.ОбработкаОповещения(Форма.ЭтотОбъект) // вот тут ругается
....
КонецПроцедуры

3. серверный общий модуль
Процедура ОбработкаОповещения(Форма) Экспорт
....
....
....
КонецПроцедуры


вопрос: как можно из клентского общего модуля передать на сервер серверный контекст формы, ну очень не хочется делать кучу одинакового кода в формах...

Ведь есть реально работающий вызов из модуля формы:


1. модуль формы
&НаКлиенте
Процедура ОбработкаОповещения(.....)
КлиентскийМодуль.ОбработкаОповещения(ЭтотОбъект)
КонецПроцедуры

&НаСервере
Процедура ОбработкаОповещенияНаСервере()
СерверныйМодуль.ОбработкаОповещения(ЭтотОбъект) // тут все работает
КонецПроцедуры

2. серверный общий модуль
Процедура ОбработкаОповещения(Форма) Экспорт
....
....
....
КонецПроцедуры
1 hhhh
 
03.10.19
10:28
(0) наверно галочку Вызов сервера забыли поставить в общем модуле.
2 vde69
 
03.10.19
10:31
ошибка не видимости модула а преобразования параметра, то есть он не может преобразовать клиентский контекст формы в серверный
3 asady
 
03.10.19
10:32
(0) буквально вчера этот же вопрос стоял.
Я тоже обратил внимание что форму можно передавать на сервер только в модуле формы
а в общих модулях возможностей не нашел.
Но потом подумал и решил что наверное в этом есть своя логика

переделал свою поделку и больше не долбился об эту сосну
4 asady
 
03.10.19
10:33
93) я думаю разрабы хотели развести клиентский функционал с серверным таким образом
5 RomanYS
 
03.10.19
10:35
(2) Разве ошибка не "Нельзя изменять..."?
6 vde69
 
03.10.19
10:36
(3) ну у меня около 20 документов, и в каждом свои заморочки... хочется в одном месте править а не в 20...

проблема в том, что ОбработкаОповещения очень разная и мне надо обработать только несколько своих, а параметры разношерстные и все обрабатывать на сервере я не могу, банально параметры некоторых событий не лезут на сервер, по этому мне надо сначала на клиенте отфильтровать параметры а потом вызывать общую серверную процедуру
7 RomanYS
 
03.10.19
10:37
*(5)  вопрос отменяется
посчитал, что
СерверныйМодуль.ОбработкаОповещения(Форма.ЭтотОбъект)

это передача данных формы. Зачем здесь ".ЭтотОбъект"?
8 vde69
 
03.10.19
10:37
(5) ошибка:

отсутствует отображение для типа "управляемая форма"
9 Василий Алибабаевич
 
03.10.19
10:40
(8) А зачем форма на сервере?
10 vde69
 
03.10.19
10:43
(9) в реквизитах формы покопаться
11 asady
 
03.10.19
10:44
(6) ну и у меня так-же
делал универсальные обработчики событий форм
разрулил без передачи формы
тупо формировал структуры данных для передачи на сервер
оттуда получал такие-же результаты и в клинетском общем модуле мучил форму.
12 pechkin
 
03.10.19
10:46
форму нельзя передать с клиента на сервер. только с серверного вызова в самой форме

&НаСервере
Процедура ОбработкаОповещения(Форма) Экспорт
....
СерверныйМодуль.ОбработкаОповещения(Форма.ЭтотОбъект) // вот тут ругается
....
КонецПроцедуры
13 pechkin
 
03.10.19
10:47

&НаСервере
Процедура ОбработкаОповещения() Экспорт
....
СерверныйМодуль.ОбработкаОповещения(ЭтотОбъект) // вот тут НЕ ругается
....
КонецПроцедуры
14 Василий Алибабаевич
 
03.10.19
10:50
(10) Видимо придется Структуру Реквизитов получать в контексте модуля формы и уже ее передавать в серверную процедуру.
15 Василий Алибабаевич
 
03.10.19
10:51
+(14) *параметром
16 kdenis
 
03.10.19
11:58
Модуль формы:

&НаКлиенте
Процедура ЗаполнитьПоТоварам(Команда)
    
    РаботаСДокументамиКлиент.ЗаполнитьПоТоварам(ЭтотОбъект);
    
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПоТоварамНаСервере() Экспорт
    
    РаботаСДокументамиСервер.ЗаполнитьПоТоварам(ЭтотОбъект);
    
КонецПроцедуры


Общий модуль: РаботаСДокументамиКлиент // Клиент (управляемое приложение)

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

Процедура ВопросЗаполнитьПоТоварамЗавершение(Результат, ДополнительныеПараметры) Экспорт
    
    Если Результат = КодВозвратаДиалога.Да Тогда
        ДополнительныеПараметры.Форма.ЗаполнитьПоТоварамНаСервере();
    КонецЕсли;
    
КонецПроцедуры


Общий модуль: РаботаСДокументамиСервер // Сервер, Внешнее соединение

Процедура ЗаполнитьПоТоварам(Форма) Экспорт
    
    // Тут имеем форму в серверном контексте в реквизите
    
КонецПроцедуры
17 Cyberhawk
 
03.10.19
12:00
Ответ: "никак"
18 kdenis
 
03.10.19
12:00
В итоге.
На форме каждого из двадцати документов разместить всего два метода.
Логику писать и переписывать в методе общего серверного модуля.
19 Жан Пердежон
 
03.10.19
12:04
(0) так ведь и никогда нельзя было передавать с клиента на сервер УФ;
и в примере твоём нет передачи;

передавай структуру реквизитов и в них копайся
20 kdenis
 
03.10.19
12:04
(16) * // Тут имеем форму в серверном контексте в параметре "Форма"
21 vde69
 
03.10.19
12:32
сделал так

на форме


&НаКлиенте
Процедура ОбработкаОповещения(.....)
мПараметры = КлиентскийМодуль.ПараметрыДляОбработчикаОповещения(ЭтотОбъект, ...)
Если мПараметры.Использовать Тогда
ВызовОбработчикаОповещения(мПараметры)
КонецЕсли
КонецПроцедуры

&НаСервере
Процедура ВызовОбработчикаОповещения(мПараметры)
СерверныйМодуль.ОбработкаОповещения(ЭтотОбъект,мПараметры)
КонецПроцедуры
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший