Имя: Пароль:
1C
 
Получить форму и объектом пользоваться на УФ, да чтоб пользователь видел.
,
0 bolobol
 
27.04.15
11:58
Доброго времени суток!

Подскажите, пожалуйста, по УФ.

Необходимо по имеющейся ссылке открыть форму объекта и ещё и менять реквизиты объекта, отображая изменения в форме. Без УФ - эта задача не представляла сложности, но как с УФ?:

На клиенте имею ссылку.
На сервере получаю объект.
Как же форму объекта полученного открыть?
1 mikecool
 
27.04.15
11:59
открытьформу, смотреть параметры
2 GROOVY
 
27.04.15
12:00
Парам = Новый Стркутура;
Парам.Вставить("Ключ", Ссылка);
ОткрытьФОрму("Документ.Имя.ФОомаОбъекта", Парам);

Все на клиенте.

Еще есть ОткрытьЗначение(Ссылка), но что то не работает.
3 bolobol
 
27.04.15
12:04
Объект-то на сервере, как его на клиент получить?
4 mikecool
 
27.04.15
12:05
(3) открой форму, она будет содержать данные объекта, будь мужиком!
5 GROOVY
 
27.04.15
12:07
(3)  Объект на клиенте не получить, а для открытия формы он нафиг ненужен, нужна ссылка.
6 bolobol
 
27.04.15
12:18
Форма документа РТУ получена. Нужно добавить строку в документ. Строка добавляется тогда, когда пользователь на форме жмёт что-то - откуда обратно получить форму?
7 AntonH851
 
27.04.15
13:41
(6) Есть объект, открываем на клиенте форму, пользователь жмет кнопку на форме, в документ добавляется строка, форма у нас уже открыта, зачем ее опять получать? Пользователь жмет кнопку не на форме документа?
8 bolobol
 
27.04.15
15:21
Пример:
Об1 = Ссылка1.ПолучитьОбъект();
Об2 = Ссылка1.ПолучитьОбъект();
Об1.ТЧ.ДобавитьСтроку();

Итог:
Об1.ТЧ.Количество() <> Об2.ТЧ.Количество()

А всё с одной ссылки!
------
Получил форму, открыл, жду...
пользователь что-то нажал, на открытой форме должна появиться новая строка, которую программно нужно добавить, но объект открытой формы на клиенте мне некуда сохранить, а значит - я его потерял и могу только заново "ОткрытьФорму". Не, ну если это единственный правильный подход...
------
И в открытой форме я только с клиента могу данные править программно? Сбегал за очередным данным на сервер, вернулся, добавил, снова сбегал? Не верю!
9 DrShad
 
27.04.15
15:25
(8) не ну если очень надо, то извратиться можно, но лучше поменять подход - пусть не форма документа открывается, а некий АРМ ввода наладных
10 Garykom
 
гуру
27.04.15
15:29
Прикинь, можно не только открыть форму и реквизиты менять...
но и добавлять/удалять реквизиты у объекта заодно с расположением на форме
11 Defender aka LINN
 
27.04.15
15:29
(0) ПолучитьФорму
12 bolobol
 
27.04.15
15:45
(11) И вам - Здравствуйте! ))

(10) Америка не раскрыта. Мой вопрос только в сохранении объекта, форма которого была открыта.

(9) Подхода нет - есть вопрос. Если решение вопроса ограничено технологически, то, как обычно - ответ: нет возможности, патамушта... - меня устроит.
13 DrShad
 
27.04.15
15:47
(12) возможность есть всегда, но часто она сопряжена со всякого рода извращениями, а по-сему решайте целесообразны ли данные извращения для вас
14 bolobol
 
27.04.15
16:45
(13) Чтобы что-то решить - нужен вариант ответа, коего ещё нет
15 DrShad
 
27.04.15
16:46
(14) чем (9) не устраивает?
16 Defender aka LINN
 
27.04.15
16:47
(14) Ответ тебе уже даден. Лично мной лично в руки.
17 DrShad
 
27.04.15
16:50
(16) а сам пробовал? в контексте сабжа?
18 bolobol
 
27.04.15
16:59
(16) А ты смешной) Как "на сервере" в объект открытой формы добавить строку в ТЧ? "ОткрытьФорму"? ))

(15) В (9) не ответ, там предложение что-то поменять. Вопрос до "поменять" ещё не дошёл. Истина где-то рядом, но ещё не нашюпал(проверочное слово парашют).
19 DrShad
 
27.04.15
17:01
(18) там то как раз ответ и утверждение что будет сопряжено с извращениями
20 Defender aka LINN
 
27.04.15
22:35
(17) Пробовал
(18) Купи у ДенисЧ СП, а я тебе за отдельные деньги буду оттуда цитаты рассказывать. За еще более отдельные - еще и комментировать.
21 Котокот
 
27.04.15
22:51
(8) РеквизитФормыВЗначение("Объект") - получаешь объект документа, делаешь на нем все что хочешь на сервере программно, потом обратно ЗначениеВРеквизитФормы.
22 DrShad
 
27.04.15
23:35
(21) это в пределах одной формы, а когда у человека несколько форм одного объекта одновременно
23 AntonH851
 
28.04.15
04:57
(22) Есил несколько форм открыто у одного пользователя в одном сеансе, то может Оповестить() подойдет?
24 Cyberhawk
 
28.04.15
05:26
Все не читал, но может http://catalog.mista.ru/public/236382/ поможет
25 rphosts
 
28.04.15
06:51
(0) в УФ эта задача не представляет сложности, начинайте курить УФ.
26 Fedor-1971
 
28.04.15
09:12
(8) по ходу происходит следующее:
  Об1 = Ссылка1.ПолучитьОбъект(); - Об1=новый Объект(Ссылка1);
  Об2 = Ссылка1.ПолучитьОбъект(); - Об2=новый Объект(ссылка1);
т.е в памяти создаются два разных объекта, заполненных данными из Ссылка1, потому при добавлении строки в один из них и получается Об1.ТЧ.Количество() <> Об2.ТЧ.Количество(), поскольку ты добавил строку в один из объектов.
  К стати, от вида форм это не зависит.
27 Fedor-1971
 
28.04.15
09:22
26+ Касательно остального:
  Пользователь "что-то нажал" - что? Кнопку - есть обработчик нажатия в нём и делай с формой что тебе нужно. Если пытается добавить строку в ТЧ, опять же события ТЧ ПередДобавлением и делай всё что тебе вздумалось.
  По поводу беготни Клиент-Сервер-Клиент: ты всё равно не сможешь полностью рулить этим процессом, да и собственно незачем. Реализуй логику работы в терминах "Открыта форма нужно сделать в ней вот это", а не в "Я что-то подтянул и хочу оное предложить пользователю для работы под моим контролем" - инструмент один и тот же Форма, но ты пытаешься ею рулить вместо 1С, дай платформе дышать и она тебя отблагодарит, а будешь её сильничать, она тебе ответит Большими глюками.
28 bolobol
 
28.04.15
15:44
По сути вопроса-то есть что сказать?
29 bolobol
 
28.04.15
15:46
(23) Оповестить() - кого и о чём?
(24) Там про открытие формы разного рода. Про работу с объектом открытой формы на сервере - ни слова. А ссылочку-то я себе сохраню))) Спасибо!
30 AntonH851
 
28.04.15
16:12
(29) В форме, которая меняет данные вызываешь функцию Оповестить() а в остальных, которые нужно обновить пишешь обработчик ОбработкаОповещения()
31 Fedor-1971
 
28.04.15
18:11
(28) По сути какого вопроса?
Попробуй понять различие:
1 Объект в БД, т.е., например, документ он живёт только на сервере
2 Объект Формы - какое-то представление Объекта из п.1 в объект под названием ДанныеФормы и он живёт и на сервере и на клиенте, собственно и изменяется в обеих местах как программно так и интерактивно, при записи сохраняется в объект из п.1.
  По началу на УФ это различие вызывало путаницу, вроде открываешь разные формы одного и того же документа и ожидаешь увидеть текущее состояние, а данные в них разные.
В плане прояснения работы УФ есть книга "Разработка управляемого интерфейса", достаточно нормально описаны УФ.
32 bolobol
 
28.04.15
19:02
(31) У меня этот вопрос уже есть. Как раз из-за описанного "различия".
Именно из-за описанного различия, когда доступ к объекту требуется иметь и на клиенте и на сервере, придумали временное хранилище и навигационные ссылки, например. Придумали "ЗначениеВ Реквизит или Данные Формы".
Но куда сохранить открытую форму объекта между сессиями связи с ней из другой формы? И как передать сие на Сервер, как контекст собственной формы передаётся... Чтобы воспользоваться, например: "РеквизитФормыВЗначение("МноюОткрытаяЛеваяФорма.Объект")"
33 bolobol
 
28.04.15
19:03
(30) Не могу в конечном объекте править. Разве что потом вызвать ему что-то типа "МноюОткрытаяЛеваяФорма.ОбновитьДанныеНаФормыИзменённыеСерверомВОбъектеФормы"...
34 Fragster
 
гуру
28.04.15
19:05
вообще вот это "нельзя менять объект данных формы" и костыль СкопироватьДанныеФормы бесит, если честно
35 Fragster
 
гуру
28.04.15
19:11
Если Элементы.ТаблицаСДанными.ТекущаяСтрока <> Неопределено Тогда
        КопироватьДанныеФормы(ЗагрузитьТаблицуРасшифровки(ТаблицаРасшифровки, Элементы.ТаблицаСДанными.ТекущиеДанные.ПараметрДляРасшифровки), ТаблицаРасшифровки);
    КонецЕсли;
36 bolobol
 
28.04.15
19:26
(35) Оп-па... Я такое впервые вижу. Это чтобы... для чего такое?, не пойму.
38 Fragster
 
гуру
28.04.15
19:32
(36) ну короче, получаешь форму, передаешь Форма.Объект в серверную процедуру. получаешь болт ("нельзя менять объект данных формы"). Добавляешь у параметра процедуры Знач. Всё вроде работает, но получаешь болт (сам объект не меняется, хотя при такой же работе, но БЕЗ перехода клиент-сервер по ссылке объект меняется). Тогда ты переделываешь процедуру на функцию, примерно так:

Функция Парам(Знач ДанныеФормыТвоей)
  Объект = ДанныеФормыВЗначение();
  Тут мы меняем Объект
  Возврат ЗначениеВДанныеФормы(Объект);
КонецФункции

И уже результат этой функции запихиваешь с помощью КопироватьДанныеФормы в свою ОткрытаяФорма.Объект ну, или еще куда там тебе надо (в моем случае - в реквизит формы таблицу значений)

Проклинаешь разработчиков УФ за костыли вместо нормального программирования
39 Fragster
 
гуру
28.04.15
19:37
а всё ради неконтекстного вызова. ну, или если контекст - не тот (как в случае с открытой формой) :)
40 DmitrO
 
28.04.15
19:38
(38) тут суть в том что платформу они написали так что на сервере в одном потоке выполнения всегда может быть только одна форма.
41 Fragster
 
гуру
28.04.15
19:40
(40) ну так пусть там будет ДРУГАЯ форма. Почему в &НаСервереБезКонтекста нельзя передать, а потом вернуть реквизит формы - таблицу значений?
42 DmitrO
 
28.04.15
19:41
Т.е. сервер в одном потоке кода может обслуживать контекст только одной формы
Почему так сделано не понятно на самом деле, но это действительно не удобно.
43 Cyberhawk
 
28.04.15
19:42
(38) Я правильно понял, что:
- если на клиенте менять Форма.Объект, то будет профит сразу же и заморачиваться не надо
- если на сервере менять Форма.Объект, переданный туда по значению, то потом после этого на клиенте нужно обновить Форма.Объект через КопироватьДанныеФормы
?
44 Fragster
 
гуру
28.04.15
19:42
(43) что-то типа того
45 Fragster
 
гуру
28.04.15
19:43
(42) почему так, как в (38) надо извращаться, если тебе надо поменять что-то из контекста, но ты не хочешь гнать на сервер весь контекст, а только нужные объекты?
46 Fragster
 
гуру
28.04.15
19:44
(43) еще ты забыл про лучики любви в сторону разработчиков платформы
47 Fragster
 
гуру
28.04.15
19:46
еще, например, бесит то, что у объекта есть обработчик заполнения, но нельзя открыть форму документа с переданным параметром в обработку заполнения. Надо сделать как в (38) и на сервере вызвать "Заполнить(Параметр)". Ну и обработчик заполнения будет вызван два раза - для пустого значения, и уже для нужного.
48 Fragster
 
гуру
28.04.15
19:48
но зато у формы есть параметр "ЗначенияЗаполнения", который по именам заполняет элементы формы...
49 DmitrO
 
28.04.15
19:50
(45) да потому что все объекты типа данные формы это хитроzhoпые объекты которые могут иметь лишь частичную передачу на клиента в данный момент (как заявляется), а в полном составе они живут только на сервере.
50 Fragster
 
гуру
28.04.15
19:50
(48)+ почему было не сделать единообразно? Нужные значения у элементов формы не сложно и руками заполнить, а вот вызвать обработку заполнения с нужным параметром при создании формы - вполне себе полезная функция.
51 Fragster
 
гуру
28.04.15
19:53
(49) не так. контекст формы живет на клиенте, но может содержать не все данные формы. На сервер он приезжает в полном составе в момент контекстного вызова, и уезжает обратно при его завершении.

Состав контекста меняется только на сервере в момент изменения/применения настроек формы, например.
52 Fragster
 
гуру
28.04.15
19:54
из-за этого очень криво реализуются всякие прогресс-бары - надо либо пихать весь контекст, либо изголяться
53 Fragster
 
гуру
28.04.15
19:56
хотя казалось бы - реализовать асинхронную модель на сообщениях с эмуляцией однопоточности через блокирование интерфейса. С сервера всякие "Состояние" и "Сообщить" шли сколько угодно, и сразу отображай на клиенте...
54 Fragster
 
гуру
28.04.15
19:56
а та асинхронность, которая сейчас делается - это ужас же.
55 DmitrO
 
28.04.15
20:38
(54) это да. И какие только умники решили что все всегда в браузере это хорошо. Лишь на том основании что браузер это везде.
56 bolobol
 
29.04.15
15:18
Мысль, кагбэ, уловил, понимаю одно - это надо тестировать-пробовать. А там уже более конкретные вопросы, может, появятся.
Спасибо!