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

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

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

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


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

...

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


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


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

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


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

...

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


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

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


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

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



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

Даа... туго прийдется, поскольку мне нужно написать управляемый интерфейс для УТП для Украины...
Но если я уберу директиву "&НаСервере" - то лезут ошибки в упр. приложении. Если у модуля стоит что он доступен и на клиенте и на сервере - значит методы в нем могут выполнятся и там и там. Вот только какую из какой нужно вызывать? Не подскажете хорошую литературу, где детально разжевано, что можно из чего запускать в режиме тонкого и ВЕБ-клиента на модулях и в формах?
В Радченко, 1С:Предприятие 8.2 Практическое пособие разработчика - очень мало про общие модули sad.gif
Flexy
В Синтакс-помощнике => Директивы Компиляции, не пробовали смотреть?
logist
Цитата(vbi @ 20.09.11, 14:14) необходимо зарегистрироваться для просмотра ссылки
поскольку мне нужно написать управляемый интерфейс для УТП для Украины...

Утопично smile.gif
vbi
Цитата(Flexy @ 20.09.11, 14:20) необходимо зарегистрироваться для просмотра ссылки
В Синтакс-помощнике => Директивы Компиляции, не пробовали смотреть?

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

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


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


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

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

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

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

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


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

В серверном модуле стоят галки: клиент, сервер, вызов сервера.
logist
Цитата(vbi @ 22.09.11, 10:53) необходимо зарегистрироваться для просмотра ссылки
При вызове процедуры ПроцедураНаКлиенте() получаю ошибку:

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

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

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

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

...

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


...


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


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

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


Кстате, имею дело с тонким/веб клиентом, если это важно...
logist
Уберите "&НаСервереБезКонтекста"

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

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

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

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

p.s. и вернулись к тому что я сразу написал - разнести процедуры по разным модулям...
vbi
ohmy.gif так работает!!! А почему с директивой &НаСервереБезКонтекста и &НаСервере не работает то?

... наверно потому, что происходит вызов сервера (ну когда я из клиентской процедуры вызываю серверную). Даа.. ТонкийКлиент - дкло тонкое. Поставил лишнюю директиво, с которой оно должно в принципе работать тоже и все. Не работает. Теперь разобрался, спасибо за помощь!
logist
Цитата(vbi @ 22.09.11, 11:33) необходимо зарегистрироваться для просмотра ссылки
А почему с директивой &НаСервереБезКонтекста и &НаСервере не работает то?

&НаСервереБезКонтекста - не доступна в общих модулях.
vbi
&НаСервере - тоже не работает
logist
Цитата(vbi @ 22.09.11, 11:45) необходимо зарегистрироваться для просмотра ссылки
&НаСервере - тоже не работает

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

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

Ну в принципе да, нахер задумываться о том, для чего они предназначены, и пофиг на все, "а бы работало"...
vbi
Цитата
Ну в принципе да, нахер задумываться о том, для чего они предназначены, и пофиг на все, "а бы работало"...
- когда сроки поджимают
vbi
Все делаю так:
Вызываю из клиентской функции клиентского модуля серверную функцию серверного модуля. Все проходит хорошо. Но если я ставлю для серверного подуля галку Глобальный - то функция его стает недоступна в клиентском модуле вообще!
logist
Имя глобального модуля перед глобальной функцией убрали?
vbi
да, имя убрал. Функция недоступна и с именем и без.
Если глобальным сделать клиентский модуль, и вызывать из него функцию - то без проблем, а серверную из клиентского не хочет
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.