Вход | Регистрация
 

УФ. Как в серверном событии определить, что форма открыта

УФ. Как в серверном событии определить, что форма открыта
Я
   SeiOkami
 
02.08.21 - 12:20
Как можно на сервере проверить, что управляемая форма уже открыта ?
   Мультук
 
1 - 02.08.21 - 12:21
(0) В каком-таком серверном событии ? Имя у события есть ?
   butterbean
 
2 - 02.08.21 - 12:22
(0) в смысле форма какого-то конкретного объекта?
   SeiOkami
 
3 - 02.08.21 - 12:27
На сервере есть форма. Нужно проверить открыта она или нет.

Но как я понимаю, это можно сделать только на клиенте. И приходится добавлять реквизит формы "ФормаОткрыта" типа Булево и заполнять его в ПриОткрытии()
   acht
 
4 - 02.08.21 - 12:30
(3) И очищать в ПриЗакрытии, тогад уж. Закрытые формы тоже существуют.
Но скорей всего у тебя косяк в сценариях и архитектуре, если требуется такой знатный костыль.
   SeiOkami
 
5 - 02.08.21 - 12:30
Например, мой конкретный кейс.
Нужно отключать пользовательские настройки при открытии формы списка. Просто снимать галочки с пользовательских отборов. Но только при открытии. Далее, если пользователь подгрузит свои настройки, то их обрабатывать не нужно.

В обработчике динамического списка ПередЗагрузкойПользовательскихНастроекНаСервере() нужно определить, форма открыта или нет. Если открыта, то это пользователь нажал на кнопку загрузки настроек и не нужно ничего делать. Если же не открыта, то это моя ситуация.
   SeiOkami
 
6 - 02.08.21 - 12:32
(4), к сожалению, в 1С мало доступно событий в отношении динамических списков.
   Kassern
 
7 - 02.08.21 - 12:33
(5) а при открытии самой формы разве нельзя привязаться к событию?
   SeiOkami
 
8 - 02.08.21 - 12:34
(7), при открытии формы настройки уже загружены. Мне нужно это делать до загрузки в событии ПередЗагрузкойПользовательскихНастроекНаСервере()
   Kassern
 
9 - 02.08.21 - 12:35
(7) вы не поняли видимо меня, или я вас. У вас есть форма, на ней динамический список. У списка есть какие то отборы пользовательские. Из вашего кейса вам нужно всегда, при открытии формы со списком очищать пользовательские настройки. Ну так привяжитесь к событию формы, а не к событию дин списка. При открытии очистили пользовательские отборы и ничего проверять не нужно.
   Вафель
 
10 - 02.08.21 - 12:37
(8) почему именно до?
   Kassern
 
11 - 02.08.21 - 12:38
(9) так же есть процедура при создании на сервере, она явно раньше отрабатывает и 1 раз при открытии.
   Kassern
 
12 - 02.08.21 - 12:39
(10) в этом то вся проблема, человек увидел решение через этот обработчик и начал все под него подстраивать (лепить велосипед), ладно хоть глобальный параметр не замутил для этой формы или какой нить виндовый комобъект для отслеживания открытых форм)
   SeiOkami
 
13 - 02.08.21 - 12:44
(9),

Во-первых, это не так оптимально.

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

В-третьих, если нужно отлавливать события в ПередЗагрузкойПользовательскихНастроекНаСервере() и часть действий выполнять при открытии, часть при нажатии кнопки, а часть и там и там, то легче уже использовать признак ФормаОткрыта
   SeiOkami
 
14 - 02.08.21 - 12:44
(11), в ПриСозданииНаСервере нет ещё пользовательских настроек. Они будут дальше в ПередЗагрузкойПользовательскихНастроекНаСервере()
   SeiOkami
 
15 - 02.08.21 - 12:45
Я просто думал, что есть ещё какой-то способ на сервере определить, что форма была открыта. Но придется через реквизит
   acht
 
16 - 02.08.21 - 12:45
(13) Вызови в конце своего обработчика УстановитьДействие(что-то там, Неопределено) и не парь людям мозг.
   SeiOkami
 
17 - 02.08.21 - 12:46
(16), к чему это вообще и как это мне поможет?
   Kassern
 
18 - 02.08.21 - 12:48
(13) вы хотите сказать, что при создании на сервере у вас нет возможности очистить пользовательские настройки динамического списка?
Почитайте эти темы:
Удалить пользовательские отборы в динамическом списке
https://infostart.ru/1c/articles/520593/
   SeiOkami
 
19 - 02.08.21 - 12:51
(18),

Во-первых, мне не нужно очистить, а нужно снять флаги использования. То есть доработать настройки.
Во-вторых, как раз то, что вы предлагаете - жуткий костыль. Оперировать хранилищами настроек вместо того, чтобы просто использовать штатные события.

Не, лучше "ФормаОткрыта" =)
   acht
 
20 - 02.08.21 - 12:56
(17) Твой обработчик отработает ровно один раз - при первом выполнении. После этого отключится и при загрузке настроек пользвателем неичего не будет очищать.

Хотя да, если начальных настроек нет, то он не позовется и убъет первые настройки, загруженные пользователем.
   TormozIT
 
21 - 02.08.21 - 13:54
https://infostart.ru/1c/articles/1207330/
Функция ЭтоВызовПослеОткрытияФормы(ЭтаФорма) Экспорт
    Возврат Не ЭтаФорма.Параметры.Свойство("ТолькоПросмотр");
КонецФункции
   SeiOkami
 
22 - 03.09.21 - 14:51
(21), то есть, у любой формы в параметрах ПриСозданииНаСервере() обязательно будет свойство "ТолькоПросмотр", а потом обязательно оно пропадет (при открытии)?
   TormozIT
 
23 - 03.09.21 - 18:57
(22) да
   polosov
 
24 - 03.09.21 - 18:59
(23) Это документированная фича?
   acht
 
25 - 03.09.21 - 19:45
(24) Все неключевые параметы формы видны только при ее создании. Остается выбрать из них тот, который будет существовать у формы любого типа.
   Ненавижу 1С
 
26 - 03.09.21 - 19:57
(21) а если форму закрыть?
   acht
 
27 - 04.09.21 - 10:32
(21) А вообще...

&НаКлиенте
Процедура Команда1(Команда)
    
    Форма = ПолучитьФорму("Справочник.Валюты.ФормаОбъекта");
    
    Сообщить("Форма открыта " + Форма.Открыта() + " результат " + ЭтоВызовПослеОткрытияФормы(Форма));
    Форма.Открыть();
    Сообщить("Форма открыта " + Форма.Открыта() + " результат " + ЭтоВызовПослеОткрытияФормы(Форма));
    
    
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ЭтоВызовПослеОткрытияФормы(Форма) Экспорт
    
    Возврат Не Форма.Параметры.Свойство("ТолькоПросмотр");
    
КонецФункции


Вывод:
Форма открыта Да результат Да
Форма открыта Нет результат Да

Что-то тут не так =)
   acht
 
28 - 04.09.21 - 10:56
А вывод сообщений я в неверном порядке скопировал, да...
Но это не отменят факт того, что результат вызова метода всегда Истина
   acanta
 
29 - 04.09.21 - 11:00
А какой результат вы ожидали? По умолчанию форма должна быть в режиме редактирования?
   acht
 
30 - 04.09.21 - 11:48
(29) > форма должна быть в режиме редактирования
Это к чему?
 
 
   TormozIT
 
31 - 04.09.21 - 23:20
(27) Да. Строго говоря это - проверка, что форма создана, т.е. событие ПриСозданииНаСервере отработало. Конечно правильнее будет назвать эту функцию ЭтоВызовПослеСозданияНаСервере, но тогда ее назначение будет менее очевидным.
Например в обработчиках
ПередЗагрузкойДанныхИзНастроекНаСервере()
ПриЗагрузкеДанныхИзНастроекНаСервере()
тоже уже не будет неключевых параметров как ты правильно заметил.
   Ненавижу 1С
 
32 - 04.09.21 - 23:29
В общем к сожалению есть только два сценария и надо выбрать подходящий:
1. Малый - просто передаем ЭтаФорма.Открыта() как параметр в серверный метод
2. Большой - создаем булев реквизит ФормаОткрыта и заполняем его в событиях ПриОткрытии/ПриЗакрытии
   TormozIT
 
33 - 04.09.21 - 23:32
(31) А нет. Зря я поддался вере в документацию. Проверил сейчас еще раз. Все таки неключевые параметры удаляются не сразу после события ПриСозданииНаСервере, а именно при первой передачи формы на клиент. Таким образом название функции в (21) корректное. И кстати функция чисто серверная. На клиенте она лишена смысла, т.к. там неключевых параметров не бывает.
   TormozIT
 
34 - 04.09.21 - 23:35
(27) Ну на клиенте то проверить, что форма открыта, легко - Открыта(). Поэтому непонятно, зачем ты мою серверную функцию туда примерять стал.
   серый КТУЛХУ
 
35 - 05.09.21 - 00:37
открыта она в этом же сеансе или открыта ли она в любом сеансе?
   Ненавижу 1С
 
36 - 05.09.21 - 11:51
(35) это как? Форма она внутри сеанса живёт вроде
   SeiOkami
 
37 - 24.09.21 - 10:53
Таааак...
Я сначала обрадовался и переделал свой код на Форма.Параметры.Свойство("ТолькоПросмотр");
А теперь ещё раз зашёл и прочитал новые сообщения 😅

Выходит, что такой код показывает не что форма уже открыта, а что она уже создана и передана на клиент?
   TormozIT
 
38 - 24.09.21 - 20:54
(37) Так точно. На клиент надо проверять через Открыта(), а на сервере через Форма.Параметры.Свойство("ТолькоПросмотр")


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.