|
УФ Можно ли в модуле объекта вызвать функцию Вопрос? | ☑ | ||
---|---|---|---|---|
0
Domovoi
08.06.15
✎
09:41
|
Можно ли в модуле объекта вызвать функцию Вопрос? Если нет, то может есть какой-то обходной путь?
|
|||
1
Ligor
08.06.15
✎
09:43
|
МодульОбъекта выполняется на сервере. Кому ты там собрался задавать вопрос?
|
|||
2
Остап Сулейманович
08.06.15
✎
09:43
|
"Можно ли в модуле объекта вызвать функцию Вопрос?" - Йес.
Если не отключен режим использования модальности. "Если нет, то может есть какой-то обходной путь" - Йес. Можно вызвать ПоказатьВопрос. |
|||
3
Остап Сулейманович
08.06.15
✎
09:44
|
(2) Ступил. Все в (1).
|
|||
4
Domovoi
08.06.15
✎
09:47
|
(1)Пользователю.
По старинке я бы прописал #Если Клиент Тогда Вопрос(......) #КонецЕсли и все норм бы было. Как делается в УФ? |
|||
5
kosts
08.06.15
✎
09:52
|
(4) Не задавай вопросы в модулях объектов
|
|||
6
Ligor
08.06.15
✎
09:53
|
(4) А какому пользователю то? На сервере только бездушная машина.
|
|||
7
Domovoi
08.06.15
✎
09:56
|
(5)А как тогда делать?
Процедура я буду вызывать в 10-20 местах, значит в форму ее не закинешь, но так сложилось, что посреди этой процедуры при определенных условиях надо задать вопрос. Где размещать процедуру и как задавать вопрос? |
|||
8
Domovoi
08.06.15
✎
09:57
|
(6)Ну работа в 1с это ж не только все на сервере или все на клиенте, это постоянная смена клиента и сервера.
|
|||
9
Jonny_Khomich
08.06.15
✎
09:58
|
(7) разделить процедуру на 2 части. Первая часть функция, выполнится. Ты на клиенте задашь вопрос и запустишь вторую часть процедуры.
|
|||
10
Domovoi
08.06.15
✎
10:00
|
(9)Учитывая, что свою процедуру я вызываю из другой процедуры, которая в свою очередь на сервере. И все переносить на клиент - это овнокод какой-то получается.
|
|||
11
kosts
08.06.15
✎
10:01
|
На УФ надо сперва все спросить/узнать у пользователя, потом выполнять
|
|||
12
Ligor
08.06.15
✎
10:05
|
(8) В "МодульОбъекта" все выполняется на сервере и ни каких смен клинта и сервера нет.
|
|||
13
WebberNSK
08.06.15
✎
10:06
|
(7) создать набор общих модулей для работы в различных контекстах
|
|||
14
ВРедная
08.06.15
✎
10:07
|
(11) +. Именно так
|
|||
15
Бубка Гоп
08.06.15
✎
10:10
|
(13) +1. В типовых неспроста общие модули наплодили, а ля
"ПодборТоваровКлиент", "ПодборТоваровСервер" и их комбинации. |
|||
16
fisher
08.06.15
✎
10:14
|
(11) +1
Более того, я на обычных формах тоже всегда так делал. Поэтому никаких проблем с "по старинке" у меня не возникало. Втыкать вопросы в процессе выполнения, когда ошибочный ответ на любой из них - "наша песня хороша, начинай с начала" или потом руками менять, это мягко говоря ненормально. |
|||
17
Domovoi
08.06.15
✎
11:01
|
А где писать код Вопроса, чтоб он выполнился на клиенте? В форме?
|
|||
18
Domovoi
08.06.15
✎
11:04
|
Или в общем модуле процедуру с вопросом писать?
|
|||
19
D3O
08.06.15
✎
11:05
|
(17) в любом модуле, при условии что он выполняется на клиенте. Т.е. модуль формы, модуль команды, общий модуль. ВСЕ.
|
|||
20
D3O
08.06.15
✎
11:06
|
точнее "может выполняться на клиенте" ))
|
|||
21
Остап Сулейманович
08.06.15
✎
11:10
|
(19) Проще всего Вопрос задавать из модуля формы. Проще в том смысле, что обработчик будет скорее всего там же. Если ПоказатьВопрос и его обработчик разнесены по модулям - отладка будет сложнее. Вернее не будет наглядной.
|
|||
22
Domovoi
08.06.15
✎
11:13
|
(21)Чтоб было наглядно надо писать вопрос в процедуре на сервере)
Писать один и тот же вопрос в 20 местах это как-то тоже не гуд. В модуле на клиенте попробую. Но это то еще раздувательство кода, вопрос задается за черт знает сколько шагов до нужного места, т.е. сколько надо протащить ответ вопроса по всем процедурам - ужас. |
|||
23
D3O
08.06.15
✎
11:13
|
(21) ну так ТС же писал, что вопрос примерно из 10 разных мест будет вызываться. В такой ситуации пофиг удобства отладки и лучше делать общий модуль выполнимый на клиенте
|
|||
24
fisher
08.06.15
✎
11:27
|
(22) Если вопрос задается в 20 местах, то напрашивается вынос этого кода в общий клиентский модуль. Если это типовая обработка каких-то элементов данных, то я обычно в два прохода делаю - проверка и выполнение. На форме в таблице отображаю элементы данных требующие интерактива по итогам первого прохода. Пользователь там же указывает требуемые параметры выполнения, которые сохраняются в той же таблице. И финальное выполнение, с учетом всех параметров. Для пользователя очень удобно. Сразу видно, есть ли проблемы или моменты требующие участия. Удобное неспешное редактирование параметров в табличной форме. Если где ошибся - ничего страшного, параметры сохраняются.
|
|||
25
Domovoi
08.06.15
✎
11:36
|
Ситуация у меня такая: пользователь попросил запилить кучу шаблонов и печать их из разных объектов. Я сделал одну процедуру формирования док файла из шаблона с заполнением параметров шаблона. (отдельно процедуры по заполнению параметров шаблона и т.д.). При создании доковского файла, надо сформировать название файла и узнать есть ли такой файл уже или нет и если есть то спросить пользователя хочет ли он перезаполнить договор. Вот теперь надо все перевернуть и вопрос вытащить на начальный этап, а результат запроса пригнать потом в конечную процедуру формирования файла.
|
|||
26
Domovoi
08.06.15
✎
11:37
|
*а результат вопроса
|
|||
27
fisher
08.06.15
✎
11:44
|
Тю. Показываешь форму печати шаблона/шаблонов где отображаются названия выводимых шаблонов, найденные файлы и поле для изменения договора по умолчанию. Пользователь, если хочет, меняет договора на другие и запускает на окончательное формирование, куда передается для какого шаблона какой договор использовать.
|
|||
28
Domovoi
08.06.15
✎
11:47
|
(27)А зачем столько всего? Когда нужно нажать стандартную кнопку печать и может быть потом еще кнопку да/нет(это мой вопрос). Зачем нагружать пользователя? Он же не печатает сразу кучу шаблонов. Печатается один договор, только зависит от условий какой именно.
|
|||
29
Domovoi
08.06.15
✎
12:00
|
Я так думаю надо все мои процедурки перекинуть в общий модуль (клиентсервер) и там все разрулить. (изначально сделал в обработке, чтоб легко между конфами можно было таскать, в частности в модуле обработки)
|
|||
30
fisher
08.06.15
✎
12:00
|
(28) Это для кучи шаблонов был вариант или когда еще другие условия учесть надо. В твоем примитивном случае - да, появляется как бы усложнение, которого не было, когда весь код в одном месте исполнялся. Нужно при необходимости вернутся на клиента, задать вопрос и повторно выполнить алгоритм с передачей уточняющего параметра. Ну а куда деваться?
УФ - это клиент-серверное программирование со всеми вытекающими. Постоянно нужно держать эту модель в голове. Вот твой клиент рядом с ногой стоит, вот клиент-серверный вызов на другой конец земного шара, вот исполнение на секретном сервере в Антарктике. И нет никакой разницы, если на самом деле это не так. |
|||
31
fisher
08.06.15
✎
12:05
|
(29) Наверное, придется. В плане удобства без разницы - таскать между конфами встроенную обработку или общий модуль.
Вернее, через модуль даже удобнее и лаконичнее. Это в 7.7 приходилось через обработки изгаляться, чтобы как-то структурировать. |
|||
32
DexterMorgan
08.06.15
✎
12:08
|
(1), (6) Это все так, вот только если на сервере - бездушная машина, как работает СообщитьПользователю() в модуле объекта?
|
|||
33
KrabCore
08.06.15
✎
12:18
|
(32) работает - не трогай (c)
|
|||
34
Timon1405
08.06.15
✎
12:21
|
(32) Копит сообщения и выводит при возврате управления на клиента. см. ПолучитьСообщенияПользователю (GetUserMessages)
|
|||
35
fisher
08.06.15
✎
12:25
|
(32) С фоновым заданием еще смешнее. Бездушная машина их сама себе нашептывает и никому не говорит. Но при желании можно подсмотреть (через это прогресс-бар в БСП реализован).
|
|||
36
fisher
08.06.15
✎
12:30
|
(32) А так, в (34) всё верно. Пока серверный алгоритм не закончит работу, на клиенте никаких сообщений не появится. Они потом все скопом упадут (после возврата управления на клиент вычитывается буфер сообщений). Штатно никакого асинхронного взаимодействия нет. О нем надо самому заботиться, если надо.
|
|||
37
Domovoi
08.06.15
✎
12:53
|
Перекинул свою процедурки в общий модуль, стал там делить на процедуры на клиенте и на сервере. Возникла проблема: в процедурах "на клиенте" не хотят вызываться процедуры "на сервере" ошибка выдается. Можно ли как то сделать, чтобы процедуры на сервере вызывались из процедур на клиенте?
|
|||
38
DexterMorgan
08.06.15
✎
13:00
|
(36) да понятно, просто удобная фича, я вот хочу тоже сложить в буфер данные какие нить во время проведения, не строкой, а на клиенте потом обработать, как вот замутить без геморра?
|
|||
39
DexterMorgan
08.06.15
✎
13:01
|
(37) галка вызов сервера у модуля стоит?
|
|||
40
Domovoi
08.06.15
✎
13:04
|
(39)Стоит
|
|||
41
DexterMorgan
08.06.15
✎
13:05
|
(40) Гонишь)
|
|||
42
Domovoi
08.06.15
✎
13:07
|
(40)На серверные процедуры которые не вызываются на клиенте не ругается.
|
|||
43
Domovoi
08.06.15
✎
13:09
|
Вот текст ошибки "Процедура или функция с указанным именем не определена"
|
|||
44
Lucky-1
08.06.15
✎
13:09
|
(0) Нельзя:
... Доступность: Тонкий клиент, веб-клиент, толстый клиент, мобильное приложение(клиент). ... |
|||
45
Domovoi
08.06.15
✎
13:11
|
+(43)Пример кода:
&НаКлиенте Процедура СформироватьПараметрыШапки(Основание,ВидШаблона,ПараметрыШапки) Если ВидШаблона = ПроверитьВидШаблона("ДоговорКомиссии2015") Тогда ........ КонецЕсли; КонецПроцедуры &НаСервере Функция ПроверитьВидШаблона(ВидШаблона,НаименованиеПараметраПечатиШаблонов) Если ВидШаблона = Справочники.ПараметрыПечатиШаблонов[НаименованиеПараметраПечатиШаблонов] Тогда Возврат Истина; Иначе Возврат Ложь; КонецЕсли; КонецФункции |
|||
46
Timon1405
08.06.15
✎
13:27
|
(45) Экспорт
|
|||
47
Asmody
08.06.15
✎
13:27
|
(45) Такую проверку можно реализовать на клиенте с помощью ПредопределенноеЗначение()
|
|||
48
Domovoi
08.06.15
✎
13:31
|
(46)Процедуры в одном модуле (но попробовал - не помогло)
(47)В справочнике итак предопределенные значения. Из-за того что Справочники. можно использовать только на сервере, пришлось заводить процедуру проверки на сервере. Или все-таки как-то можно ан клиенте это организовать? |
|||
49
Asmody
08.06.15
✎
13:34
|
(48) Вбей в СП
|
|||
50
Domovoi
08.06.15
✎
13:39
|
ОбъектМетаданныхКонфигурация (ConfigurationMetadataObject)
Справочники (Catalogs) Использование: Только чтение. Описание: Тип: КоллекцияОбъектовМетаданных. Коллекция объектов метаданных, которые описывают все справочники, определенные в конфигурации. Элементами коллекции являются объекты типа ОбъектМетаданных: Справочник. Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер). |
|||
51
Ligor
08.06.15
✎
13:40
|
ПредопределенноеЗначение(<ИмяПредопределенногоЗначения>)
Параметры: <ИмяПредопределенногоЗначения> (обязательный) Тип: Строка. Содержит полный путь до предопределенного значения, включая имя самого значения. Например, "ПланСчетов.Основной.Счет41". ... Возвращаемое значение: Тип: Ссылка на объект информационной базы. Описание: Возвращает ссылку на предопределенный элемент из предопределенных данных, прикладных перечислений и точек маршрута бизнес-процессов, а также значения системных перечислений. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер). |
|||
52
Domovoi
08.06.15
✎
14:32
|
Ага понял. С этим справился. Но есть процедура, которая все равно выполняется на сервере и вызывается из процедуры которая выполняется на клиенте. Что делать?
|
|||
53
Domovoi
08.06.15
✎
14:40
|
Нашел, надо писать
#Если Сервер Тогда сервернаяпроцедура #КонецЕсли |
|||
54
DexterMorgan
08.06.15
✎
14:42
|
(53) зачем ты все в одном модуле куяришь?
|
|||
55
DexterMorgan
08.06.15
✎
14:42
|
фу
|
|||
56
Domovoi
08.06.15
✎
14:45
|
(54)А в скольки же это делать?
|
|||
57
WebberNSK
08.06.15
✎
14:54
|
(56) предлагаю сначала изучить в теории как нужно писать код в клиент-серверной архитектуре, потом посмотреть типовые конфигурации -УП2,УТ11,УНФ (там есть ответы на все вопросы)...
тогда подобных вопросов не будет, в принципе |
|||
58
ЧеловекДуши
08.06.15
✎
15:00
|
(0) Зачем нужен вопрос, когда Сервер его не поймет? :)
|
|||
59
Domovoi
08.06.15
✎
15:01
|
(58)Человек его поймет.
|
|||
60
Domovoi
08.06.15
✎
15:06
|
(57)Это верный путь, но он на несколько месяцев, а задание уже сейчас, и надо сделать так чтоб было все хорошо.
Тэкс в итоге получилась полная фигня: код серверный выполняется код, код на клиенте, тупо пропускается. Надо еще искать методику. 3 вшивые процедуры, которые надо выполнить на сервере, но в одной из них вклинить вопрос для клиента, целый день крутишь вертишь, чтоб как-то что-то заработало и код раздувается в несколько раз... - мать его прогресс. |
|||
61
Fish
08.06.15
✎
15:08
|
(60) Тогда не используй клиент-серверную архитектуру, пока не поймёшь, как с ней работать.
|
|||
62
Domovoi
08.06.15
✎
15:08
|
(61)А как ее обойти?
|
|||
63
Fish
08.06.15
✎
15:10
|
(62) Толстый клиент, обычные формы, и нет проблем.
|
|||
64
Domovoi
08.06.15
✎
15:12
|
(63)А как в управляемом приложении, переключится на выполнение кода под толстым клиентом и потом назад под управляемое приложение?
|
|||
65
Ligor
08.06.15
✎
15:13
|
(63) Вроде можно и упр формы + толстый клиент + условие(а может и не нужно оно точно не помню)
Условие: #Если Клинет Тогда вопрос(...); #КонецЕсли |
|||
66
Ligor
08.06.15
✎
15:13
|
(64) Надо запускать толстый клиент, переключаться нельзя.
|
|||
67
Бубка Гоп
08.06.15
✎
15:15
|
(60) какие месяцы, все проще чем ты думаешь. Вот например
http://catalog.mista.ru/public/86838/ |
|||
68
Domovoi
08.06.15
✎
15:17
|
(66)Так не пойдет. У меня управляемое приложение.
|
|||
69
Fish
08.06.15
✎
15:18
|
(68) Ну тогда тебе остаётся только (57).
|
|||
70
Fish
08.06.15
✎
15:18
|
+(69) Или уволиться.
|
|||
71
Domovoi
08.06.15
✎
15:23
|
(65)Пробовал, просто пропускается код. Вообще не понятно зачем "#Если Клинет Тогда", если код тупо пропускается. В толстом клиенте все было понятно: В модуле выполняется процедура на сервере, но если вставляешь условие клиента, то для клиента выполнится код в теле условия. Тут не понятно какая логика.
(67)Читал, не помогло. (70)Кто ж спасет Блр?) |
|||
72
Бубка Гоп
08.06.15
✎
15:25
|
(71) Может я что то не понимаю, но в клиент-серверной архитектуре код "#Если Клиент Тогда..." вообще не имеет смысла
|
|||
73
VikingKosmo
08.06.15
✎
15:30
|
(72) почему не имеет?
|
|||
74
Бубка Гоп
08.06.15
✎
15:34
|
(73) потому что распределение исполнения кода регулируется директивами и свойствами модулей
|
|||
75
Одинесю
08.06.15
✎
15:34
|
(74) Они равнозначны.
|
|||
76
VikingKosmo
08.06.15
✎
15:35
|
(74) а если модуль КлиентСервер?
|
|||
77
vicof
08.06.15
✎
15:39
|
А хотя бы одну книжку по УФ уже советовали прочитать?
|
|||
78
Бубка Гоп
08.06.15
✎
15:41
|
(76) в таких модулях обычно используются процедуры, которые отработают и на клиенте и на сервере без ошибок.
|
|||
79
VikingKosmo
08.06.15
✎
15:46
|
(78) пример из БСП:
Функция АвторизованныйПользователь() Экспорт #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда УстановитьПривилегированныйРежим(Истина); Возврат ?(ЗначениеЗаполнено(ПараметрыСеанса.ТекущийПользователь), ПараметрыСеанса.ТекущийПользователь, ПараметрыСеанса.ТекущийВнешнийПользователь); #Иначе Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске().АвторизованныйПользователь; #КонецЕсли |
|||
80
VikingKosmo
08.06.15
✎
15:47
|
(78) директивы Клиент, Сервер и пр. вообще не только для того, что бы код без ошибок отрабатывал...
|
|||
81
Бубка Гоп
08.06.15
✎
15:48
|
(80) спасибо, в курсе
|
|||
82
Бубка Гоп
08.06.15
✎
15:49
|
(80) с таким успехом можно все модули сделать КлиентСервер и использовать мега конструкции, как в (79). Но смысл архитектуры теряется
|
|||
83
VikingKosmo
08.06.15
✎
15:53
|
(82) Т.е. ты считаешь, что возможность создавать КлиентСерверный модуль это ошибка?
|
|||
84
Бубка Гоп
08.06.15
✎
15:54
|
(83) Нет, не считаю
|
|||
85
fisher
08.06.15
✎
15:59
|
(71) В толстом клиенте был только один способ выполнить код именно на сервере - обратиться к процедуре общего модуля, который компилируется только на сервере и нигде больше. Во всех других случаях модуль компилировался на клиенте тоже и исполнялся тоже там. Ну, фоновые задания еще. Т.е. в типовом приложении 99,9% исполнялось на клиенте.
Директивы компиляции работают абсолютно одинаково в обычном приложении и управляемом. Если модуль компилируется одновременно в нескольких ипостасях, то конструкции вида #Если позволяют модифицировать эти самые ипостаси. Всего лишь. На выбор ипостаси это не влияет НИКАК. Т.е. если у тебя стоит #Если Клиент, а исполняется серверная версия модуля (потому что вызов пришел с сервера), то этого куска там просто не будет. |
|||
86
Domovoi
08.06.15
✎
16:40
|
От сервера к клиенту перейти нельзя? Если я допустим запустил процедуру выполняемую на сервере, то я уже не могу перейти в процедуру выполняемую на клиенте?
|
|||
87
VikingKosmo
08.06.15
✎
16:41
|
(86) нет
|
|||
88
Domovoi
08.06.15
✎
16:53
|
Всем спасибо. Завтра продолжу изучение 1с УФ :)
|
|||
89
fisher
08.06.15
✎
16:57
|
(86) Нет. Если нужна асинхронность, то можно запустить серверный алгоритм фоновым заданием. Тогда управление останется на клиенте. В противном случае клиент ждет, пока закончит выполняться серверный алгоритм. Либо можно разбивать серверную обработку на порции/этапы, с возвратом управления на клиента.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |