Имя: Пароль:
1C
1С v8
Как в управляемой форме отследить, что был хотя бы один серверный вызов
, ,
0 TormozIT
 
гуру
14.10.21
16:41
Есть в модуле упр. формы процедура, которая зовется много раз. Нужно внутри нее универсально определить, был ли хотя бы один контекстный серверный вызов с прошлого выполнения этой процедуры.
Можно добавлять переменные модуля и реквизиты формы.
Как решить такую задачу?
1 Ненавижу 1С
 
гуру
14.10.21
16:47
(0) то есть вызов с клиента? потому что я не понимаю, как с клиента можно одну и туже процедуру вызвать и контекстно и внеконтекстно
2 TormozIT
 
гуру
14.10.21
16:48
Процедура клиентская конечно.
3 Kassern
 
14.10.21
16:49
(1) вручную тыкая на кнопочку)
4 RomanYS
 
14.10.21
16:50
(0) вроде работает

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

&НаКлиенте
Процедура Команда1ВЫзов(Команда)
    Команда1НаСервере();
КонецПроцедуры

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

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

&НаКлиенте
Процедура Команда2Вызова(Команда)
    Команда1НаСервере();
    Команда1НаСервере();
КонецПроцедуры

#Если Сервер Тогда
    СчетчикСервер = СчетчикСервер + 1;
#КонецЕсли

#Если Клиент Тогда
    СчетчикКлиент = СчетчикКлиент + 1;
#КонецЕсли
5 Garykom
 
гуру
14.10.21
16:55
(0) долго объяснять но то что ты хочешь изврат
и тему в которой спрашивал не могу найти
6 mikecool
 
14.10.21
16:56
(4) счетчики срабатывают при выполнении команд? оО
7 RomanYS
 
14.10.21
16:57
(6) Да, только на контекстные вызовы
8 RomanYS
 
14.10.21
16:57
+(7) клиентский только при создании
9 TormozIT
 
гуру
14.10.21
16:59
Платформа счетчик серверных вызовов в управляемой форме внутри ведет. Но доступа к нему в объектной модели нет.
ФОрма у меня большая и кода много. Все серверные вызовы в ней искать долго, если идти в строну везде явно какой то флаг/счетчик менять, и главное потом кто то вставит новый серверный вызов без такого сервисного кода.
10 RomanYS
 
14.10.21
17:02
(9) смотри тест в (4)
Тебе нужно только реквизит формы и
#Если Сервер Тогда
    СчетчикСервер = СчетчикСервер + 1;
#КонецЕсли
11 TormozIT
 
гуру
14.10.21
17:03
(4) Попробую.
12 acht
 
14.10.21
17:05
(4) Интересно. А неявные вызовы ловятся, через изменение какого-нибудь заголовка элемента формы, не пробовал?
13 mikecool
 
14.10.21
17:07
(7) не понятно, почему так отрабатывает
14 pechkin
 
14.10.21
17:08
(13) форма создается каждый раз
15 mikecool
 
14.10.21
17:10
(14) а реквизиты формы не очищаются?
16 TormozIT
 
гуру
14.10.21
17:10
(14) Не форма, а модуль инициируется при каждом контекстном вызове
17 Ненавижу 1С
 
гуру
14.10.21
17:10
+(14) фактически это два разных типа: "ФормаНаКлиенте" и "ФормаНаСервере"
18 RomanYS
 
14.10.21
17:11
(12) А как их гарантировано получить. Такой код счетчик не изменил
&НаКлиенте
Процедура КомандаНеЯвно(Команда)
    Заголовок = "Тест" + СчетчикСервер;
    Элементы.Команда1.Заголовок = ""+СчетчикСервер
КонецПроцедуры
19 pechkin
 
14.10.21
17:11
(16) ну так он инициируется потому что форма создается. иначе зачем?
20 TormozIT
 
гуру
14.10.21
17:12
(4) Подтверждаю. Способ решает задачу. Спасибо.
21 pechkin
 
14.10.21
17:12
получается из-за этого все эти формы и тормозят
22 H A D G E H O G s
 
14.10.21
17:13
(21) Да ладно! :-)
23 H A D G E H O G s
 
