Версия для печати темы (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 Практическое пособие разработчика - очень мало про общие модули
Автор: Flexy 20.09.11, 13:20
В Синтакс-помощнике => Директивы Компиляции, не пробовали смотреть?
Автор: logist 20.09.11, 13:41
Цитата(vbi @ 20.09.11, 14:14)
поскольку мне нужно написать управляемый интерфейс для УТП для Украины...
Утопично
Автор: 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
так работает!!! А почему с директивой &НаСервереБезКонтекста и &НаСервере не работает то?
... наверно потому, что происходит вызов сервера (ну когда я из клиентской процедуры вызываю серверную). Даа.. ТонкийКлиент - дкло тонкое. Поставил лишнюю директиво, с которой оно должно в принципе работать тоже и все. Не работает. Теперь разобрался, спасибо за помощь!
Автор: 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)
&НаСервере - тоже не работает
Потому что в свойствах "Вызов сервера", если убрать то должно работать
Автор: logist 22.09.11, 11:14
Цитата(vbi @ 22.09.11, 11:59)
Вобщем я разобрался
можно не разделять модули на клиентский и серверный. Создать один модуль, поставить там галочки клиент, сервер, вызов сервера... аа.. что мне жалко что-ли - поставить все галочки, которые там есть.
Ну в принципе да, нахер задумываться о том, для чего они предназначены, и пофиг на все, "а бы работало"...
Автор: 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