Передача реквизитов между формой обработки и прикладным объектом обработки в случае нескольких форм
Есть обработка с несколькими формами и рядом реквизитов.
Необходимо в зависимости от настроек устанавливать определенный реквизит (в моем случае булевский, так что назовем его для примера "Флаг") прикладного объекта "Обработка", соответствующего выполняемой обработке, чтобы он влиял на логику процедур в модуле объекта ("Если ЭтотОбъект.Флаг Тогда").
---
Я делаю это, устанавливая реквизит основной формы "Объект.Флаг" из сохраненных настроек (в "ПриСозданииНаСервере") или после изменения настроек.
Однако, при открытии вспомогательной формы изменение не появляется ни в реквизите "Объект" этой вспомогательной формы, ни в "РеквизитФормыВЗначение("Объект").Флаг" -- и, соответственно, в процедурах модуля объекта обработки, вызываемых из этой вспомогательной формы, что приводит к ее некорректной работе.
---
Методом проб и ошибок нашел следующий способ:
Но, мне кажется, должен быть более простой способ, или вообще это должно происходить автоматически: т.к. обе формы относятся к одному и тому же экземпляру обработки, логично ожидать, что реквизиты "Объект" в них должны содержать одно и то же (как минимум, изначально), а "РеквизитФормыВЗначение("Объект")" вообще должны получать один и тот же объект.
Идеальна будет ссылка на документацию, где описывается, по какой схеме происходит / предполагается происходить обмен данными в описанных мной обстоятельствах (сам уже искал).
---
Прочие рассмотренные варианты:
* Передача флага через параметр процедуры крайне нежелательна, т.к. ветвление добавлено в расширении (т.е. я не могу менять списки параметров), и ветвление происходит глубоко в штатной логике (т.е. доп. параметр пришлось бы передавать через все уровни по цепочке) .
* Для справочников и документов передача данных из формы в прикладной объект происходит по "Записать()", но обработки записывать нельзя
Необходимо в зависимости от настроек устанавливать определенный реквизит (в моем случае булевский, так что назовем его для примера "Флаг") прикладного объекта "Обработка", соответствующего выполняемой обработке, чтобы он влиял на логику процедур в модуле объекта ("Если ЭтотОбъект.Флаг Тогда").
---
Я делаю это, устанавливая реквизит основной формы "Объект.Флаг" из сохраненных настроек (в "ПриСозданииНаСервере") или после изменения настроек.
Однако, при открытии вспомогательной формы изменение не появляется ни в реквизите "Объект" этой вспомогательной формы, ни в "РеквизитФормыВЗначение("Объект").Флаг" -- и, соответственно, в процедурах модуля объекта обработки, вызываемых из этой вспомогательной формы, что приводит к ее некорректной работе.
---
Методом проб и ошибок нашел следующий способ:
// модуль вспомогательной формы
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//В основной форме перед созданием вспомогательной формы добавляю Флаг в ее параметры.
//Значение необходимо поместить и в Объект, и в ОбъектОбработка.
//Без первого оно не сохраняется в следующих обработчиках,
// даже если вызвать ЗначениеВРеквизитФормы.
//Без второго оно вообще не появляется в серверном объекте ЭтотОбъект.
Объект.Флаг = Параметры.Флаг;
ОбъектОбработка = РеквизитФормыВЗначение("Объект");
ОбъектОбработка.Флаг = Параметры.Флаг;
КонецПроцедуры
ПоказатьНо, мне кажется, должен быть более простой способ, или вообще это должно происходить автоматически: т.к. обе формы относятся к одному и тому же экземпляру обработки, логично ожидать, что реквизиты "Объект" в них должны содержать одно и то же (как минимум, изначально), а "РеквизитФормыВЗначение("Объект")" вообще должны получать один и тот же объект.
Идеальна будет ссылка на документацию, где описывается, по какой схеме происходит / предполагается происходить обмен данными в описанных мной обстоятельствах (сам уже искал).
---
Прочие рассмотренные варианты:
* Передача флага через параметр процедуры крайне нежелательна, т.к. ветвление добавлено в расширении (т.е. я не могу менять списки параметров), и ветвление происходит глубоко в штатной логике (т.е. доп. параметр пришлось бы передавать через все уровни по цепочке) .
* Для справочников и документов передача данных из формы в прикладной объект происходит по "Записать()", но обработки записывать нельзя
По теме из базы знаний
Найденные решения
(1) нужно понимать как работает механизм создания и работы формы на УФ.
Общий механизм такой:
1. Создается объект и при возможности заполняется данными из базы.
2. На основании данных этого объекта создается серверная форма.
3. объект удаляется из памяти.
4. данные серверной формы сериализуются и передаются на клиент.
5. на клиенте происходит создание клиентской формы и заполнение ее при десериализации полученных данных.
При выполнении метода РеквизитФормыВЗначение("Объект") идет обратный процесс и Объект создается новый и заполненный данными полученными с клиента.
Для обработки выбрасываем заполнение данными из базы данных.
Вот и получается, что для каждой формы обработки Объект будет новый и ничего не знает про другие объекты.
Поэтому наиболее распространенный способ это передача данных напрямую (или опосредовано) между формами.
Общий механизм такой:
1. Создается объект и при возможности заполняется данными из базы.
2. На основании данных этого объекта создается серверная форма.
3. объект удаляется из памяти.
4. данные серверной формы сериализуются и передаются на клиент.
5. на клиенте происходит создание клиентской формы и заполнение ее при десериализации полученных данных.
При выполнении метода РеквизитФормыВЗначение("Объект") идет обратный процесс и Объект создается новый и заполненный данными полученными с клиента.
Для обработки выбрасываем заполнение данными из базы данных.
Вот и получается, что для каждой формы обработки Объект будет новый и ничего не знает про другие объекты.
Поэтому наиболее распространенный способ это передача данных напрямую (или опосредовано) между формами.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) нужно понимать как работает механизм создания и работы формы на УФ.
Общий механизм такой:
1. Создается объект и при возможности заполняется данными из базы.
2. На основании данных этого объекта создается серверная форма.
3. объект удаляется из памяти.
4. данные серверной формы сериализуются и передаются на клиент.
5. на клиенте происходит создание клиентской формы и заполнение ее при десериализации полученных данных.
При выполнении метода РеквизитФормыВЗначение("Объект") идет обратный процесс и Объект создается новый и заполненный данными полученными с клиента.
Для обработки выбрасываем заполнение данными из базы данных.
Вот и получается, что для каждой формы обработки Объект будет новый и ничего не знает про другие объекты.
Поэтому наиболее распространенный способ это передача данных напрямую (или опосредовано) между формами.
Общий механизм такой:
1. Создается объект и при возможности заполняется данными из базы.
2. На основании данных этого объекта создается серверная форма.
3. объект удаляется из памяти.
4. данные серверной формы сериализуются и передаются на клиент.
5. на клиенте происходит создание клиентской формы и заполнение ее при десериализации полученных данных.
При выполнении метода РеквизитФормыВЗначение("Объект") идет обратный процесс и Объект создается новый и заполненный данными полученными с клиента.
Для обработки выбрасываем заполнение данными из базы данных.
Вот и получается, что для каждой формы обработки Объект будет новый и ничего не знает про другие объекты.
Поэтому наиболее распространенный способ это передача данных напрямую (или опосредовано) между формами.
(3) Получается, несмотря на обманчивое присутствие серверной переменной "ЭтотОбъект", никакого экземпляра "текущего объекта" на сервере не хранится, и хранить в нем состояние, как в ООП, нельзя? Дерьмово.
С другими типами, получается, так же? Даже если прикладной объект в базе есть -- верить его реквизитам во вспомогательных формах опасно, т.к. он мог измениться?
Хорошо, что по второму вопросу? Можно ли упростить / привести к стандарту мой приведенный код? В основной форме мне почему-то достаточно установить реквизит у "Объект", чтобы он далее появился у "ЭтотОбъект" в нужном месте, а во вспомогательной форме -- нет.
По сказанному вами, достаточно установить реквизит у "Объект". Но в моем случае при этом в следующем вызове обработчика я и там, и там снова вижу значение по умолчанию.
С другими типами, получается, так же? Даже если прикладной объект в базе есть -- верить его реквизитам во вспомогательных формах опасно, т.к. он мог измениться?
Хорошо, что по второму вопросу? Можно ли упростить / привести к стандарту мой приведенный код? В основной форме мне почему-то достаточно установить реквизит у "Объект", чтобы он далее появился у "ЭтотОбъект" в нужном месте, а во вспомогательной форме -- нет.
По сказанному вами, достаточно установить реквизит у "Объект". Но в моем случае при этом в следующем вызове обработчика я и там, и там снова вижу значение по умолчанию.
(5)
В модуле формы ЭтотОбъект синоним ЭтаФорма.
(5)
Это где такое было сказано?
В модуле формы "Объект" это основной реквизит формы. У кажной формы он свой.
РеквизитФормыВЗначение("Объект") создает новый объект, который заполняется из данных основного реквизита формы "Объект".
Поэтому только передача нужных значений в саму форму. Можно напрямую через форму, можно через параметры, можно через временное хранилище.
Но каждая форма независима от другой в плане основного реквизита формы (соответственно и объект). Считайте, что это два разных объекта. Тут с термином может возникнуть путаница. Объект, который всегда есть на форме, это основной реквизит формы "Объект". Объект обработки это отдельная сущность и она не хранится на сервере (как впрочем и на клиенте).
Получается, несмотря на обманчивое присутствие серверной переменной "ЭтотОбъект", никакого экземпляра "текущего объекта" на сервере не хранится, и хранить в нем состояние, как в ООП, нельзя?
В модуле формы ЭтотОбъект синоним ЭтаФорма.
(5)
По сказанному вами, достаточно установить реквизит у "Объект"
Это где такое было сказано?
В модуле формы "Объект" это основной реквизит формы. У кажной формы он свой.
РеквизитФормыВЗначение("Объект") создает новый объект, который заполняется из данных основного реквизита формы "Объект".
Поэтому только передача нужных значений в саму форму. Можно напрямую через форму, можно через параметры, можно через временное хранилище.
Но каждая форма независима от другой в плане основного реквизита формы (соответственно и объект). Считайте, что это два разных объекта. Тут с термином может возникнуть путаница. Объект, который всегда есть на форме, это основной реквизит формы "Объект". Объект обработки это отдельная сущность и она не хранится на сервере (как впрочем и на клиенте).
(6) В (0) я привел код из процедуры "ПриСозданииНаСервере" вспомогательной формы, где я устанавливаю реквизит и в "Объект" этой (вспомогательной) формы, и в "РеквизитФормыВЗначение("Объект")", иначе не работает (в комментарии описано, что именно).
По рассказанному вами, каждый раз при вызове "РеквизитФормыВЗначение("Объект")" данные передаются из "Объект" в полученный объект типа обработка (для краткости назовем его "ОбъектОбработка").
Согласно этому, в моем коде достаточно установить реквизит у Объект, и во всем дальнейшем коде изменение будет видно и в "Объект", и в "ОбъектОбработка", и, соответственно, в "ЭтотОбъект" в коде модуля объекта.
Но такого не происходит.
По рассказанному вами, каждый раз при вызове "РеквизитФормыВЗначение("Объект")" данные передаются из "Объект" в полученный объект типа обработка (для краткости назовем его "ОбъектОбработка").
Согласно этому, в моем коде достаточно установить реквизит у Объект, и во всем дальнейшем коде изменение будет видно и в "Объект", и в "ОбъектОбработка", и, соответственно, в "ЭтотОбъект" в коде модуля объекта.
Но такого не происходит.
(7)
Да. Будет. Пробуйте:
Только есть такой ньюанс, который я уже не первое сообщение озвучиваю: в "ОбъектОбработка" будет видно в области видимости этой переменной. После Объект, на который ссылается переменная ОбъектОбработка будет уничтожен.
По рассказанному вами, каждый раз при вызове "РеквизитФормыВЗначение("Объект")" данные передаются из "Объект" в полученный объект типа обработка (для краткости назовем его "ОбъектОбработка").
Согласно этому, в моем коде достаточно установить реквизит у Объект, и во всем дальнейшем коде изменение будет видно и в "Объект", и в "ОбъектОбработка", и, соответственно, в "ЭтотОбъект" в коде модуля объекта.
Но такого не происходит.
Согласно этому, в моем коде достаточно установить реквизит у Объект, и во всем дальнейшем коде изменение будет видно и в "Объект", и в "ОбъектОбработка", и, соответственно, в "ЭтотОбъект" в коде модуля объекта.
Но такого не происходит.
Да. Будет. Пробуйте:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Объект.Флаг = Параметры.Флаг;
ОбъектОбработка = РеквизитФормыВЗначение("Объект");
// тут точку остановки и посмотреть значение в ОбъектОбработка.Флаг
КонецПроцедуры
Только есть такой ньюанс, который я уже не первое сообщение озвучиваю: в "ОбъектОбработка" будет видно в области видимости этой переменной. После Объект, на который ссылается переменная ОбъектОбработка будет уничтожен.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот