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