Обмен данными между серверными процедурами

1. user1035267 12.09.24 05:34 Сейчас в теме
Здравствуйте.

Как передать данные между серверными процедурами формы? Скажем, по Кнопке1 вызывается одна серверная процедура, формирует какие-то данные, а потом по Кнопке2 мы хотим получить эти данные. Нет ничего проще, правда? - сохранили данные в каких-то реквизитах формы и все ок.

Пусть чуть сложней - данные несериализуемые при передаче с клиента на сервер и обратно. Да тоже фигня, скажете, кое-что можно завернуть в структуру и положить в ВХ.

Если и это не катит, то на помощь возвращаемые значения общих модулей.

И это тоже фигня - короткое время жизни + возможное исполнение в другом рабочем процессе с другим возвращаемым значением. В общем случае не работает.

Есть нетривиальное решение, позволяющее сохранять в промежутке между серверными вызовами формы значения, которые с клиента на сервер и обратно никак передать нельзя,

например, объект основного объекта формы. Один конкретный объект со всеми свойствами, а не его копию через РеквизитФормыВЗначение
Возможно, я изобретаю велосипед и все это давно известно. Если так, то напишите о возможном решении. Если нет, то продолжу чуть дальше.
По теме из базы знаний
Найденные решения
28. spacecraft 12.09.24 12:47 Сейчас в теме
(26) попробуйте выгрузить СправочникОбъект в json или в xml. Можно выгрузить.
Сериализация это более расширенное понятие.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. user1936660 12.09.24 09:46 Сейчас в теме
(1)
Если нет, то продолжу чуть дальше.
Ну, рассказывай про своё сильно частное решение.

Когда будешь утверждать, что оно универсальное - не забудь, пожалуйста, про кластерную архитектуру 1С, когда следующий серверный вызов приходит на физически другой сервер. Ну и про то, что объект, он еще состоянием обладает - блокировками, выделенным номером/кодом и т.п..
Прикрепленные файлы:
user2033930; +1 Ответить
7. user1035267 12.09.24 10:19 Сейчас в теме
(3) Это не так. Серверный экземпляр формы хранится в рамках одного рабочего процесса. Мигрировать его платформа не умеет.
9. user1936660 12.09.24 10:31 Сейчас в теме
(7)
Мигрировать его платформа не умеет.
Что такое "мигрировать форму", если речь идет о серверных вызовах?

Ты, в рамках своего "универсального решения" хочешь запретить неконтекстные серверные вызовы, что-ли? Причем не только из модуля формы, а например, вызов общего модуля с флагом "вызов сервера" из клиенского общего модуля, который сам вызвается из формы?
14. user1035267 12.09.24 10:51 Сейчас в теме
(9) Вызов серверной процедуры формы всегда происходит в том же рабочем процессе, в котором была создана форма. Не может быть форма в одном рабочем процессе, а код серверной процедуры выполняться в другом - в другом нет контекста формы. А передавать автоматически в подобном случае контекст из одного процесса в другой платформа не умеет. Во всяком случае по моим наблюдениям.
15. user1936660 12.09.24 11:03 Сейчас в теме
(14)
Не может быть форма в одном рабочем процессе, а код серверной процедуры выполняться в другом - в другом нет контекста формы.
Про вызов серверного модуля из клиентского-то расскажи. Какой там контекст какой формы.
16. user1035267 12.09.24 11:12 Сейчас в теме
(15) Мы точно об одном и том же говорим? У меня ощущение, что нет. Я говорю, что при выполнении команды формы на клиенте код серверной процедуры формы, вызываемой из клиентской, всегда выполняется в том же рабочем процессе, в котором была создана форма. Если серверная процедура формы вызывает какие-то общие серверные модули, то она туда передает контекст формы в качестве параметра.
18. user1936660 12.09.24 11:22 Сейчас в теме
(16)
Если серверная процедура формы вызывает какие-то общие серверные модули, то она туда передает контекст формы в качестве параметра
Браво.
19. user1035267 12.09.24 11:40 Сейчас в теме
(18) Я, собственно, про то, что сама платформа автоматом не может передать контекст формы из одного рабочего процесса (в котором создана форма) в другой - если вдруг сервер решил, что в "родном" процессе серверная процедура формы не может быть вызвана.
Ты, видимо, про что-то другое.
4. WasiliyMay 8 12.09.24 09:50 Сейчас в теме
(1) Тут нет никакой проблемы. Создаете реквизит формы(если форма объекта и нужно хранить данные в объекте, то реквизит объекта). По первой кнопке заполняете этот реквизит, по второй кнопке получаете данные из реквизита.
5. SlavaKron 12.09.24 10:00 Сейчас в теме
(1)
объект основного объекта формы
Прикладной объект сериализуется. Можно еще пример?
6. user1035267 12.09.24 10:15 Сейчас в теме
(5) Сериализуются данные формы. Сам объект, полученный через РеквизитФормыВЗначение("Объект"), где Объект, например, элемент справочника - не сериализуется.
8. SlavaKron 12.09.24 10:23 Сейчас в теме
(6)
где Объект, например, элемент справочника - не сериализуется.
Ну вот же (из справки к ДокументОбъект).
Прикрепленные файлы:
10. user1936660 12.09.24 10:32 Сейчас в теме
(8)
Ну вот же
И значения экспортных переменных тоже восстанавливаются, ага-ага.
12. user1035267 12.09.24 10:45 Сейчас в теме
(10) Конечно нет, об этом и речь. Данные объекта и сам объект как некоторая область памяти в рабочем процессе сервера - это разные вещи. Сам объект не сериализуется. В этом нетрудно убедиться, создав реквизит формы произвольного типа и выполнить Реквизит = РеквизитФормыВЗначение("Объект"). Будет ошибка в духе "отсутствует отображение бла-бла-бла или как-то так". Но тем не менее именно сам объект можно хранить в форме и получать в разных серверных процедурах. Включая его экспортные переменные (которые тоже могут быть несериализуемыми)
13. SlavaKron 12.09.24 10:49 Сейчас в теме
(12) Мне кажется, вы путаете возможность сериализации и миграции клиент-сервер. ТаблицаЗначений тоже не сериализуется, по-вашему?
17. user1035267 12.09.24 11:16 Сейчас в теме
(13) ))
Это ровно одно и то же. Передача данных с клиента на сервер и обратно происходит путем сериализации.
ТЗ конечно сериализуется, странный вопрос.
20. spacecraft 12.09.24 12:16 Сейчас в теме
(17) попробуйте вернуть ТЗ на клиент.
То что зеленый это цвет, не означает, что цвет это зеленый.
22. user1035267 12.09.24 12:25 Сейчас в теме
(20) Объект типа ТаблицаЗначений не может существовать на клиенте. К чему говорить об очевидных вещах
24. spacecraft 12.09.24 12:31 Сейчас в теме
(22)
Объект типа ТаблицаЗначений не может существовать на клиенте. К чему говорить об очевидных вещах

Сравните свои высказывания:

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


Путаете понятия.
Объект (СправочникОбъект) не может существовать на клиенте, но сериализуется.
user2033930; +1 Ответить
26. user1035267 12.09.24 12:43 Сейчас в теме
(24) СправочникОбъект не сериализуется. Сериализуются данные формы, содержащие реквизиты объекта. СП тут просто врет или просто путает понятия. Объект в памяти сервера со всеми реквизитами и экспортными переменными не может сериализоваться в рамках текущих реализаций платформы..
28. spacecraft 12.09.24 12:47 Сейчас в теме
(26) попробуйте выгрузить СправочникОбъект в json или в xml. Можно выгрузить.
Сериализация это более расширенное понятие.
30. user1035267 12.09.24 12:50 Сейчас в теме
(28) Ок. Давай я в экспортную переменную объекта справочника засуну COM-соединение. Что будет в джейсоне? )) Там даже самой переменной не будет
32. spacecraft 12.09.24 12:55 Сейчас в теме
(30) разве для COMОбъект в СП указано, что он может сериализоваться?
34. user1035267 12.09.24 13:03 Сейчас в теме
(32) Тут дело не в COM. А в том, что сериализуются в данном случае реквизиты объекта. Не сам объект целиком. Экспортные переменные мимо. Неважно, сериализуемые они или нет
35. user1035267 12.09.24 13:08 Сейчас в теме
(34) Я говорю про то, что есть механизм, позволяющий создать в одной серверной процедуре формы, например, СправочникОбъект, присвоить, к примеру, его экспортируемой переменной значение типа COM-соединенение и вернуть управление на клиент. Потом в другой серверной процедуре получить значение типа СправочникОбъект со всеми установленными ранее экспортными переменными (почти любого типа, тип ФормаКлиентскогоПриложения не поддерживается, например). Стандартно это никак не сделать
36. user1035267 12.09.24 13:10 Сейчас в теме
(35) Это существенная разница. В случае РеквизитФормыВЗначение("Объект") мы работаем с разными экземплярами объекта. В моем решении экземпляр один
21. spacecraft 12.09.24 12:18 Сейчас в теме
(12)
Но тем не менее именно сам объект можно хранить в форме и получать в разных серверных процедурах.

И это используется в некоторых типовых. В ERP точно это есть.
23. user1035267 12.09.24 12:30 Сейчас в теме
(21) Конкретный экземпляр объекта, с его экспортными переменными и пр.? Любопытно. Ткни носом в код ERP, плиз, если будет возможность.
Просто, быть может, речь о разных вещах. РекизитФормыВЗначение("Объект") каждый раз - это разные объекты (КО).
25. Sashares 35 12.09.24 12:42 Сейчас в теме
(23)
с его экспортными переменными

В 2 этапа делается:
Когда закончил работу с объектом, то
1) Функцией формируешь структуру с нужными ключами - именами переменных и заполняешь их нужными значениями - теми переменными объекта, которые надо сохранить между вызовами.
Помещаешь структуру во временное хранилище. Адрес структуры хранится в реквизитах формы.
2) СправочникОбъект или ДокументОбъект преобразуешь в реквизит формы - ЗначениеВРеквизитФормы()
Когда надо снова взаимодействовать с объектом:
1) Реквизит формы преобразуем в значение - РеквизитФормыВЗначение()
2) Заполняем экспортные переменные объекта, которые мы сохранили во временном хранилище.

Если надо заполнять/сохранять не экспортные переменные, то нужно предусмотреть у объекта в модуле функции для их получения/установки.

Такое например, в БГУ2 используется.
29. user1035267 12.09.24 12:47 Сейчас в теме
(25) Речь о функциональности платформы, а мне тут про функциональность прикладного решения.
Понятно, что (почти) все нужное из любого объекта можно тем или иным способом передать.
31. Sashares 35 12.09.24 12:53 Сейчас в теме
(29) Я описал способ, как можно сохранить доп. данные объекта между серверными вызовами.
Вам шашечки или ехать?
27. spacecraft 12.09.24 12:44 Сейчас в теме
(23) вот для примера
Прикрепленные файлы:
38. user1035267 12.09.24 13:22 Сейчас в теме
(27) О господи. Реально по стрелочке это ДанныеФормыСтруктураСКоллекцией
39. user1035267 12.09.24 13:28 Сейчас в теме
(38) Или ДанныеФормыСтруктура
41. spacecraft 12.09.24 13:43 Сейчас в теме
(39) да, это ДанныеФормыСтруктура, которая через сериализацию может обмениваться со СправочникОбъект. Кстати, вот наглядный пример, что СправочникОбъект поддерживает сериализацию.
11. user1936660 12.09.24 10:33 Сейчас в теме
(6)
Сериализуются данные формы
Не так.

Сериализуются значения реквизитов объектов. Полученный результат может быть записан в данные формы, хмл, джсон и прочие фастинфосеты. Внутренее состояние объекта не сериализуется.
2. Oldsad 12.09.24 09:08 Сейчас в теме
забыл про самый очевидный метод
ты работаешь в базе данных
если тебе надо сохранить данные - сохрани в БД
33. SlavaKron 12.09.24 12:58 Сейчас в теме
Думаю. просто нужно признать, что решения, которое удовлетворит автора, платформа 1С дать не может.
Я с подобной задачей столкнулся только когда очень хотелось сохранить временную таблицу между вызовами.
Можно помечтать на тему служебного сеанса фонового задания, которое будет постоянно висеть в системе и как-то перехватывать сообщения из родительского сеанса. Тогда в теории будет единое серверное пространство выполнения, позволяющее что-то "по-честному" хранить между серверными вызовами.
37. user1936660 12.09.24 13:18 Сейчас в теме
(33)
в теории будет единое серверное пространство выполнения
Не будет.

У тебя просто один объект будет очень долго жить в одной переменной. Чтобы достучатся к нему из других сеансов (а фоновое задание - это отдельный сеанс) нужна будет сериализация. И начинай все сначала.
40. SlavaKron 12.09.24 13:38 Сейчас в теме
(37) А зачем его тащить в другие сеансы? В этой парадигме с объектом работаем только в одном сеансе. Извне получаем только указания и параметры, что с ним делать. Повторюсь, это на уровне фантазии.
43. user1936660 12.09.24 19:13 Сейчас в теме
(40) Да, тут ты прав. Можно сделать программную обвязку и таскать через границу сеанса только сериализуемые типы. А сам объект будет тихо тухнуть в одном из сеансов.
45. user1035267 14.09.24 11:55 Сейчас в теме
(33) Предлагаю описание рабочего решения всего за 50к. )) Если есть сомнения в рабочести решения, то пусть кто-нибудь с инфостарта выступит арбитром. Я не продаю нерабочее гавно, если что
47. user1936660 15.09.24 09:09 Сейчас в теме
(45)
пусть кто-нибудь с инфостарта выступит арбитром
Из поколения ЕГЭ, без понимания базовых вещей?
user2033930; +1 Ответить
42. user1035267 12.09.24 13:57 Сейчас в теме
Мда. Зашел на инфостарт, думая, что здесь тусят реальные профессионалы. Разочарован - стойкое ощущение, что здесь поколение ЕГЭ, без понимания базовых вещей. Больше не буду.
44. user1936660 12.09.24 19:14 Сейчас в теме
(42)
думая, что
Боженьки, мы не увидим очередного Гениального Нетривиального Универсального Решения. Как теперь жить?
46. user1035267 14.09.24 11:55 Сейчас в теме
Не увидите, но купить можете
Оставьте свое сообщение

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