Имя: Пароль:
1C
1С v8
Вызвать модуль объекта с клиента?
0 Euroset1
 
14.02.19
10:40
Реально ли?

Допустим, это внешняя обработка. Не хочу контекстный вызов сервера, если много данных на форме. При этом в модуле объекта есть процедура, которую не хотелось бы дублировать в модуле формы.
1 lxs
 
14.02.19
10:43
Об = РеквизитФормыВЗначение("ОбработкаОбъект");
Об.Автозаполнение();
2 sieben
 
14.02.19
10:44
(0) > Не хочу контекстный вызов сервера,
Программный модуль объекта всегда получается из объекта - основного реквизита формы и неразрыно связан с ним. Реквизит формы - часть контекста.
Так что извини, но нет.
3 lxs
 
14.02.19
10:44
Отбой.. это только на сервере
4 sieben
 
14.02.19
10:47
(0) Передавай "свой контекст" структурой. А в модуле объекта что-то типа ТекущийКонтекст = ?(ПараметрКонтекст = Неопределено, ЭтотОбъект, ПараметрКонтекст) и алга.
5 Euroset1
 
14.02.19
12:10
(4) вот представь, у меня на форме много данных, которые не хочу синхронизировать с сервером без надобности. И бац - нужен вызов функции. Не совсем понял, что именно ты предлагаешь. Всмысле откуда куда передать.

На крайний случай я подумываю примерно о следующем:
1) При создании на сервере - получаю объект и кладу его во временное хранилище, возможно сериализую или через структуру
2) Адрес этого хранилища транслирую на клиент
3) Для вызова модуля объекта иду с клиента на сервер без контекста, туда пинаю адрес и там вскрываю хранилище и юзаю мой объект для вызова его методов.

Мне кажется, должно работать.. но не откажусь от более изящного способа извращения =)
6 sieben
 
14.02.19
12:48
(5) А, ну да, у тебя ж модуля объекта и не будет, это я загнался. Отменяется.

Объект, например СправочникОбъект или ОбработкаОбъект ты в хранилище не положишь, он мутабельный. Его надо каждый раз создавать заново. РеквизитФормыВЗначение, кстати, так и поступает - всегда создает объект заново, компилирует модуль и выполняет секцию инициализаци, потом тупо переносит в него данные из данных реквизита формы и отдает тебе. Ну еще чуть подправляет внутреннее состояние чтобы разные ЭтоНовый работали.

Так что то, что ты задумал - не взлетит. Хранилище - оно для данных, а не для кода.

Переходи на использование общих модулей, уменьшай размер данных формы - например, переносом в клиентские переменные, ты ж все равно с сервером их синхронизировать не хочешь. И т.п.
7 Вафель
 
14.02.19
12:52
не размещай тогда процедуры в модуле объекта
8 DrWatson
 
14.02.19
13:19
А это "Допустим, это внешняя обработка" или "это внешняя обработка"?
Потому что при таких вызовах лучше сделать функцию общего модуля или функцию менеджера объекта.
9 Euroset1
 
14.02.19
13:31
Речь именно о внешней обработке. Если бы оформлял в виде расширения, то там без вопросов.

Почему именно модуль объекта? Потому что подключаю обработку через БСП в доп отчеты и обработки. Там действие должно работать по расписанию, а часть действия должна работать и принудительно через форму. Следовательно, код одинаковый. А дублировать его не хочется, очень (часто приходится допиливать). Там через форму все делается осознанно пользователем, а по расписанию - всплепую без выбора. Потому форма тяжелая с точки зрения контекста.

Про мутабельный это круто, но я даже ком объект умудряюсь в временное хранилище запихать и использовать его раз 20 не создавая заново. В частности, ADODB Connection. Сейчас не помню код наверняка, но там что-то типа запихнутого в структуру ком объекта, потом эту структуру во временное хранилище и далее адрес в помощь.
10 sieben
 
14.02.19
14:35
(9) > но я даже ком объект умудряюсь в временное хранилище запихать

Еще один гений архитектуры.
Это ровно до тех пор, пока у тебя серверные вызовы в один процесс рпхоста приходят. Как только нагрузка повысится, тебя ожидают изумительные эффекты.
11 YAGolova
 
14.02.19
15:37
А если передать данные формы на сервер без контекста, а там воспользоваться ДанныеФормыВЗначение. Мне кажется должно взлететь
12 lodger
 
14.02.19
15:42
(0)
&НаКлиенте
че-то
параметр.Вставить("ПутьКОбработкеДоступныйССервера",СтрокаПуть)
вызываемсервер(параметр)
че-то

&НаСервереБезКонтекста
процедура вызываемсервер(параметр)
твояобработка = получаемобработку(параметр.СтрокаПуть);
твояобработка.твояпроцедурамодуля(параметр)
конецпроцедуры
13 Вафель
 
14.02.19
15:45
(9) у тебя какой релиз что ком объект во временное лезет?
14 YAGolova
 
14.02.19
15:56
15 Tonik992
 
14.02.19
16:05
(14) Я такого извращения давно не видел, спс. Не даете забыть, что мы работаем с 1С
16 Euroset1
 
15.02.19
14:23
(10) Какие проблемы? Неопределено - значит создам заново и опять запихну. А если объект еще жив, то работаю с ним. Я же не говорю о вечном, конечно же он теряется периодически. Но нам ведь он нужен на один раз по сути.

(13) во всех релизах начиная с 8.3.3 и по 8.3.12 лезет. Не напрямую, а через структуру.


(14) спасибо. вот этот способ мне тоже подойдет.
17 ssh2006
 
15.02.19
14:33
(0) > Не хочу контекстный вызов сервера

Хочу нагородить костылей?
18 ptiz
 
15.02.19
14:49
(0) Вопрос в том, важно ли тебе состояние объекта при вызове этой экспортной процедуры. Если нет - в чем проблема? Создать новый объект и вызвать процедуру. Если да - необходимо объект привести в состояние, при котором процедура даст верный результат.
19 Конструктор1С
 
15.02.19
15:22
Просто не надо бизнес-логику в модуль формы пихать, и подобных проблем не будет. В модуле формы должен быть только код, отвечающий за интерфейс