Обмен данными между серверными процедурами
Здравствуйте.
Как передать данные между серверными процедурами формы? Скажем, по Кнопке1 вызывается одна серверная процедура, формирует какие-то данные, а потом по Кнопке2 мы хотим получить эти данные. Нет ничего проще, правда? - сохранили данные в каких-то реквизитах формы и все ок.
Пусть чуть сложней - данные несериализуемые при передаче с клиента на сервер и обратно. Да тоже фигня, скажете, кое-что можно завернуть в структуру и положить в ВХ.
Если и это не катит, то на помощь возвращаемые значения общих модулей.
И это тоже фигня - короткое время жизни + возможное исполнение в другом рабочем процессе с другим возвращаемым значением. В общем случае не работает.
Есть нетривиальное решение, позволяющее сохранять в промежутке между серверными вызовами формы значения, которые с клиента на сервер и обратно никак передать нельзя,
например, объект основного объекта формы. Один конкретный объект со всеми свойствами, а не его копию через РеквизитФормыВЗначение
Возможно, я изобретаю велосипед и все это давно известно. Если так, то напишите о возможном решении. Если нет, то продолжу чуть дальше.
Как передать данные между серверными процедурами формы? Скажем, по Кнопке1 вызывается одна серверная процедура, формирует какие-то данные, а потом по Кнопке2 мы хотим получить эти данные. Нет ничего проще, правда? - сохранили данные в каких-то реквизитах формы и все ок.
Пусть чуть сложней - данные несериализуемые при передаче с клиента на сервер и обратно. Да тоже фигня, скажете, кое-что можно завернуть в структуру и положить в ВХ.
Если и это не катит, то на помощь возвращаемые значения общих модулей.
И это тоже фигня - короткое время жизни + возможное исполнение в другом рабочем процессе с другим возвращаемым значением. В общем случае не работает.
Есть нетривиальное решение, позволяющее сохранять в промежутке между серверными вызовами формы значения, которые с клиента на сервер и обратно никак передать нельзя,
например, объект основного объекта формы. Один конкретный объект со всеми свойствами, а не его копию через РеквизитФормыВЗначение
Возможно, я изобретаю велосипед и все это давно известно. Если так, то напишите о возможном решении. Если нет, то продолжу чуть дальше.
По теме из базы знаний
- Виртуальный блочный контейнер переменных
- Обмен данными между УПП 1.3.64.х и БП 3.0 по расписанию через Универсальный обмен данными + План обмена
- Обмен большими данными между клиентом и сервером
- Обмен данными между базами 1С посредством передачи сообщений
- Компонента ExchangeStruc (Структура Обмена). Прямой обмен данными между потоками, сессиями и окнами.
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Когда будешь утверждать, что оно универсальное - не забудь, пожалуйста, про кластерную архитектуру 1С, когда следующий серверный вызов приходит на физически другой сервер. Ну и про то, что объект, он еще состоянием обладает - блокировками, выделенным номером/кодом и т.п..
Если нет, то продолжу чуть дальше.
Ну, рассказывай про своё сильно частное решение.
Когда будешь утверждать, что оно универсальное - не забудь, пожалуйста, про кластерную архитектуру 1С, когда следующий серверный вызов приходит на физически другой сервер. Ну и про то, что объект, он еще состоянием обладает - блокировками, выделенным номером/кодом и т.п..
Прикрепленные файлы:
(7)
Ты, в рамках своего "универсального решения" хочешь запретить неконтекстные серверные вызовы, что-ли? Причем не только из модуля формы, а например, вызов общего модуля с флагом "вызов сервера" из клиенского общего модуля, который сам вызвается из формы?
Мигрировать его платформа не умеет.
Что такое "мигрировать форму", если речь идет о серверных вызовах?
Ты, в рамках своего "универсального решения" хочешь запретить неконтекстные серверные вызовы, что-ли? Причем не только из модуля формы, а например, вызов общего модуля с флагом "вызов сервера" из клиенского общего модуля, который сам вызвается из формы?
(9) Вызов серверной процедуры формы всегда происходит в том же рабочем процессе, в котором была создана форма. Не может быть форма в одном рабочем процессе, а код серверной процедуры выполняться в другом - в другом нет контекста формы. А передавать автоматически в подобном случае контекст из одного процесса в другой платформа не умеет. Во всяком случае по моим наблюдениям.
(15) Мы точно об одном и том же говорим? У меня ощущение, что нет. Я говорю, что при выполнении команды формы на клиенте код серверной процедуры формы, вызываемой из клиентской, всегда выполняется в том же рабочем процессе, в котором была создана форма. Если серверная процедура формы вызывает какие-то общие серверные модули, то она туда передает контекст формы в качестве параметра.
(18) Я, собственно, про то, что сама платформа автоматом не может передать контекст формы из одного рабочего процесса (в котором создана форма) в другой - если вдруг сервер решил, что в "родном" процессе серверная процедура формы не может быть вызвана.
Ты, видимо, про что-то другое.
Ты, видимо, про что-то другое.
(10) Конечно нет, об этом и речь. Данные объекта и сам объект как некоторая область памяти в рабочем процессе сервера - это разные вещи. Сам объект не сериализуется. В этом нетрудно убедиться, создав реквизит формы произвольного типа и выполнить Реквизит = РеквизитФормыВЗначение("Объект"). Будет ошибка в духе "отсутствует отображение бла-бла-бла или как-то так". Но тем не менее именно сам объект можно хранить в форме и получать в разных серверных процедурах. Включая его экспортные переменные (которые тоже могут быть несериализуемыми)
(22)
Сравните свои высказывания:
(12)
Путаете понятия.
Объект (СправочникОбъект) не может существовать на клиенте, но сериализуется.
Объект типа ТаблицаЗначений не может существовать на клиенте. К чему говорить об очевидных вещах
Сравните свои высказывания:
(12)
Сам объект не сериализуется. В этом нетрудно убедиться, создав реквизит формы произвольного типа и выполнить Реквизит = РеквизитФормыВЗначение("Объект").
Путаете понятия.
Объект (СправочникОбъект) не может существовать на клиенте, но сериализуется.
(24) СправочникОбъект не сериализуется. Сериализуются данные формы, содержащие реквизиты объекта. СП тут просто врет или просто путает понятия. Объект в памяти сервера со всеми реквизитами и экспортными переменными не может сериализоваться в рамках текущих реализаций платформы..
(34) Я говорю про то, что есть механизм, позволяющий создать в одной серверной процедуре формы, например, СправочникОбъект, присвоить, к примеру, его экспортируемой переменной значение типа COM-соединенение и вернуть управление на клиент. Потом в другой серверной процедуре получить значение типа СправочникОбъект со всеми установленными ранее экспортными переменными (почти любого типа, тип ФормаКлиентскогоПриложения не поддерживается, например). Стандартно это никак не сделать
(23)
В 2 этапа делается:
Когда закончил работу с объектом, то
1) Функцией формируешь структуру с нужными ключами - именами переменных и заполняешь их нужными значениями - теми переменными объекта, которые надо сохранить между вызовами.
Помещаешь структуру во временное хранилище. Адрес структуры хранится в реквизитах формы.
2) СправочникОбъект или ДокументОбъект преобразуешь в реквизит формы - ЗначениеВРеквизитФормы()
Когда надо снова взаимодействовать с объектом:
1) Реквизит формы преобразуем в значение - РеквизитФормыВЗначение()
2) Заполняем экспортные переменные объекта, которые мы сохранили во временном хранилище.
Если надо заполнять/сохранять не экспортные переменные, то нужно предусмотреть у объекта в модуле функции для их получения/установки.
Такое например, в БГУ2 используется.
с его экспортными переменными
В 2 этапа делается:
Когда закончил работу с объектом, то
1) Функцией формируешь структуру с нужными ключами - именами переменных и заполняешь их нужными значениями - теми переменными объекта, которые надо сохранить между вызовами.
Помещаешь структуру во временное хранилище. Адрес структуры хранится в реквизитах формы.
2) СправочникОбъект или ДокументОбъект преобразуешь в реквизит формы - ЗначениеВРеквизитФормы()
Когда надо снова взаимодействовать с объектом:
1) Реквизит формы преобразуем в значение - РеквизитФормыВЗначение()
2) Заполняем экспортные переменные объекта, которые мы сохранили во временном хранилище.
Если надо заполнять/сохранять не экспортные переменные, то нужно предусмотреть у объекта в модуле функции для их получения/установки.
Такое например, в БГУ2 используется.
Думаю. просто нужно признать, что решения, которое удовлетворит автора, платформа 1С дать не может.
Я с подобной задачей столкнулся только когда очень хотелось сохранить временную таблицу между вызовами.
Можно помечтать на тему служебного сеанса фонового задания, которое будет постоянно висеть в системе и как-то перехватывать сообщения из родительского сеанса. Тогда в теории будет единое серверное пространство выполнения, позволяющее что-то "по-честному" хранить между серверными вызовами.
Я с подобной задачей столкнулся только когда очень хотелось сохранить временную таблицу между вызовами.
Можно помечтать на тему служебного сеанса фонового задания, которое будет постоянно висеть в системе и как-то перехватывать сообщения из родительского сеанса. Тогда в теории будет единое серверное пространство выполнения, позволяющее что-то "по-честному" хранить между серверными вызовами.
(33)
У тебя просто один объект будет очень долго жить в одной переменной. Чтобы достучатся к нему из других сеансов (а фоновое задание - это отдельный сеанс) нужна будет сериализация. И начинай все сначала.
в теории будет единое серверное пространство выполнения
Не будет.
У тебя просто один объект будет очень долго жить в одной переменной. Чтобы достучатся к нему из других сеансов (а фоновое задание - это отдельный сеанс) нужна будет сериализация. И начинай все сначала.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот