Имя: Пароль:
1C
1С v8
Вопрос про &НаСервереБезКонтекста, странно как-то
0 МЮЛЛЕР
 
07.08.13
23:56
В форме документа есть реквизит формы Таблица (ТаблицаЗначений).
Реквизит Таблица выведен как элемент формы в виде таблицы.

&НаСервере
Процедура Процедура1()
Структура = Новый Структура();
Структура.Вставить("Таблица", Таблица);
ОбработатьТаблицу(СтруктураПараметров);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ОбработатьТаблицу(СтруктураПараметров)
ДанныеФормыКоллекция = СтруктураПараметров.Таблица;
ДанныеФормыКоллекция.Очистить();
КонецПроцедуры


Почему при таком раскладе очищается реквизит формы Таблица?
1 welwel
 
08.08.13
00:01
А что требуется?
2 МЮЛЛЕР
 
08.08.13
00:03
(1) почему Таблица на форме очищается, не смотря на то, что реквизит передан внутри структуры в серверный внеконтекстный вызов?
3 МЮЛЛЕР
 
08.08.13
00:05
Наведу красоту

&НаСервере
Процедура Процедура1()
Структура = Новый Структура();
Структура.Вставить("Таблица", Таблица);
ОбработатьТаблицу(Структура);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ОбработатьТаблицу(СтруктураПараметров)
ДанныеФормыКоллекция = СтруктураПараметров.Таблица;// (тип ДанныеФормыКоллекция)
ДанныеФормыКоллекция.Очистить();
КонецПроцедуры
4 welwel
 
08.08.13
00:07
все что передается в параметрах, доступно и работает, как и с контекстным вызовом
неконтекстный вызов просто не тащит сразу все данные формы на сервер
5 GROOVY
 
08.08.13
00:08
1. Так делать не надо. Если есть желание передавать всю таблицу - юзай серверный метод с контекстом, или передавай данные в виде временного хранилища.
2. Да здравствуйте связь по ссылке.
6 МЮЛЛЕР
 
08.08.13
00:09
(5)
1. Почему так делать не надо?
2. Какая может быть связь по ссылке, если &НаСервереБезКонтекста

Тонкий клиент.
7 Поросенок Петр
 
08.08.13
00:10
&НаСервереБезКонтекста должна уметь с клиента запускаться. \

А по поводу структуры, можно подумать структурой можно нае*ть платформу с передачей параметров.
8 МЮЛЛЕР
 
08.08.13
00:11
(7) из серверной процедуры модуля формы нельзя вызывать &НаСервереБезКонтекста или что сказать хотел?
9 Поросенок Петр
 
08.08.13
00:13
(8) Можно. Только когда процедура, которая подразумевает возможность вызова с клиента на это тупо не способна, это называется г-код.
10 GROOVY
 
08.08.13
00:15
(6) Потому-что данные формы на клиенте лишь проекция данных хранящихся на сервере. передавая их обратно на сервер (с контекстом или без) ты заставляешь систему гнать данные с сервера клиенту, потом обратно на сервер, а когда закончится процедура то все поедет опять на клиента и синхронизируется с сервером. Короче бред. Проще и правильнее просто уйти на сервер и обработать данные там.
11 GROOVY
 
08.08.13
00:15
(6) 2. А это как-то связано? 0_о
12 МЮЛЛЕР
 
08.08.13
00:16
(9) где написано, что если процедура запущенная на сервере вызывает процедуру с директивой НаСервереБезКонтекста, то это копрокод?
13 МЮЛЛЕР
 
08.08.13
00:17
(10) Где там у меня клиентская процедура?
14 Поросенок Петр
 
08.08.13
00:18
(12) Копрокод если процедура НаСервере сует в процедуру НаСервереБезКонтекста куски своего контекста (таблицу формы, например).
15 GROOVY
 
08.08.13
00:19
(13) Промахнулся я.
А нафига тебе с сервера же сервер вызывать? Контекст уже синхронизирован.
16 GROOVY
 
08.08.13
00:21
И я не понял почему связь по ссылке не должна работать?
17 Поросенок Петр
 
08.08.13
00:21
Другое дело, передача всего контекста (Форма) в процедуру
&НаКлиентеНаСервереБезКонтекста эт практикуется.
18 МЮЛЛЕР
 
