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

1. native-api 17.08.22 11:47 Сейчас в теме
Есть обработка с несколькими формами и рядом реквизитов.

Необходимо в зависимости от настроек устанавливать определенный реквизит (в моем случае булевский, так что назовем его для примера "Флаг") прикладного объекта "Обработка", соответствующего выполняемой обработке, чтобы он влиял на логику процедур в модуле объекта ("Если ЭтотОбъект.Флаг Тогда").

---

Я делаю это, устанавливая реквизит основной формы "Объект.Флаг" из сохраненных настроек (в "ПриСозданииНаСервере") или после изменения настроек.

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

---

Методом проб и ошибок нашел следующий способ:

// модуль вспомогательной формы
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	//В основной форме перед созданием вспомогательной формы добавляю Флаг в ее параметры.
	//Значение необходимо поместить и в Объект, и в ОбъектОбработка.
	//Без первого оно не сохраняется в следующих обработчиках,
	// даже если вызвать ЗначениеВРеквизитФормы.
	//Без второго оно вообще не появляется в серверном объекте ЭтотОбъект.
	Объект.Флаг = Параметры.Флаг;
	ОбъектОбработка = РеквизитФормыВЗначение("Объект");
	ОбъектОбработка.Флаг = Параметры.Флаг;

КонецПроцедуры
Показать


Но, мне кажется, должен быть более простой способ, или вообще это должно происходить автоматически: т.к. обе формы относятся к одному и тому же экземпляру обработки, логично ожидать, что реквизиты "Объект" в них должны содержать одно и то же (как минимум, изначально), а "РеквизитФормыВЗначение("Объект")" вообще должны получать один и тот же объект.

Идеальна будет ссылка на документацию, где описывается, по какой схеме происходит / предполагается происходить обмен данными в описанных мной обстоятельствах (сам уже искал).

---

Прочие рассмотренные варианты:

* Передача флага через параметр процедуры крайне нежелательна, т.к. ветвление добавлено в расширении (т.е. я не могу менять списки параметров), и ветвление происходит глубоко в штатной логике (т.е. доп. параметр пришлось бы передавать через все уровни по цепочке) .
* Для справочников и документов передача данных из формы в прикладной объект происходит по "Записать()", но обработки записывать нельзя
По теме из базы знаний
Найденные решения
3. spacecraft 17.08.22 13:39 Сейчас в теме
(1) нужно понимать как работает механизм создания и работы формы на УФ.
Общий механизм такой:
1. Создается объект и при возможности заполняется данными из базы.
2. На основании данных этого объекта создается серверная форма.
3. объект удаляется из памяти.
4. данные серверной формы сериализуются и передаются на клиент.
5. на клиенте происходит создание клиентской формы и заполнение ее при десериализации полученных данных.

При выполнении метода РеквизитФормыВЗначение("Объект") идет обратный процесс и Объект создается новый и заполненный данными полученными с клиента.

Для обработки выбрасываем заполнение данными из базы данных.

Вот и получается, что для каждой формы обработки Объект будет новый и ничего не знает про другие объекты.
Поэтому наиболее распространенный способ это передача данных напрямую (или опосредовано) между формами.
native-api; FatPanzer; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. RustamZz 17.08.22 13:22 Сейчас в теме
(1) Сделайте реквизит в обработке
3. spacecraft 17.08.22 13:39 Сейчас в теме
(1) нужно понимать как работает механизм создания и работы формы на УФ.
Общий механизм такой:
1. Создается объект и при возможности заполняется данными из базы.
2. На основании данных этого объекта создается серверная форма.
3. объект удаляется из памяти.
4. данные серверной формы сериализуются и передаются на клиент.
5. на клиенте происходит создание клиентской формы и заполнение ее при десериализации полученных данных.

При выполнении метода РеквизитФормыВЗначение("Объект") идет обратный процесс и Объект создается новый и заполненный данными полученными с клиента.

Для обработки выбрасываем заполнение данными из базы данных.

Вот и получается, что для каждой формы обработки Объект будет новый и ничего не знает про другие объекты.
Поэтому наиболее распространенный способ это передача данных напрямую (или опосредовано) между формами.
native-api; FatPanzer; +2 Ответить
4. RustamZz 17.08.22 16:19 Сейчас в теме
(3)
Папа! А ты сейчас с кем разговаривал?
:)
5. native-api 18.08.22 11:31 Сейчас в теме
(3) Получается, несмотря на обманчивое присутствие серверной переменной "ЭтотОбъект", никакого экземпляра "текущего объекта" на сервере не хранится, и хранить в нем состояние, как в ООП, нельзя? Дерьмово.
С другими типами, получается, так же? Даже если прикладной объект в базе есть -- верить его реквизитам во вспомогательных формах опасно, т.к. он мог измениться?

Хорошо, что по второму вопросу? Можно ли упростить / привести к стандарту мой приведенный код? В основной форме мне почему-то достаточно установить реквизит у "Объект", чтобы он далее появился у "ЭтотОбъект" в нужном месте, а во вспомогательной форме -- нет.
По сказанному вами, достаточно установить реквизит у "Объект". Но в моем случае при этом в следующем вызове обработчика я и там, и там снова вижу значение по умолчанию.
6. spacecraft 18.08.22 11:44 Сейчас в теме
(5)
Получается, несмотря на обманчивое присутствие серверной переменной "ЭтотОбъект", никакого экземпляра "текущего объекта" на сервере не хранится, и хранить в нем состояние, как в ООП, нельзя?

В модуле формы ЭтотОбъект синоним ЭтаФорма.


(5)
По сказанному вами, достаточно установить реквизит у "Объект"

Это где такое было сказано?
В модуле формы "Объект" это основной реквизит формы. У кажной формы он свой.
РеквизитФормыВЗначение("Объект") создает новый объект, который заполняется из данных основного реквизита формы "Объект".
Поэтому только передача нужных значений в саму форму. Можно напрямую через форму, можно через параметры, можно через временное хранилище.
Но каждая форма независима от другой в плане основного реквизита формы (соответственно и объект). Считайте, что это два разных объекта. Тут с термином может возникнуть путаница. Объект, который всегда есть на форме, это основной реквизит формы "Объект". Объект обработки это отдельная сущность и она не хранится на сервере (как впрочем и на клиенте).
7. native-api 18.08.22 11:54 Сейчас в теме
(6) В (0) я привел код из процедуры "ПриСозданииНаСервере" вспомогательной формы, где я устанавливаю реквизит и в "Объект" этой (вспомогательной) формы, и в "РеквизитФормыВЗначение("Объект")", иначе не работает (в комментарии описано, что именно).

По рассказанному вами, каждый раз при вызове "РеквизитФормыВЗначение("Объект")" данные передаются из "Объект" в полученный объект типа обработка (для краткости назовем его "ОбъектОбработка").

Согласно этому, в моем коде достаточно установить реквизит у Объект, и во всем дальнейшем коде изменение будет видно и в "Объект", и в "ОбъектОбработка", и, соответственно, в "ЭтотОбъект" в коде модуля объекта.

Но такого не происходит.
8. spacecraft 18.08.22 12:20 Сейчас в теме
(7)
По рассказанному вами, каждый раз при вызове "РеквизитФормыВЗначение("Объект")" данные передаются из "Объект" в полученный объект типа обработка (для краткости назовем его "ОбъектОбработка").

Согласно этому, в моем коде достаточно установить реквизит у Объект, и во всем дальнейшем коде изменение будет видно и в "Объект", и в "ОбъектОбработка", и, соответственно, в "ЭтотОбъект" в коде модуля объекта.

Но такого не происходит.

Да. Будет. Пробуйте:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    Объект.Флаг = Параметры.Флаг;
    ОбъектОбработка = РеквизитФормыВЗначение("Объект");
    // тут точку остановки и посмотреть значение в ОбъектОбработка.Флаг

КонецПроцедуры


Только есть такой ньюанс, который я уже не первое сообщение озвучиваю: в "ОбъектОбработка" будет видно в области видимости этой переменной. После Объект, на который ссылается переменная ОбъектОбработка будет уничтожен.
9. native-api 18.08.22 12:22 Сейчас в теме
(8) ОК. Т.е. если у меня этого не происходит -- это ненормально, возможно, что-то другое перезаписывает изменения. Понял.
10. spacecraft 18.08.22 12:24 Сейчас в теме
(9) смотря где пытаетесь потом это посмотреть. Потом (вне процедуры ПриСозданииНаСервере) этого и не будет.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот