Имя: Пароль:
1C
1С v8
Вызов клиентской функции из модуля объекта
0 grasshoper
 
30.08.21
10:18
Добрый день. Недавно решил научиться работать с управляемыми формами. Подскажи те, как можно вызвать клиентскую функцию из модуля объекта на управляемой форме? Есть обычная форма и управляемая. С обычной все работает, а вот как приделать ту же функцию к управляемой пока понять не могу.

В Модуле объекта:
&НаКлиенте
// Функция ВыбратьПапку() - Возвращает путь к выбранному каталогу
//
// Возвращаемое значение:
//  Строка - Содержит путь к выбранному каталогу
//
// Пример:
//  Функция ВыбратьПапку()
Функция ВыбратьПапку() Экспорт
    ДилогЗагрузкиФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
    ДилогЗагрузкиФайла.МножественныйВыбор = ЛОЖЬ;
    
    Если ДилогЗагрузкиФайла.Выбрать() Тогда
        Возврат ДилогЗагрузкиФайла.Каталог;
    КонецЕсли;
    
    Возврат "";
КонецФункции // ВыбратьПапку()

В модуле управляемой формы:
&НаСервере
// Функция ВыбратьПапку() - Возвращает путь к выбранному каталогу
//
// Возвращаемое значение:
//  Строка - Содержит путь к выбранному каталогу
//
// Пример:
//  Функция ВыбратьПапку()
Функция ВыбратьПапку()
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    Папка             = ОбработкаОбъект.ВыбратьПапку();    
    ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект");
    
    Возврат Папка;
КонецФункции // ВыбратьПапку()
1 ДенисЧ
 
30.08.21
10:18
С сервера ты клиента не вызовешь. Никак.
2 grasshoper
 
30.08.21
10:22
(1) Получилось только на Толстом клиенте управляемого приложения. То есть для тонкого клиента мне все необходимые функции модуля объекта придётся отдельно дублировать для тонкого клиента? Нельзя как-то написать одну функцию в модуле и дергать её для обычного и управляемого приложения?
3 b_ru
 
30.08.21
10:24
В модуле управляемой формы:
&НаСервере
Функция ВыбратьПапку()


Эта функция должна быть НаКлиенте очевидно.
4 ДенисЧ
 
30.08.21
10:25
(2) Надо сразу делать по уму.
Сначала на клиенте всё спросить и выбрать, потом идти на сервер.
5 b_ru
 
30.08.21
10:25
А вообще в УФ такие функции принято в модуле менеджера писать, а не в модуле объекта.
6 ДенисЧ
 
30.08.21
10:25
(2) "Нельзя как-то написать одну функцию в модуле и дергать её для обычного и управляемого приложения?"
В общем случае - нет.
7 ДенисЧ
 
30.08.21
10:25
(5) Какие такие? Опрос пользователя? О_о
8 grasshoper
 
30.08.21
10:27
(3) На клиенте не могу обратиться к модулю объекта
9 Мультук
 
гуру
30.08.21
10:28
(8)

    об = РеквизитФормыВЗначение("Объект");
    пСтр = об.МояФункция();
10 Мультук
 
гуру
30.08.21
10:29
(8)

&НаКлиенте
Процедура Команда1(Команда)
    Команда1НаСервере();
КонецПроцедуры

&НаСервере
Процедура Команда1НаСервере()
    об = РеквизитФормыВЗначение("Объект");
    пСтр = об.МояФункция();
КонецПроцедуры
11 b_ru
 
30.08.21
10:30
(7) В том числе, если они из разных форм вызываются.
12 grasshoper
 
30.08.21
10:31
(10) об.МояФункция() стоит с директивой &НаКлиенте
13 ZDenis
 
30.08.21
10:33
(12) В модуле объекта не нужны директивы, они все на стороне сервера выполняются в УФ
14 grasshoper
 
30.08.21
10:41
(13) а я могу в модуле серверной процедуры прописать кусок, который будет выполняться на клиенте? или всё в модуле объекта выполняется на сервере?
15 grasshoper
 
30.08.21
10:43
(13) Вот такое к примеру извращение:

// Функция ВыбратьПапку() - Возвращает путь к выбранному каталогу
//
// Возвращаемое значение:
//  Строка - Содержит путь к выбранному каталогу
//
// Пример:
//  Функция ВыбратьПапку()
Функция ВыбратьПапку() Экспорт
    #Если Клиент ИЛИ ТонкийКлиент Тогда
        ДилогЗагрузкиФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
        ДилогЗагрузкиФайла.МножественныйВыбор = ЛОЖЬ;
        
        Если ДилогЗагрузкиФайла.Выбрать() Тогда
            Возврат ДилогЗагрузкиФайла.Каталог;
        КонецЕсли;
    #КонецЕсли
    
    Возврат "";
КонецФункции // ВыбратьПапку()
16 ZDenis
 
30.08.21
10:46
(14) Все диалоги выполняются в тонком клиенте исключительно на Клиентской части и их со стороны сервера ты не вызовешь, это тебе еще в (1) ответили. Если надо что-то спросить или выбрать, то делай это в форме, а не в модуле объекта.
17 grasshoper
 
30.08.21
10:53
(16) То есть все клиентские процедуры пихать только в модуль формы? А если у меня одна и та же функция в 10-ти управляемых формах вызывается, 10 раз продублировать в модулях? Вот этот момент не пойму.
18 ZDenis
 
30.08.21
10:55
(17) Да все клиентские процедуры пихаются в формы. Если они одинаковые для многих форм, то можешь вынести ее в общий модуль
19 grasshoper
 
30.08.21
10:56
(18) а если хочу всё как-то хранить в рамках одной обработки?
20 ДенисЧ
 
30.08.21
10:59
(19) Тогда откажись или от УФ, или от ОФ.
Зачем тебе устаревшее дерьмо? (с)
21 grasshoper
 
30.08.21
11:02
(20) Короче опять костыли by 1C
22 ДенисЧ
 
30.08.21
11:02
(21) Да. Всё, что тебе не нравится - костыль, дерьмо и не стоит Твоего Высочайшего Внимания.
23 Василий Алибабаевич
 
30.08.21
11:04
(0) Сам еще не запутался в показаниях?

(17) "одна и та же функция в 10-ти управляемых формах вызывается"
и тут же
(19) "хочу всё как-то хранить в рамках одной обработки?"
24 acht
 
30.08.21
11:07
(23) Судя по всему у Его Величества 100500 форм в одной обработке.
Подождем, пожалуй, темы, где Его Велоколепие начнет задавать вопросы - как же передавать данные объекта между формами?
25 grasshoper
 
30.08.21
11:08
(23) А что тут не понятно то? Есть одна функция которую можно вызывать из любой формы обращаясь к модулю объекта и вызываю её в обычных формах. В управляемых же, из модуля объекта её не вызвать, так как она должна выполняться на клиенте, то бишь нужно её прописать в модуль формы, а если у меня таких форм 10 штук, то скопировать в каждую форму. Что не понятно?
26 grasshoper
 
30.08.21
11:10
(24) Просто пытаюсь узнать у здешних разработчиков, из-за своего незнания работы с управляемыми формами, как сделать 1 процедуру и вызывать её на обычных и управляемых формах не дублируя. 1 функция = много точек вызова.
- и всё?
- и всё.
27 Мультук
 
гуру
30.08.21
11:10
(26)
28 acht
 
30.08.21
11:12
(26) Зачем ты вообще лезешь туда, если уже заранее уверен в том, что это "костыли by 1C"? Ты мазохист, что-ли?
Узнать он пытается...
29 Garykom
 
гуру
30.08.21
11:14
(0) Теоретически можно например через обработчик ожидания и фоновое но это будет изврат
И еще надо временное хранилище или нечто вроде юзать
30 ildary
 
30.08.21
11:15
(26) А зачем Вам вызывать процедуру и на обычных формах и на УФ? К чему такая универсализация, если ОФ и УФ сильно отличаются?
31 Garykom
 
гуру
30.08.21
11:16
(29)+ Короче синхронно не выйдет никак, только асинхронно
Хотя и синхронно можно но это уже ВК на клиенте нужна, которую будет сервер вызывать
32 grasshoper
 
30.08.21
11:16
(28) Ничего дельного от Вас так и не услышал.
33 Мультук
 
гуру
30.08.21
11:16
(26)

{Автор, это ты еще про асинхронность не читал}

P.S.
Можно вот так, но за такие вещи обычно бьют ногой в живот.

//Форма главная
&НаКлиенте
Процедура КомандаПривет(Команда)
    ф = ПолучитьФорму("ВнешняяОбработка.ТестоваяОбработка_ФормаДонор.Форма.ФормаДонор");    
    ф.ПриветМир();
КонецПроцедуры


// Форма "ФормаДонор"

&НаКлиенте
Процедура ПриветМир() Экспорт
    Сообщить("ПриветМир");
КонецПроцедуры
34 grasshoper
 
30.08.21
11:18
(30) а зачем мне одинаковые процедуры писать в обычную форму и писать в управляемую форму?
35 grasshoper
 
30.08.21
11:19
(30) банальное дублирование кода, а потом ещё изменяй её и там и там, если нужно будет
36 acht
 
30.08.21
11:20
(33) > за такие вещи обычно бьют ногой в живот.

А советующего вещи, за которое бъют - чем и куда бить надо? =)
37 ildary
 
30.08.21
11:23
(35) А чем не устроил общий модуль, как Вам советовали в (18)?
38 Василий Алибабаевич
 
30.08.21
11:25
(26) "1 функция = много точек вызова." Также легко как и просто. Передавай в "1 функция" путь к нужному каталогу и не нужно будет тот вопрос задавать на сервере (ГЫ. Сервер может быть в датацентра в Германии. Тогда к кому там будет обращен вопрос?)
39 grasshoper
 
30.08.21
11:26
(37) общий модуль это хорошо, но если это будет внешняя обработка подключаемая к разным конфигурациям?
40 Asmody
 
30.08.21
11:26
(33) Вообще-то, это один из способов вынести общие клиентские методы в отдельный модуль во внешней обработке. Ничего тут критичного нет.
41 Asmody
 
30.08.21
11:28
(39) Писать совсем универсально под ОФ и УФ не выйдет. Разная идеология у них.
42 ildary
 
30.08.21
11:28
(40) не считая того, что ПолучитьФорму() обьявлен нерекомендуемым в применении в текущих версиях.
43 ДенисЧ
 
30.08.21
11:28
(39) "А если он бы вёз патроны?" (с)
44 ildary
 
30.08.21
11:29
(41) Он ждёт волшебную палочку, чтобы вжух и 1С сделала по его хотению.
45 grasshoper
 
30.08.21
11:30
(44) спрашиваю совета
46 Asmody
 
30.08.21
11:32
(42) Я ж говорю - "костыль". Пока 1С сама не упрется в необходимость клиентских модулей во внешних обработках
47 grasshoper
 
30.08.21
11:32
Ну если нужно дублировать для каждой формы, то ради бога, хотелось просто как лучше.
48 Asmody
 
30.08.21
11:34
С другой стороны, сама 1С не пишет универсальную фигню, чтобы и под ОФ, и под УФ.
А для УФ модно делать расширения, а не внешние обработки.
49 ДенисЧ
 
30.08.21
11:37
(48) "для УФ модно делать расширения"
А в Европах можно этосамое мужикам с мужиками... Что нам, каждой моде следовать?
50 1Сергей
 
30.08.21
12:08
(49) Ты европейскую моду с одинесовской не путай :)
51 ildary
 
30.08.21
12:20
(46) скорее будет так: на крупном внедрении Почта/Газпром/Атом - окажется, что это самый подходящий способ для какой-то задачи и тут же волшебным образом вместо костыля появится "рекомендованное решение".
52 DrZombi
 
гуру
30.08.21
12:42
(0) >>> Если ДилогЗагрузкиФайла.Выбрать() Тогда

Забудьте про модальные окна, сегодня все идет через обработчик - ОписаниеОповещения (NotifyDescription)
53 DrZombi
 
гуру
30.08.21
12:43
(34) Это вы начнете делать, в виду жестких временных рамок :)