Имя: Пароль:
1C
 
ДанныеФормыВЗначение для внешней обработки
, , ,
0 NikePopov
 
22.06.15
10:45
Добрый день!

Хочу воспользоваться возможностью процедур с директивой "&НаСервереБезКонтекста" во внешней обработке. Все механизмы заполнения у меня в модуле объекта внешней обработки. У обработки при этом довольно увесистая форма, которую при каждом заполнении таскать на сервер нет никакого желания.

Пример кода:

&НаКлиенте
Процедура Команда1(Команда)
    Команда1НаСервере(Объект);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура Команда1НаСервере(Объект)

    ВнешняяОбработкаОбъект = ДанныеФормыВЗначение(Объект, Тип("ВнешняяОбработкаОбъект.ВнешняяОбработка1"));

КонецПроцедуры // Команда1НаСервере()

При выполнении функции "ДанныеФормыВЗначение" возникает ошибка :
{Форма.Форма.Форма(10)}: Ошибка при вызове метода контекста (ДанныеФормыВЗначение)
    ВнешняяОбработкаОбъект = ДанныеФормыВЗначение(Объект, Тип("ВнешняяОбработкаОбъект.НабивкаБлюд"));
по причине:
Несоответствие типов (параметр номер '2')

Не могу понять как требуется указывать второй параметр функции "ДанныеФормыВЗначение". Если обработка внутри конфигуркции, то проблемы нет.

Возможность обхода через процедуру "&НаСервере" я знаю, но такой подход сильно замедляет выполнение. Переносить процедуры заполнения в форму тоже не хочется.
1 mikecool
 
22.06.15
10:46
нафейхоа безконтекста??
2 NikePopov
 
22.06.15
10:47
Передача самой формы на сервер довольно долгое занятие, так как на форме довольно много разнообразных данных. Если пользоваться НаСервереБезКонтекста, то выполнение процедуры очень сильно ускоряется.
3 NikePopov
 
22.06.15
10:55
Интересно, что ТипЗнч(РеквизитФормыВЗначение("Объект")) <> Тип("ВнешняяОбработкаОбъект.ВнешняяОбработка1")
А вот Строка(ТипЗнч(РеквизитФормыВЗначение("Объект"))) = Строка(Тип("ВнешняяОбработкаОбъект.НабивкаБлюд")) .
4 NikePopov
 
22.06.15
10:55
(3) В последнем месте опечатка: вместо "НабивкаБлюд" - "ВнешняяОбработка1"
5 NikePopov
 
22.06.15
10:55
На нескольких обработках тестирую))
6 Aprobator
 
22.06.15
10:56
(2) ага, только вот без контекста нет на сервере реквизитов формы.
7 NikePopov
 
22.06.15
10:57
Я специально для этого убрал директиву над функцией. С целью проверки.
8 Aprobator
 
22.06.15
11:28
Попробуй на стороне сервера получить для теста через РеквизитФормыВЗначение - там тип не обязателен.
9 hhhh
 
22.06.15
11:39
(7) а что вы там тестируете? вы же создаете свой контекст. Ваш контекст думаете будет быстрее нуралиевского?
10 NikePopov
 
22.06.15
12:03
(8) РеквизитФормыВЗначение  - это метод формы. Если использовать его то от "БезКонтекста" придется отказаться, что опять же приведет к большему времени передачи формы с клиента на сервер и обратно.
(9) Я не хочу тянуть контекст формы. Он мне не интересен. Для выполнения требуемых мне действий мне выше крыши хватит только объекта внешней обработки. Весь контекст тянуть долго.
11 ДенисЧ
 
22.06.15
12:13
При БезКонтекста - ты не имеешь контекста. Ваш Кэп.
неоткуда получать.
12 NikePopov
 
22.06.15
12:35
(11) Это здорово, но не очень ясно как эту интересную информацию можно применить))
13 DTXqueque
 
22.06.15
12:41
(10) >Я не хочу тянуть контекст формы. Он мне не интересен. Для выполнения требуемых мне действий мне выше крыши хватит только объекта внешней обработки. Весь контекст тянуть долго.
Курлык-курлык.. Интересно, а что там ещё в контекст попадёт кроме объекта обработки?)
14 Fragster
 
гуру
22.06.15
12:42
из-за этого в своих внешних обработках отказался от модуля обработки вообще - всё в форме.
15 NikePopov
 
22.06.15
13:10
(13) Приличное количество объектов. Мало того, эти объекты - не ссылки, а целые таблицы, динамические списки, объекты, табличные документы. То, что должен видеть пользователь, а там довольно разнообразная информация.
Объект - это способ заполнения, так скажем, одной записи. А таких записей в форме может быть довольно много.
16 NikePopov
 
22.06.15
13:12
(14) Так раньше и делал, но теперь хотел бы решить для себя: есть ли возможность использовать форму - как способ отображения информации пользователю, а объект - как отдельный инструмент заполнения.
17 Aprobator
 
22.06.15
13:17
(10) я понимаю, для чего всё это делается. Просто отладчиком можно будет посмотреть тип объекта и сравнить его с тем, что выдаёт Тип("ВнешниеОбработки......") и получить дальнейшую информацию для размышлений.
18 DTXqueque
 
22.06.15
13:24
(15) Ну да, если ты в обработке наплодил кучу сущностей.
Если хочешь отказаться от контекста, передавай нужные параметры в качестве параметров процедуры без контекста.
19 Fragster
 
гуру
22.06.15
13:26
(18) вот пишешь ты обработку и под управляемые и под обычные формы, логично записать общие функции в модуль обработки. а в УФ - еще и без контекста к ним обращаться, чтобы работало поживее.
20 DTXqueque
 
22.06.15
13:33
(19) Не понял. Ты намекаешь на то, что без контекста можно вызвать процедуры модуля?
21 NikePopov
 
24.06.15
13:20
(17) В том то и проблема: в (3) я уже так и сделал. Результат удивил. У объекта "Тип" нельзя понять как именно требуется его получить.

(18) Мне нужны не параметры(нужны в меньшей степени), а методы ОбработкаОбъекта. Я хочу все обработки заполнения выполнять в модуле объекта, а формой пользоваться для показа результата пользователю в нужном ему виде.

(20) Да! Именно для этого и затевал обсуждение!
22 cathode
 
24.06.15
22:23
(0) Тебе точно нужен вызов метода объекта без контекста?
Если модуль объекта используется как библиотека процедур, то в управляемой форме можно сделать так:

1. Создать реквизит формы ОбъектТип, тип "строка неограниченной длины".

2. В ПриСозданииНаСервере:

    // Сохраням тип реквизита Объект для вызовов без контекста.
    ОбъектТип = СтрЗаменить(РеквизитФормыВЗначение("Объект").Метаданные().ПолноеИмя(), ".", "Объект.");

3. Во внеконтекстную серверную процедуру передаем Знач ОбъектТип (можно еще передать Знач Объект, если нужны его данные):

    ОбъектЗначение = Новый(Тип(ОбъектТип));

    // Если передали Объект
    ЗаполнитьЗначенияСвойств(ОбъектЗначение, Объект);

    Результат = ОбъектЗначение.ЭкспортныйМетод();
    Возврат Результат;

В результате получаем вызов метода объекта без передачи контекста, но тип объекта в виде строки для таких вызовов нужно хранить на клиенте.
23 NikePopov
 
26.06.15
13:33
(22) Вот! Это действительно супер! Есть конечно минус с переносом данных реквизитов и табличных частей(их надо переносить перед экспортным методом в "ОбъектЗначение", а после из "ОбъектЗначение" в "Объект"), но уже отлично!