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

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

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

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

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

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

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

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

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


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

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


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

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

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