Имя: Пароль:
1C
 
Как перенести глобальную переменную на управляемые формы
0 anikev
 
26.06.25
10:06
Всем привет! Переношу самописанный документ из обычных форм в управляемые.
В Обычных формах :

В модуле объекта объявлена переменная
Перем ФлИзмененОператор Экспорт;
далее процедурами меняются значения

В форме документа методом ПередОткрытием(Отказ, СтандартнаяОбработка) она инициализируется
ФлИзмененОператор  = Ложь;

Вот я не знаю, как мне такую же конструкцию реализовать в Управляемых формах.
1. Думал так же объявить в модуле объекта с директивой &НаКлиенте, но у меня там только серверные процедуры.
2. Еще есть вариант объявить ее с директивой &НаСервере, но тогда она будет жить, только во время серверного вызова, а мне нужна, пока открыта форма.
3. Можно было создать реквизит формы, но я не смогу получить значение этого реквизита из модуля объекта
4. Можно эту переменную хранить в реквизите объекта, тогда можно будет обращаться и с клиента и сервера, но это будет избыточно, так как значение переменной проверяется только, когда пользователь тыкает кнопки на форма
Вот уже всю голову сломал, как еще можно хранить значение, чтобы доступ был и с сервера и с клиента
1 vicof
 
26.06.25
10:10
Надо сначала понять, нахрена эта переменная нужна.
2 arsik
 
гуру
26.06.25
10:13
просто добавь реквизит формы, но на форму его не клади
3 craxx
 
26.06.25
10:13
(0) "2. Еще есть вариант объявить ее с директивой &НаСервере, но тогда она будет жить, только во время серверного вызова, а мне нужна, пока открыта форма."
Форма живет и на сервере тоже
4 Мультук
 
гуру
26.06.25
10:14
(0)

>>3. Можно было создать реквизит формы, но я не смогу получить значение этого реквизита из модуля объекта

Получить - нет.
Передать в модуль объекта - да.
В какой процедуре/функции эта переменная нужна ?

В остальном (1) + 1
5 anikev
 
26.06.25
10:14
(1) при изменении других полей проверяется значение этой переменной (булево) и заполняются, очищаются другие поля
6 anikev
 
26.06.25
10:15
(2) из модуля объекта не смогу взять значение
7 vicof
 
26.06.25
10:19
(5) Реквизит формы тебя спасет. см (2)
8 vicof
 
26.06.25
10:19
(6) Не надо из модуля объекта значения брать, все в форме делай
9 anikev
 
26.06.25
10:20
(4) (1) Используется:
1. На форме при нажатии на другую кнопку, меняется ее значение
2. В модуле объекта ПередЗаписью(),ОбработкаПроведения()
10 vicof
 
26.06.25
10:23
(9) Передавай ее из формы в ДополнительныеСвойства
11 anikev
 
26.06.25
10:23
(7) Я не нашел примера, как мне  обратиться к реквизиту формы из модуля объекта, подскажите плиз
12 arsik
 
гуру
26.06.25
10:24
(6) Это передается через ДополнительныеСвойства
Например в процедуре формы

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

ТекущийОбъект.ДополнительныеСвойства.Вставить("ФлИзмененОператор", ФлИзмененОператор);
КонецПроцедуры
13 craxx
 
26.06.25
10:25
(11) Форма.ИмяТвоегоРеквизита
14 arsik
 
гуру
26.06.25
10:26
(9) А как ты это обрабатываешь, если из формы списка записать или провести?
15 Мультук
 
гуру
26.06.25
10:27
(9) Опередил
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
		
ТекущийОбъект.ДополнительныеСвойства.Вставить("МояПрелесть", МояПрелесть);

//тут еще всякое
конецПроцедуры

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	
     Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;


Если ДополнительныеСвойства.Свойство("МояПрелесть") Тогда
   МояПрелесть = ДополнительныеСвойства.МояПрелесть;
конецЕсли;

//тут еще всякое
конецПроцедуры
16 PLUT
 
