Версия для печати темы (https://pro1c.org.ua/index.php?s=49d6752c7ea07e4e9125565d5e250d04&showtopic=4795)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование управляемых форм 1С 8.2 _ Веб-клиент Вызвать серверную функцию из клиентской во внешнем модуле

Автор: vbi 20.09.11, 11:47

Значит есть 1С 8.2: Веб-клиент (на тонком клиенте то же самое).
Есть общий модуль: Не глобальный, стоят галки: "Клиент управляемое приложение, сервер, вызов сервера"
В этом модуле - всего две функции: Одна на сервере, другая на клиенте. Понятно та что на клиенте вызывает ту что на сервере.

Но вот беда: Клиентская функция не находит серверную.

Содержание внешнего модуля:

&НаКлиенте
Функция ВыполнитьПроверку() Экспорт

    РазницаВремениКлиент =  ВыполнитьПроверкуНаСервере();    
    Если Не РазницаВремениКлиент Тогда
        ЗавершитьРаботуСистемы(Ложь);    
    КонецЕсли;
    Возврат РазницаВремениКлиент;
КонецФункции


&НаСервере
Функция ВыполнитьПроверкуНаСервере()
    Если ...

...

    КонецЕсли;
    Возврат Истина;    
КонецФункции


Когда вызывается метод "ВыполнитьПроверку()" из клиента, выдается ошибка:
Цитата
{ОбщийМодуль.ПроверкаРазницыВремениКлиент.Модуль(10,26)}: Процедура або функція з вказаним ім`ям не визначена (ВыполнитьПроверкуНаСервере)
РазницаВремениКлиент = <<?>>ВыполнитьПроверкуНаСервере(); (Перевірка: Веб-клієнт)


Если делаю вот так:
&НаКлиенте
Функция ВыполнитьПроверку() Экспорт

    РазницаВремениКлиент =  ПроверкаРазницыВремениКлиент.ВыполнитьПроверкуНаСервере();    
    Если Не РазницаВремениКлиент Тогда
        ЗавершитьРаботуСистемы(Ложь);    
    КонецЕсли;
    Возврат РазницаВремениКлиент;
КонецФункции


&НаСервере
Функция ВыполнитьПроверкуНаСервере() Экспорт
    Если ...

...

    Возврат Истина;    
КонецФункции


то проверка модуля ошибок не находит, но при запуске приложения в обычном приложении (кстате для модуля еще стоит галочка клиент (обычное приложение)), то в предприятии выдается та же ошибка :

Цитата
{ОбщийМодуль.ПроверкаРазницыВремениКлиент.Модуль(10)}: Метод об`єкту не виявлено (ВыполнитьПроверкуНаСервере)
РазницаВремениКлиент = ПроверкаРазницыВремениКлиент.ВыполнитьПроверкуНаСервере();


В чем же проблема?

Вот свойства модуля:



Если убираю "&НаСервере" у второй процедуры - все работает в обычном приложении, но тогда в управляемом не работает.

Автор: logist 20.09.11, 12:22

Директивы типа "&НаСервере" в общих модулях не исполняются. Эти директивы уже указаны в свойствах модуля. Выносите код по разным модулям (отдельно клиент и отдельно сервер).

Автор: vbi 20.09.11, 13:14

Цитата(logist @ 20.09.11, 13:22) *
Директивы типа "&НаСервере" в общих модулях не исполняются. Эти директивы уже указаны в свойствах модуля. Выносите код по разным модулям (отдельно клиент и отдельно сервер).

Даа... туго прийдется, поскольку мне нужно написать управляемый интерфейс для УТП для Украины...
Но если я уберу директиву "&НаСервере" - то лезут ошибки в упр. приложении. Если у модуля стоит что он доступен и на клиенте и на сервере - значит методы в нем могут выполнятся и там и там. Вот только какую из какой нужно вызывать? Не подскажете хорошую литературу, где детально разжевано, что можно из чего запускать в режиме тонкого и ВЕБ-клиента на модулях и в формах?
В Радченко, 1С:Предприятие 8.2 Практическое пособие разработчика - очень мало про общие модули sad.gif

Автор: Flexy 20.09.11, 13:20

В Синтакс-помощнике => Директивы Компиляции, не пробовали смотреть?

Автор: logist 20.09.11, 13:41

Цитата(vbi @ 20.09.11, 14:14) *
поскольку мне нужно написать управляемый интерфейс для УТП для Украины...

Утопично smile.gif

Автор: vbi 20.09.11, 13:58

Цитата(Flexy @ 20.09.11, 14:20) *
В Синтакс-помощнике => Директивы Компиляции, не пробовали смотреть?

Смотрел, но про общие модули там ни слова.
Ладно, наверно верну все как было - обеспечу нормальную работу клиент-серверного варианта толстого клиента обычного приложения. А ве необходимые методы в управляемом интерфейсе буду писать в отдельные модули...
И все же... можно ведь установить галки: Клиент(управляемое приложение) и серер одновременно. Но неужели нельзя вызвать из клиентской процедуры серверную в одном и том же модуле?

Автор: logist 20.09.11, 15:24

Цитата(vbi @ 20.09.11, 14:58) *
можно ведь установить галки: Клиент(управляемое приложение) и серер одновременно.

В этом случае выполнение одного кода должно обеспечиваться и там и там.

Автор: vbi 21.09.11, 8:13

Цитата(logist @ 20.09.11, 16:24) *
В этом случае выполнение одного кода должно обеспечиваться и там и там.


Правильно! То есть некоторые методы будут вызыватся на клиенте, а некоторые на сервере. Но тогда в толстом клиенте обычное приложение вызвать серверную функцию из такого модуля, из клиентской функции этого же модуля не получается. Ошибка (смотрите выше).

Автор: kivals 21.09.11, 8:32

Цитата(vbi @ 21.09.11, 9:13) *
Правильно! То есть некоторые методы будут вызыватся на клиенте, а некоторые на сервере. Но тогда в толстом клиенте обычное приложение вызвать серверную функцию из такого модуля, из клиентской функции этого же модуля не получается. Ошибка (смотрите выше).


А никто и не говорил, что так должно работать. Одновременные галки клиент и сервер говорят о том, что функции этого модуля могут вызываться как с клиентской стороны, так и с серверной. А вот правильность работы функций Вы должны обспечить самостоятельно. Как Вам верно порекомендовали - для вашей задачи модуль нужно разбить на 2: клиенткий и серверный (с признаком "вызов сервера") и из клиентского вызывать серверную функцию.

Автор: DartRomanius 21.09.11, 10:18

В связи с тем что в контексте вызовов общего модуля доступ к разным процедурам функциям происходит в зависимости от контекста (клиент, сервер).

То в контексте выполнения клиентской процедуры доступ к серверной напрямую не происходит так как они "лежат" в разных контекстах
как вариант:

&НаКлиенте
Процедура ПроцедураНаКлиенте() Экспорт
    // вызвов серверной
    НаименованиеОбщегоМодуля.ПроцедураНаСервере();
....
КонецПроцедуры

&НаСервере
Процедура ПроцедураНаСервере() Экспорт
.....
КонецПроцедуры

Автор: vbi 22.09.11, 9:53

Я уже не знаю... Сделал как вы сказали:

Цитата
&НаКлиенте
Процедура ПроцедураНаКлиенте() Экспорт
// вызвов серверной
НаименованиеОбщегоМодуля.ПроцедураНаСервере();
....
КонецПроцедуры

&НаСервере
Процедура ПроцедураНаСервере() Экспорт
.....
КонецПроцедуры


При вызове процедуры ПроцедураНаКлиенте() получаю ошибку:
Цитата
{ОбщийМодуль.НаименованиеОбщегоМодуля.Модуль(5)}: Метод об`єкту не виявлено (ПроцедураНаСервере)
Возврат НаименованиеОбщегоМодуля.ПроцедураНаСервере();

В серверном модуле стоят галки: клиент, сервер, вызов сервера.

Автор: logist 22.09.11, 9:57

Цитата(vbi @ 22.09.11, 10:53) *
При вызове процедуры ПроцедураНаКлиенте() получаю ошибку:

Цитата
Возврат НаименованиеОбщегоМодуля.ПроцедураНаСервере();

Процедура не может "Возвращать", в таком случае это должна быть функция.

Автор: vbi 22.09.11, 10:22

Извеняюсь, в моем примере это функции. Привожу свой код полностью

Модуль "уиОбщегоНазначения" (стоит галка сервер, вызов сервера):

...

// Ф ункция возвращает значение экспортных переменных модуля приложений из параметра сеанса
// Необходмо для возможности создания объектов на сервере
&НаСервереБезКонтекста   // Пробовал &НаСервере - то же самое
Функция ПолучитьЗначениеПеременной(ИмяПараметра, Кэш = Неопределено, КэшИзменен = Ложь) Экспорт
    
    Если Кэш = Неопределено Тогда
        // Кэш не был проинициализирован
        Кэш = Новый Структура;
    Иначе

...

    КэшИзменен = Истина;
    
    Возврат НайденноеЗначение;
    
КонецФункции


...


Модуль "уиОбщегоНазначенияКлиент" (стоит галка клиент (управляемая)):
&НаКлиенте
Функция ПолучитьЗначениеПеременной(ИмяПараметра, Кэш = Неопределено, КэшИзменен = Ложь) Экспорт
    Возврат уиОбщегоНазначения.ПолучитьЗначениеПеременной(ИмяПараметра, Кэш, КэшИзменен);    
КонецФункции


При вызове клиентской функции получаю ошибку:

Цитата
{ОбщийМодуль.уиОбщегоНазначенияКлиент.Модуль(5)}: Метод об`єкту не виявлено (ПолучитьЗначениеПеременной)
Возврат уиОбщегоНазначения.ПолучитьЗначениеПеременной(ИмяПараметра, Кэш, КэшИзменен);


Кстате, имею дело с тонким/веб клиентом, если это важно...

Автор: logist 22.09.11, 10:26

Уберите "&НаСервереБезКонтекста"

Цитата
Модуль "уиОбщегоНазначения" (стоит галка сервер, вызов сервера):

В этом модуле и так понятно по свойствам что оно выполняется на сервере, поэтому использовать дериктивы не надо.

Собственно если
Цитата
Модуль "уиОбщегоНазначенияКлиент" (стоит галка клиент (управляемая)):

То процедуры тоже не надо предварять директивами НаКлиенте, т.к. из свойств понятно что они выполняются только на клиенте.

p.s. и вернулись к тому что я сразу написал - разнести процедуры по разным модулям...

Автор: vbi 22.09.11, 10:38

ohmy.gif так работает!!! А почему с директивой &НаСервереБезКонтекста и &НаСервере не работает то?

... наверно потому, что происходит вызов сервера (ну когда я из клиентской процедуры вызываю серверную). Даа.. ТонкийКлиент - дкло тонкое. Поставил лишнюю директиво, с которой оно должно в принципе работать тоже и все. Не работает. Теперь разобрался, спасибо за помощь!

Автор: logist 22.09.11, 10:44

Цитата(vbi @ 22.09.11, 11:33) *
А почему с директивой &НаСервереБезКонтекста и &НаСервере не работает то?

&НаСервереБезКонтекста - не доступна в общих модулях.

Автор: vbi 22.09.11, 10:45

&НаСервере - тоже не работает

Автор: logist 22.09.11, 10:47

Цитата(vbi @ 22.09.11, 11:45) *
&НаСервере - тоже не работает

Потому что в свойствах "Вызов сервера", если убрать то должно работать smile.gif

Автор: vbi 22.09.11, 10:59

Вобщем я разобрался smile.gif можно не разделять модули на клиентский и серверный. Создать один модуль, поставить там галочки клиент, сервер, вызов сервера... аа.. что мне жалко что-ли - поставить все галочки, которые там есть. Единственное - перед всеми процедурами и функциями не нужно писать никаких директив - и все будет прекрастно работать: Вызываеш из клиентской процедуры формы - какуюто процедуру из общего модуля, которая, там, запрос создает и выполняет - и все будет работать! 63000000.gif (по крайней мере у меня так работает smile.gif)

Хотя нет, нужно ставить только "сервер" и "вызов сервера".

Автор: logist 22.09.11, 11:14

Цитата(vbi @ 22.09.11, 11:59) *
Вобщем я разобрался smile.gif можно не разделять модули на клиентский и серверный. Создать один модуль, поставить там галочки клиент, сервер, вызов сервера... аа.. что мне жалко что-ли - поставить все галочки, которые там есть.

Ну в принципе да, нахер задумываться о том, для чего они предназначены, и пофиг на все, "а бы работало"...

Автор: vbi 22.09.11, 11:38

Цитата
Ну в принципе да, нахер задумываться о том, для чего они предназначены, и пофиг на все, "а бы работало"...
- когда сроки поджимают

Автор: vbi 27.09.11, 16:51

Все делаю так:
Вызываю из клиентской функции клиентского модуля серверную функцию серверного модуля. Все проходит хорошо. Но если я ставлю для серверного подуля галку Глобальный - то функция его стает недоступна в клиентском модуле вообще!

Автор: logist 27.09.11, 17:06

Имя глобального модуля перед глобальной функцией убрали?

Автор: vbi 28.09.11, 1:09

да, имя убрал. Функция недоступна и с именем и без.
Если глобальным сделать клиентский модуль, и вызывать из него функцию - то без проблем, а серверную из клиентского не хочет

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua