Имя: Пароль:
1C
1С v8
Чем отличается &НаСервереБезКонтекста от &НаСервере
,
0 Max1986
 
21.03.12
11:51
сабж.
Пожалуста, объясните популярно. Или где можно об этом почитать?
1 le_
 
21.03.12
11:51
Почитать можно в СП.
2 Fragster
 
гуру
21.03.12
11:52
с клиента на сервер не передается контекст. или передается.
3 Max1986
 
21.03.12
11:53
(2) а поподробнее - что мы имеем ввиду под контекстом - например что?
4 ковер
 
21.03.12
11:53
(0) в синтакс-помощнике
5 Fragster
 
гуру
21.03.12
11:53
(3) ЭтотОбъект
6 le_
 
21.03.12
11:53
(3) Контекст формы, например.
7 Fragster
 
гуру
21.03.12
11:53
(5)+ и прочее окружение
8 Necessitudo
 
21.03.12
11:53
Контекст - это данные формы.
9 ковер
 
21.03.12
11:54
Каждая процедура и функция модуля формы, модуля команды и общего модуля управляемого приложения предваряется директивой компиляции, определяющей среду исполнения данной процедуры. Директива предваряется символом "&". Допустимые директивы:

&НаКлиенте (&AtClient) — определяет клиентскую процедуру (функцию);
&НаСервере (&AtServer) — определяет серверную процедуру (функцию);
&НаСервереБезКонтекста (&AtServerNoContext) — определяет серверную процедуру (функцию), исполняемую на сервере вне контекста формы. Переменные не могут быть внеконтекстными. В таких методах недоступен контекст формы (включая данные формы). Допустимыми являются вызовы только других внеконтекстных методов. При вызове этих методов не выполняется передача данных формы на сервер и обратно. Применение внеконтекстных методов позволяет существенно уменьшить объем передаваемых данных при вызове серверной процедуры из среды клиентского приложения;
&НаКлиентеНаСервереБезКонтекста (&AtClientAtServerNoContext) — определяет процедуру (функцию), исполняемую в модуле формы на клиенте и на сервере, не имеющую доступа к контексту формы, данным формы, переменным, но имеющую доступ к процедурам и функциям общих модулей – серверных, не глобальных и серверных и клиентских одновременно. Сама процедура (функция) доступна для клиентский, серверных контекстных и неконтекстных процедур и функций модуля формы. Из серверных внеконтекстных методов формы допускается вызов серверных методов общих модулей;
&НаКлиентеНаСервере (&AtClientAtServer) — определяет процедуру (функцию), исполняемую в модуле команды, выполняемую на клиенте и на сервере, имеющую доступ к процедурам и функциям общих модулей – серверных, не глобальных и серверных и клиентских одновременно, не имеющую доступ к переменным. Сама процедура (функция) доступна для клиентских серверных процедур и функций модуля команды.
Клиентская процедура (функция) исполняется в среде клиентского приложения. В такой процедуре доступен клиентский контекст формы и вызовы любых процедур модуля.

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

Серверная процедура (функция), исполняемая вне контекста формы, (внеконтекстная) исполняется в среде серверного приложения. В такой процедуре (функции) недоступен контекст формы (включая данные формы). Допустимыми являются вызовы только других внеконтекстных процедур (функций). При вызове этих процедур (функций) не выполняется передача данных формы на сервер и обратно. Применение внеконтекстных процедур (функций) позволяет существенно уменьшить объем передаваемых данных при вызове серверной процедуры (функции) из среды клиентского приложения.

Отсутствие директивы компиляции перед процедурой (функцией) означает использование директивы по умолчанию. Директивой по умолчанию является &НаСервере. Не допускается использование нескольких директив компиляции перед одной процедурой (функцией). Не допускается наличие одноименных процедур (функций), отличающихся только директивами компиляции.

В модуле управляемой формы допускается использование инструкций препроцессору. Рекомендуется использовать инструкции препроцессора только внутри процедур (функций). Для понимания результата при "пересечении" инструкциями препроцессора границ процедур (функций) следует учитывать, что обработка инструкций препроцессора выполняется до обработки директив компиляции.

В модуле команды предопределенная процедура-обработчик ОбработатьКоманду должна предваряться директивой &НаКлиенте, так как выполнение команды происходит в клиентском приложении.

Модуль формы
 В модуле формы доступны директивы компиляции – &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста.
Модуль команды
 В модуле команды доступны директивы компиляции – &НаКлиенте, &НаСервере, &НаКлиентеНаСервере.
Общий модуль
 В общем модуле доступны директивы компиляции – &НаКлиенте, &НаСервере.
10 Fragster
 