14.10.21
17:13
(20) Сам хочешь на сервер часть контекста передавать?
24 H A D G E H O G s
 
14.10.21
17:14
(20) Через внеконтекстные
25 pechkin
 
14.10.21
17:15
(22) ну так вроде 1с обещали что оптимизировали там что-то.
я думал что создание каждый раз это первый пункт на оптимизацию. и давно уже сделано
26 Ненавижу 1С
 
гуру
14.10.21
17:16
(18) например такое:

ТаблицаФормы (FormTable)
ВысотаПодвала (FooterHeight)
Использование:
Чтение и запись.
Описание:
Тип: Число.
Содержит высоту подвала таблицы в строках.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.


>>>>>>>>>>>>>>>>>>>>>>>>Изменение свойства на клиенте требует обращения к серверу.
27 Ненавижу 1С
 
гуру
14.10.21
17:17
(25) а что там оптимизировать можно, если серверный контекст не сохраняется между вызовами?
28 TormozIT
 
гуру
14.10.21
17:17
Задача (0) родилась как средство борьбы с аварийным завершением приложения при обращении к переменной, куда помещено окно веббраузера Браузер=Форма.Элементы.ПолеHTML.Документ.defaultView.
После серверного вызова даже проверка "Браузер = 0" вызывает аварийное завершение (8.3.17). С помощью проверки "был ли серверный вызов", я без чтения значения проблемной переменной (испорченного объекта браузера) сразу понимаю, что его надо заменить ссылкой на живой объект браузера. А само кэширование этого объекта потребовалось для ускорения работы кода, который часто обращается к функциям Javascript.
29 pechkin
 
14.10.21
17:18
(27) ну данные то где-то лежат
30 Ненавижу 1С
 
гуру
14.10.21
17:20
(29) на клиенте они лежат, вызвали сервер - отправили данные формы на сервер, потом обратно
31 pechkin
 
14.10.21
17:23
(30) не все так просто. а как же табличные документы, которые отображаются по мере прокрутки?
32 Garykom
 
гуру
14.10.21
17:23
(28) как и предполагал это изврат
33 pechkin
 
14.10.21
17:23
или табличные части документов?
34 Ненавижу 1С
 
гуру
14.10.21
17:24
(33) табличные части документов ВСЕ отправляются на клиента полностью, имхо
35 Garykom
 
гуру
14.10.21
17:25
(34) неа, только те поля в списке для формы
36 RomanYS
 
14.10.21
17:26
(26) (12) Ага, работает
&НаКлиенте
Процедура КомандаНеЯвно(Команда)
    Элементы.ТЗ.ВысотаПодвала = СчетчикСервер;
КонецПроцедуры
37 pechkin
 
14.10.21
17:26
(34) H A D G E H O G s не даст соврать, что это не так
38 Ненавижу 1С
 
гуру
14.10.21
17:26
(35) про поля надо подумать, но строки же точно все?
39 Ненавижу 1С
 
гуру
14.10.21
17:26
(37) надо доказательства
40 Garykom
 
гуру
14.10.21
17:27
(28) >переменной, куда помещено окно веббраузера Браузер=Форма.Элементы.ПолеHTML.Документ.defaultView.

Можно объяснить в чем смысл "кэширования"?
И за счет чего происходит "ускорения работы кода, который часто обращается к функциям Javascript"?
41 pechkin
 
14.10.21
17:27
(34) и даже 1с рекомендует обрабатывать большие тч на сервере, а не на клиенте.
даже если там серверного кода нет
42 Ненавижу 1С
 
гуру
14.10.21
17:28
(41) что-то в прошлый раз я на этои же форуме читал обратное, о слишком увлекающихся на сервере
43 pechkin
 
14.10.21
17:31
44 Garykom
 
гуру
14.10.21
17:35
(43) что еще хуже он может базу в случае реально много строк в ТЧ дергать несколько раз
45 Garykom
 
гуру
14.10.21
17:36
(44)+ самый оптимальный вариант это ТЧ в ТЗ не сервере, обработать и обратно целиком в ТЧ походу
46 Garykom
 
гуру
14.10.21
17:36
(45) *на сервере
47 Fragster
 
гуру
14.10.21
17:38
может быть можно как-то использовать сайд эффект ПоместитьВоВременноеХранилище в сочетании с (4) Если параметр не указан, помещенное значение будет удалено после очередного запроса сервера из общего модуля, при контекстном и неконтекстном серверном вызове из формы, при серверном вызове из модуля команды или при получении формы. а хранить УИ можно в параметре сеанса, например.
48 Fragster
 
гуру
14.10.21
17:38
(34) нет
49 Fragster
 
гуру
14.10.21
17:39
(47) хранить УИ = передавать адрес в серверный контекст
50 Fragster
 
гуру
14.10.21
17:40
хотя блин, это и так требует серверного вызова )
51 TormozIT
 
гуру
14.10.21
18:46
(40) Смысл кэширования - сохранять результат долгой операции в разрезе входных параметров. В данном случае долгой была операция ".defaultView".
52 Garykom
 
гуру
14.10.21
20:53
(51) долгая это в смысле в цикле что ли дергаешь?
может просто переписать без цикла, сразу все данные отправлять?
53 volfy
 
14.10.21
21:07
Спасибо (4), реально не знал что так сработает.
54 TormozIT
 
гуру
14.10.21
22:37
(52) Предлагаешь переписать 5000 строк кода, чтобы было все "красиво и правильно" вместо 3-х? Это выглядит несколько нерационально.
55 ДедМорроз
 
14.10.21
23:30
Так с клиента можно вызвать общий модуль на сервере,с галочкой вызов сервера - на сервер будет переход,и даже передача параметров сеанса,но отследить это очень проблематично.
56 TormozIT
 
гуру
15.10.21
00:24
(55) Не понял, кому ты отвечаешь. Но если мне, то ты пропустил слово "контекстный".
57 Garykom
 
гуру
15.10.21
00:30
(54) Угу вместо того чтобы надеяться на незадокументированные возможности
Запросы в цикле тоже можно делать а потом удивляться что тормозит да
58 ДедМорроз
 
16.10.21
14:21
Контекстный вызов и вызов с передачей контекста (при обновлении формы) это немного разные вещи.
И отловить контекстный вызов без выхова функции модуля все равно,что ловить безконтекстный.
59 pechkin
 
16.10.21
14:44
(58) в чем разница?
60 TormozIT
 
гуру
16.10.21
19:00
В любом случае модуль формы инициируется на сервере, если она туда приехала.
61 Kesim
 
19.10.21
14:18
(0) Стек вызовов и замер производительности не предлагать?
62 polosov
 
19.10.21
14:21
(61) Речь про рантайм, наверное.
63 pechkin
 
19.10.21
14:34
только вот интересно почему клиентская переменная умирает при вызове сервера?
64 dmpl
 
19.10.21
14:41
(16) Это в любой следующей версии платформы может поломаться.
65 polosov
 
19.10.21
14:45
(63) Ты про что?
Если ты в модуле объявил клиентскую переменную, и присвоил ей значений в событии, то при переходе на сервер и обратно она не меняется.
Проблема может возникнуть, если ты инициализируешь переменную в модуле (вне событий).
66 pechkin
 
19.10.21
14:46
(65) ну у тс же умирает. правда умирает как то по странному
67 dmpl
 
19.10.21
14:49
+(64) Логичнее очищать на сервере испорченный объект. Тогда не будет вылета платформы.
68 polosov
 
19.10.21
14:51
(66) Возможно при возвращении с сервера ПолеHTML переинициализируется и данные в переменной протухают.
69 TormozIT
 
гуру
19.10.21
14:52
(66) Это же webKit, огромный объект с кучей еще не выловленных багов. Вот один из его дочерних объектов по прямой ссылке портится после возврата из контекстного вызова, но он же по динамической (долгой) ссылке работает корректно.
70 dmpl
 
19.10.21
14:53
(68) Возможно проблема в сериализации/десериализации мутабельного значения.
71 polosov
 
19.10.21
14:54
(70) Оно бы поругалось. Скорее всего сам WebKit режет данные, а платформа об этом не знает (не генерируется исключений)
72 dmpl
 
19.10.21
14:58
(71) А вот не факт. Тогда придется вообще поле HTML запретить. Ведь есть же скрипты, которые могут его поменять, в т.ч. пока идет вызов на сервере.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн