v8: как передать управление клиенту с сервера? #655440


#0 by Aleksey
Переписываю обработку одну из БП 2.0 на 3.0. Суть обработки создания приходных/расходных документов, застрял на таком моменте как в случае ошибки нужно открыть форму документа интерактивно провести его и вернуться дальше на сервер и продолжить работу Нужны идеи как это сделать.
#1 by shuhard
Суть 3.0 пока свистелки и перделке типа выделить 4 документа мышки и отправить на печать
#2 by MSII
В чем сложность? Серверная функция возвращает ссылку на док, на клиенте получаешь форму документа, открываешь, проводишь, снова запускаешь серверную функцию.
#3 by Wobland
&НаКлиенте
#4 by Web00001
Разбить работу обработки на две части: 1. Формирование списка документов которые будут проведены. 2. Проведение документов. Клиент выполнив первую часть, в цикле начинает Записывать документы, с помощью функции, которая возвращает результат попытки записи. Далее я думаю понятно, открываем модально форму документа, в случае неудачи, ждем ее закрытия, продолжаем работу. Как такой вариант?
#5 by Aleksey
сложность вернутся в то место где нас прервали Там генерируется сразу несколько документов причем результат следующего зависит от того что в ТЧ предыдущего В мое случае список формируется на сервере
#6 by samozvanec
на клиенте получи список с сервера, потом как в
#7 by Aleksey
нет у меня списка. и не может быть потому часть реквизитов заполняется по данным предыдущего документа Т.е. грубо говоря вызываю серверную процедуру Создать; она делает следующие 1. Формирует список товара за день по которым нужно сформировать приход 2. По каждой фирме из списка указанным пользователем ищет остатки товара согласна этого списка, если что то нашли, тогда формируем расход по этой фирме и приход, где в частности в приходе заполняем номер входящего документа из расходной накладной 3. из того, что по какой-то причине не нашли, формируем приход по выбранному контрагенту для разбирательства 4. Перепроводим расходные документы за этот день И так за каждый день И куда тут делить? при условии что нам нужно где то помнить нашу потребность, которая уменьшается на каждом шаге и список фирм которые уже отработали
#8 by Aleksey
Попытался через структуру передать список документов СписокСозданныхДокументов.Вставить(ДокПрих,ДокПрих.Проведен) Был послан далеко {Форма.ФормаУФ.Форма}: Ошибка при вызове метода контекста (ВыполнитьНаСервере)        Результат = ВыполнитьНаСервере(ТекДата); по причине: Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа. по причине: Ошибка преобразования данных XDTO: НачалоСвойства: ret    Форма: Элемент    Тип: { по причине: Ошибка преобразования данных XDTO: НачалоСвойства: pair    Форма: Элемент    Тип: { по причине: Ошибка преобразования данных XDTO: НачалоСвойства: Key    Форма: Элемент    Тип: { по причине: Ошибка преобразования данных XDTO: НачалоСвойства: {    Форма: Элемент    Тип: {
#9 by Aleksey
Так как передать не записанный объект на клиента, чтобы его открыть там?
#10 by kortun
Как то так
#11 by ptiz
"Объект" нельзя передавать.
#12 by mistеr
>сложность вернутся в то место где нас прервали Во время передачи на клиента может умереть как клиент так и сервер. Поэтому все промежуточное состояние перед передачей нужно записывать в базу. На крайний случай в параметры сеанса.
#13 by Aleksey
вот именно а запись в базу может и не быть, и толстом клиенте это спокойно отлавливалось И как мне открыть форму текДок?
#14 by kortun
Продам СП Дорого гуглим в СП ОткрытьФормуМодально или оттуда
#15 by kortun
+ или вот в догонку
#16 by ptiz
Раз нельзя передать объект, значит, надо передать набор данных, по которому ты сможешь заполнить форму нового объекта на клиенте. С УФ не работал, поэтому точнее не скажу :)
#17 by kortun
вот пример из СП
#18 by kortun
так что там ничего сложного
#19 by Aleksey
небыло печали купила баба порося Действительно так получилось как нужно, хотя вроде бы пробовал по разному
#20 by ptiz
А как ты данные незаписанного объекта передал с сервера?
#21 by kortun
а зачем ему данные передавать с сервере? ссылка то осталась, можно же проверить потом после открытия модального и еще раз провести
#22 by ptiz
В том и дело, что нет ссылки! Создается ДокОбъект, не записывается, ссылки нет.
#23 by Aleksey
никак :(
#24 by Aleksey
в оригинале небыло ссылки, пришлось принудительно записывать и молиться что он запишет
#25 by ptiz
Ну так нечестно :)
#26 by Aleksey
Есть варианты?
#27 by ptiz
Я надеялся, что спецы по УФ подтянутся сюда, подскажут как объект превратить в коллекцию данных, которую можно передать с сервера клиенту, и этими данными заполнить открываемую форму нового. Конечно, можно руками (перебором реквизитов и их запихиванием хоть в структуру), но это слишком тупо.
#28 by kortun
непонятно зачем передавать то? можно попробовать Объект = ВыбДокумент.Скопировать; Не знаю насколько это подойдет в вашем случае.
#29 by kortun
к ну а также можно использовать ЗаполнитьЗначенияСвойств(<Приемник>, <Источник>, <СписокСвойств>, <ИсключаяСвойства>) тоже поможет
#30 by Aleksey
Нельзя использовать Источник у нас на сервере и это объект в памяти, это даже не ссылка, так как не записан в базе Приемник - это уже на стороне клиента, т.е. то что мы хотим показать пользователю Вопрос, в какой месте мне нужно выполнить команду чтобы заполнить форму на клиенте, данными которые находятся в памяти на сервере
#31 by kortun
сегодня уже не буду экспериментировать. можно попробовать такой вариант. с сервера сделать возврат Объект.Ссылка а на клиенте
#32 by Aleksey
нету ссылки на сервере, объект в памяти и еще не записан, у него нет ссылки
#33 by НафНаф
это противоречит паттерну клиент-сервер
#34 by Aleksey
Что именно противоречит? Интерактивное проведения документа созданного на сервере?
#35 by samozvanec
а ты запиши. и ваще цикл идет у тебя - запнулся, выходишь из процедуры, правишь документ, заходишь в процедуру и с него же продолжаешь
#36 by Aleksey
А если по какой то причине не могу записать и хочу дать пользователю ручками провести и понять причину
#37 by alexei366
Мужик решение чтоб тебя устраивало наверно одно, но для этого нужен 1С сервер на SQL. Открываешь форму обработки, жмакаешь кнопку "запустить свою х_у_й_н_ю", там ты вызываешь серверную процедуру тама ты запускаешь фоновое задание со своими параметрами + к этому передаешь этому фоновому заданию индентификатор твоего сеанса. Фоновое задание выполняет твой цикл и когда необходимо вмешательство пользователя записывает во врем хранилище необходимую структуру чтоб клиент понял чо от него надо, и соответственно на клиенте, когда запустил фоновое задание, запускаешь обработчик ожидания и в каждый такт смотриш это врем. хранилище на появление данных. Как-то так может быть, но я не пробывал, ток фантазирую (заодно процент выполнения сможешь передавать).
#38 by alexei366
Ах да с временным хранилищем работай через индентификатор сеанса (в СП почитай)*
#39 by ИсчадиеADO
не пробовал. можно ли документ-объект поместить во временное хранилище? Если нет, то можно извратиться, написать унив. процедуры преобразующие данные объекта в структуру, кидать ее в хранилище, а потом заполнять открытый документ уже из этой структуры такой же универс. процедурой :)
#40 by ИсчадиеADO
чорт, уже предложили до меня :(
#41 by ВалераОшкин
> как передать управление клиенту с сервера А никак. Код надо писать па-другому
#42 by Конфигуратор1с
+100500
#43 by Конфигуратор1с
вообще была задача создать документ, заполнить его и  открыть е записывая, стырил с инета код &НаКлиенте
#44 by Конфигуратор1с
как то так.
#45 by Конфигуратор1с
По идее, если я правильно понял Вам нужно как то так 1. На клиенте вызываете серверную процедуру где получаете таблицу необходимых документов. 2. Возвращаете таблицу на клиент, где обходом ее получаете форму документа и передаете данные формы на сервер 3. На сервере заполняете форму и проводите; 4. если не получается провести не проводите) 5. На клиенте полученные данные формы проверяете, если не записан объект, то открываете его модально 6. После проведения пользователем продолжаете цикл
#46 by Aleksey
Угу кучу трафика гонять между клиент и сервером ради того что может быть один раз понадобиться интерактивное проведения. Это и есть новая логика УФ? Ну что же круто
#47 by Конфигуратор1с
где же там куча трафика? тока для тех объектов которые надо записать
#48 by Конфигуратор1с
а новая логика заключается в том, что бы сначала сделать все проверки, найти причины почему не запишется и только потом проводить.
#49 by Aleksey
транзакция к примеру. как я это проверю?
#50 by Aleksey
1. У меня документов я их создаю
#51 by Aleksey
*у меня нет документов
#52 by Конфигуратор1с
ну создаете по какому то принципу. По датам, по фирмам.
#53 by alexei366
Создай док на сервере, выгрузи его в xml через сериализатор, потом как я описывал в передай на клиент эту батву, тама открой форму дока и обратно через сериализатор и значениевреквизитформы. Наверно сработает.
#54 by Aleksey
а хмл то тут причем? пипец чтобы открыть форму на клиенте еще огород и 2000 строк кода городить?
#55 by Kvestin
С сервера на клиент вы можете вернуть структуру с данными заполнения документа. Конечно, чтобы ее сформировать необходимо будет побегать по реквизитам объекта который вы создали через СоздатьДокумент. В этой структуре могут быть только типы данных, которые можно передавать с клиента на сервер (для упрощения, примитивные типы, СписокЗначений, Структура и ссылки (НЕ ОБЪЕКТЫ!)). Далее вы передаете эту структуры  в параметр "ЗначенияЗаполнения" при открытии формы документа. Если все верно сформирована, то платформа сама заполнить поля документа из созданной вами структуры. Список сформированных документов тоже можете передать через список значений с ссылками на эти документы. Извиняюсь, если сумбурно.
#56 by ptiz
"выгрузи его в xml через сериализатор" - можно пример?
#57 by toypaul
теперь ты знаешь чем отличаются программисты на нормальных языках от 1С-ников :) хотя в 1С клиент-серверное взаимодействие реализовано не лучшим способом. особенно удручают ограничения в передаче разных простых объектов (например, ТаблицаЗначений) между сторонами.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С