гуру
21.03.12
11:54
это еще из 7.7 помнится, хорошо было... Процедура(Контекст)
11 Max1986
 
21.03.12
11:54
(8)т.е. реквизиты формы не передаются и переменные которые описаны ?
А данные объекта?
12 Necessitudo
 
21.03.12
11:54
То есть если у тебя на форме есть реквизит Контрагент, то в процедуре с директивой компилятору &НаСервереБезКонтекста ты не сможешь получить ее значение просто так, а вот в случае  &НаСервере - сможешь
13 Necessitudo
 
21.03.12
11:55
например такое
14 Max1986
 
21.03.12
11:55
(12)понял. А если Это поле Контрагент связано с данными объекта?
15 le_
 
21.03.12
11:56
У Гилева неплохой видеокурс по УФ.
16 Necessitudo
 
21.03.12
11:56
(14) Например как?) Объект недоступен на клиенте.
17 Нуф-Нуф
 
21.03.12
11:57
купи курс Гилева по программированию, там это все разжевано. и не только это
18 Aswed
 
21.03.12
11:57
А кто нить проверял насколько быстрее работает &НаСервереБезКонтекста чем просто &НаСервере???
19 Necessitudo
 
21.03.12
11:58
(18) Еще бы.
20 Necessitudo
 
21.03.12
11:58
(18) Можно включить логику и сравнить объемы передаваемых данных при вызове сервера.
21 Max1986
 
21.03.12
12:00
(17)а как называется - там много курсов. Имя как его
22 Aswed
 
21.03.12
12:00
(19) ну так насколько в среднем?
23 Max1986
 
21.03.12
12:00
(16)>> Объект недоступен на клиенте.

Это почему!!! А как же данные получает!
24 le_
 
21.03.12
12:03
(23) ДанныеФормыСтруктура

Структура данных для моделирования данных, редактируемых в управляемой форме. Моделирует объект с набором свойств.
Для текущих данных таблицы управляемой формы обращение к значениям осуществляется по именам колонок.
Для параметров управляемой формы обращение к значениям осуществляется по именам параметров.
25 Necessitudo
 
21.03.12
12:04
(22) А нельзя точно сказать. Если форма забита элементами, то на размер этих элементов))
(23) На форме представлен не объект, а некое подобие - ДанныеФормы.
26 Aswed
 
21.03.12
12:05
(25) Короче так же как и я) Народ пользуется но не знает сколько выгоды с этого получает)))
27 Ненавижу 1С
 
гуру
21.03.12
12:07
хорошую траву курили архитекторы платформы, забористую
28 le_
 
21.03.12
12:23
(27) Ну, а как бы вы реализовали работу web-клиента? )
29 Fragster
 
гуру
21.03.12
12:24
вот:

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

&НаСервереБезКонтекста
Процедура П2()
   
КонецПроцедуры


&НаКлиенте
Процедура Ткнуть(Команда)
   Д = ТекущаяДата();
   Для Сч =1 по 1000 Цикл
       П1();
   КонецЦикла;
   Сооб = Новый СообщениеПользователю;
   Сооб.Текст = "С контекстом " + (ТекущаяДата() - Д);
   Сооб.Сообщить();
   
   Д = ТекущаяДата();
   Для Сч =1 по 1000 Цикл
       П2();
   КонецЦикла;
   Сооб = Новый СообщениеПользователю;
   Сооб.Текст = "Без контекста " + (ТекущаяДата() - Д);
   Сооб.Сообщить();
КонецПроцедуры


на форме кроме кнопки ничего нет, это внешняя обработка, результат:
С контекстом 30
Без контекста 17
30 Fragster
 
гуру
21.03.12
12:25
думаю, если данные какие-то есть, то разница будет сильно существеннее
31 Ненавижу 1С
 
гуру
21.03.12
12:26
(28) молча

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

Процедура ПриНажатии(Кнопка)
 ЭтотОбъект.Мегарасчет(); // тут платформа сама знает что надо вызвать сервер, ибо объект живет там
КонецПроцедуры
32 Mort
 
21.03.12
12:28
(31) А если тебе нужно вызвать три функции объекта, например:

Процедура ПриНажатии(Кнопка)
 ЭтотОбъект.Мегарасчет1();
 ЭтотОбъект.Мегарасчет2();
 ЭтотОбъект.Мегарасчет3(); // Три раза сгоняли туда-обратно
КонецПроцедуры

Это как решить?
33 Ненавижу 1С
 
гуру
21.03.12
12:29
(32) ну если напишешь так, то так и будет 3 вызова, если важно оптимизировать, то можно объединять в один метод
то есть свобода выбора
34 le_
 
21.03.12
12:30
(31) А объекта нет на клиенте. Исключили его оттуда, по всей видимости, чтобы разгрузить тонкий клиент и снизить нагрузку на сеть.
35 Ненавижу 1С
 
гуру
21.03.12
12:31
(34) а кто сказал что он там есть, но ссылку на него не запрещено ведь хранить, она то легкая))
36 Mort
 
21.03.12
12:32
(33) Это для примера я вызвал функции одного объекта, а это могут быть любые три серверные функции. Вся программа превратится в переходы на сервер.
37 Ненавижу 1С
 
гуру
21.03.12
12:33
(36) может и превратиться, а может и нет
кстати не суть важно, я ведь могу и методы разных объектов объединять
свобода выбора должна быть
38 le_
 
21.03.12
12:35
(37) По-моему, самостоятельный вызов серверных процедур и обращение к объектам, сидящим на сервере с помощью описанных директив и методов предоставляет достаточную свободу выбора, гибкость и, в общем-то, удобно.
39 Mort
 
21.03.12
12:36
(37) Объединять и создавать комплексные методы каждый раз вместо простого написания директив как сделано в 1С - не лучшая альтернатива.
40 Ненавижу 1С
 
гуру
21.03.12
12:37
(38) ну вот в единичном случае как раз нет
вместо того чтобы сразу вызвать что-то серверное в событии формы я должен вызвать серверное формы, которое и нужно только для вызова того самого серверного
41 Ненавижу 1С
 
гуру
21.03.12
12:39
(39) да ладно, в результате и плодите эти самые методы
на самом деле класс формы это два класса: один на сервере, один на клиенте
так вот 1С жестко застваляет юзать класс "форма на сервере", что не всегда удобно
42 Mort
 
21.03.12
12:41
Плюс дай одинэсникам программировать УФ не управляя серверным и клиентским потоками, они такого Г напишут... А потом все будут говорить "1С нереально тормозит".
43 Ненавижу 1С
 
гуру
21.03.12
12:42
(42) да они в Неопределено и NULL путаются, чего там!
44 Max1986
 
21.03.12
12:59
(43)в Дельфи есть Неопределено?
45 le_
 
21.03.12
13:02
(40) Форма хранится на сервере, на клиенте только некое визуальное представление данных. По-моему, логично - передаешь управление на сервер и там делаешь с формой то, что хочешь. На клиенте обновляешь визуальное представление.
И при этом, есть возможность вызова серверных процедур без передачи всего контекста...
46 acsent
 
21.03.12
13:04
(41) как раз с кнопкой все просто, пару строк кода не так уж и сложно написать
47 Ненавижу 1С
 
гуру
21.03.12
13:09
(44) причем тут делфи? я говорю что нет смысла его хранить в БД, когда есть значение NULL
48 Ненавижу 1С
 
гуру
21.03.12
13:10
(45)(46) все понятно: 1с это очень круто, это самое лучше что есть в мире

продолжайте так думать
49 Mort
 
21.03.12
13:12
(48) Да нет, просто если говоришь "г-но", будь добр предложи концепцию, которая не рушится парой-тройкой неприятных примеров.
50 Ненавижу 1С
 
гуру
21.03.12
13:13
(49) я предложил в (31), но мне сказали "найдутся го_но-кодеры, которые все загадят", так я вам ребята скажу: "они всегда найдутся!"
примеров массы
51 le_
 
21.03.12
13:21
(50) Я считаю, сократить количество возможные ошибок конфигурирования, путем закладывания определенных правил в платформу - это хорошо...
52 IamAlexy
 
21.03.12
13:24
(50) вопрос в том - передавать ли на сервер контекст формы.
разница в быстродействии - очень и очень ощутима

а это решить может только разработчик
53 Ненавижу 1С
 
гуру
21.03.12
13:24
в общем я к чему? собираю данные по созданию платформы
54 Mort
 
21.03.12
13:25
(50) Пример в (31) не выдерживает вообще никакой критики. По ответу на вопрос (32) неясно - где будут хранится эти "комплексные методы" если в ход серверной обработки используются данные формы.

А вопросов ещё можно кучу накидать:
1. должна ли платформа обновить данные коллекции формы после выполнения такого метода?
2. Как выполнять доступ к функциям прочих объектов и чисто серверных функций (или клиент должен знать все богатство модулей и объектов решения? какой он тогда тонкий?)
3. Где описывать серверные события создания, чтения, записи и т.д ?

Вот когда будет целостная концепция отвечающая на эти и другие вопросы, а не один пример в виде вызова функции, тада я поверю.
55 Ненавижу 1С
 
гуру
21.03.12
13:28
(54) тут согласен сложный вопрос, но смысл подумать тоже есть