гуру
26.06.25
10:27
может будет достаточно проверить на Модифицированность* перед записью и эта переменная нафиг не нужна? и если у документа есть сцылка (это не новый), то можно зачитать было/стало у нужного реквизита документа и там уже много думать, если изменился...
17 vicof
 
26.06.25
10:29
(14) Тадададам))
18 anikev
 
26.06.25
10:30
(14) В Обычных формах переменная объявляется в модуле объекта - она экспортная. Вот и брать ее может и форма и сам модуль объекта.
19 anikev
 
26.06.25
10:31
(18) Просто это сейчас работает так)
20 arsik
 
гуру
26.06.25
10:32
(15)
Если ДополнительныеСвойства.Свойство("МояПрелесть") Тогда
   МояПрелесть = ДополнительныеСвойства.МояПрелесть;
конецЕсли; 

Есть конструкция поинтереснее в БСП
ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеСвойства, "МояПрелесть", Ложь);


// Возвращает значение свойства структуры.
//
// Параметры:
//   Структура - Структура
//             - ФиксированнаяСтруктура - объект, из которого необходимо прочитать значение ключа.
//   Ключ - Строка - имя свойства структуры, для которого необходимо прочитать значение.
//   ЗначениеПоУмолчанию - Произвольный - возвращается когда в структуре нет значения по указанному
//                                        ключу.
//       Для скорости рекомендуется передавать только быстро вычисляемые значения (например примитивные типы),
//       а инициализацию более тяжелых значений выполнять после проверки полученного значения (только если это
//       требуется).
//
// Возвращаемое значение:
//   Произвольный - значение свойства структуры. ЗначениеПоУмолчанию если в структуре нет указанного свойства.
21 Мультук
 
гуру
26.06.25
10:33
(20)

Спс. Еще один синтаксический сахар в мою сахарницу :-)
22 anikev
 
26.06.25
10:46
(20) Я правильно понимаю, что можно записывать и считывать дополнительные свойства только на сервере?
23 vicof
 
26.06.25
10:51
(22) Нет. Можно на сервере, толстом клиенте, внешнем соединении, мобильном приложении (сервер), мобильном автономном сервере.
24 Мультук
 
гуру
26.06.25
10:51
(22)

В (15) лежит готовый пример. Что еще нужно то ?

а) В модуле объекта всегда сервер

б)
&НаСервере
Процедура ПередЗаписьюНаСервере

Тоже сервер, дальше исполнение кода уходит в модуль объекта

в) На клиенте твоя переменная всегда доступна как
ЭтаФорма.МояПрелесть
25 ptiz
 
26.06.25
10:52
(22) Объект и модуль объекта в принципе существуют только на сервере. Когда выполняется код в форме - считай, что объекта и его модуля не существует, вообще. Данные формы всего лишь преобразуются в объект и обратно при необходимости.
26 arsik
 
гуру
26.06.25
11:09
(24) ЭтаФорма??? Может все-таки ЭтотОбъект? Или вообще без ЭтотОбъект.
27 vicof
 
26.06.25
10:55
А вообще я бы сделал реквизит документа "оператор".
И перед записью смотрел, отличается он от значения по ссылке или нет, и в зависимости от этого делал действия.
Кода в разы меньше.
28 Мультук
 
гуру
26.06.25
11:04
(26)

1) потому что мой пример вырван из контекста.
И я специально написал именно так (простите не привык ЭтотОбъект)

2) Вопрос "ляля" это реквизит формы или локальная переменная ?
Может сказать наверняка в пункте а?

а) ляля = Истина;
б) ЭтотОбъект.ляля = Истина;
29 anikev
 
26.06.25
11:08
(24) Все, понял. Спасибо!
30 Chai Nic
 
26.06.25
11:10
В управляемых формах нет глобальных переменных вне серверного контекста. То есть, переменную то объявить можно. И она будет доступна во всем стеке вызова серверных процедур. Но как только мы вернемся на клиент - то всё. При следующем серверном вызове она опять будет пустой.