08.08.13
00:22
(15) не хочу, чтобы ВЕСЬ контекст передавался в Процедура ОбработатьТаблицу

Форма перегружена информацией.
19 МЮЛЛЕР
 
08.08.13
00:24
(10) ты хочешь сказать ,что если в модуле формы из процедуры с директивой НаКлиенте вызову НаСервереБезКонтекста, то форма все равно будет синхронизироваться с сервером?
20 GROOVY
 
08.08.13
00:24
(18) Так он у тебя УЖЕ передался на сервер. Если ты будешь вызывать другие серверные процедуры то новых вызовов сервера не будет.
21 Поросенок Петр
 
08.08.13
00:25
(19) Не вызовешь ты её с клиента, блин. О чем так долго говорили большевики...
Ухожу спать.
22 GROOVY
 
08.08.13
00:26
(19) Если будешь таблицу(ДанныеФормы) Передавать, то да. Конвертированные данные формы на клиенте лишь проекция (обычно ссылка+представление), да т то что клиент видит может быть далеко не все что в данных формы есть на сервере.
23 МЮЛЛЕР
 
08.08.13
00:26
(20) Это я понимаю. Я не хочу, чтобы вызываемая процедура отрабатывала в контексте формы.
24 GROOVY
 
08.08.13
00:27
(23) Ок. Она и не отрабатывает. А тупо очищает коллекция и по ссылке возвращает пустую обратно в точку вызова. Вопрос в чем?
25 МЮЛЛЕР
 
08.08.13
00:28
(22) то есть, ДанныеФормыКоллекция - это ссылка на конкретный реквизит формы на сервере. И куда его не пихай, он ссылкой и останется?
26 Либерал
 
08.08.13
00:29
да, это не про собянина, ходорковского и американцев флудить..
27 МЮЛЛЕР
 
08.08.13
00:29
(24) вопрос тут (25)
28 GROOVY
 
08.08.13
00:31
(25) Нет. ДанныеФормыКоллекция - это конвертированные типы значения которые не могут существовать на клиенте. Для коллекций значений это особо важно, так как сама коллекция живет на сервере и периодически синхронизируется с клиентом. О чем, в частности, может говорить что ТекущиеДанные на клиенте и сервере у ТЧ зачастую ссылаются на разные строки.
29 МЮЛЛЕР
 
08.08.13
00:32
+(25) чтобы избавиться от ссылки надо сделать так: РеквизитФормыВЗначение(Таблица, ТИП("ТаблицаЗначений"))?
30 МЮЛЛЕР
 
08.08.13
00:33
(28) тогда мне не фига не понятно.
Почему после засовывания "таблица" в структуру и последующей передачи её во внеконтекстный вызов, меняется реквизит формы?
31 GROOVY
 
08.08.13
00:35
(30) Свзь по ссылке. Ты чистишь данные формы, при синхронизации с сервром они конвертируются в ТЗ и как следствие она очищается, а потом конвертируется в ДанныеФормы и едет на клиента где мы видим очищенную таблицу, содержащую данные формы.
32 МЮЛЛЕР
 
08.08.13
00:37
(31) в (25) я не это написал?
33 МЮЛЛЕР
 
08.08.13
00:41
&НаСервереБезКонтекста (&AtServerNoContext) — определяет серверную процедуру (функцию), исполняемую на сервере вне контекста формы. Переменные не могут быть внеконтекстными. В таких методах недоступен контекст формы (включая данные формы).

Все понятно, если в такую процедуру я запихиваю данные, относящиеся к контексту формы, то они тупо передаются по ссылке и их изменение влечет за собой изменение данных формы.
34 МЮЛЛЕР
 
08.08.13
00:43
то есть, если в процедуру &НаСервереБезКонтекста  передать в параметрах данные относящиеся к контексту формы, то это будет ссылка на данные формы.
35 МЮЛЛЕР
 
08.08.13
00:44
+(34) Таким образом, контекст всей формы не доступен, но значения параметров, относящихся к контексту формы, доступны. Происходит своеобразное обрезание контекста.
36 МЮЛЛЕР
 
08.08.13
00:45
Всем спасибо, все понятно, разобрался
37 МЮЛЛЕР
 
08.08.13
00:50
(21)> Не вызовешь ты её с клиента, блин. О чем так долго говорили большевики...

Че-гооо?