Имя: Пароль:
1C
1С v8
УФ. Как из клиентской процедуры вызвать серверную функцию?
0 megabax
 
20.09.16
15:03
Добрый день. У меня в УФ есть общий модуль, у него стоят галочки "Клиент", "Сервер", "Вызов сервера". В нем есть клиентская процедура, которая вызывает серверную функцию:
&НаСервере
функция ПолучитьДатуСреза()
    возврат НачалоДня(Константы.шапДатаПоследнегоСреза.Получить());    
конецфункции    

&НаКлиенте
Процедура шапПриНачалеРаботыСистемы() Экспорт
    //сообщить("При начале работы системы");
    если ПолучитьДатуСреза()+7*24*3600>НачалоДня(ТекущаяДата()) тогда
        
    конецесли;
конецпроцедуры

И почему то ругается синтаксический контроль, что  ПолучитьДатуСреза не обнаружена. Подскажите пожалуйста, как лечить? Очень надо из клиентской процедуры вызвать серверную функцию.
1 Nuobu
 
20.09.16
15:05
Экспорт.
2 megabax
 
20.09.16
15:06
(1) НЕ помогло
3 Nuobu
 
20.09.16
15:07
функция ПолучитьДатуСреза() экспорт
4 butterbean
 
20.09.16
15:08
кэш почисти
5 aleks_default
 
20.09.16
15:09
вначале должно идти название общего модуля потом название фуннкции этого модуля
6 megabax
 
20.09.16
15:10
(3) Так и сделал
(4)  Это как?
7 Timon1405
 
20.09.16
15:10
Имямодуля.ПолучитьДатуСреза()
8 aleks_default
 
20.09.16
15:10
через точку
9 megabax
 
20.09.16
15:10
(5) В одном и том же модуле процедура и функция
10 Nuobu
 
20.09.16
15:11
(9) А, вот оно че. Ну, раз в одном и том же, то работать не будут. Разноси по разным модулям.
11 sitex
 
naïve
20.09.16
15:12
(0) что то мне кажется ты для общего модуля дофига галок поставил)
12 jsmith
 
20.09.16
15:13
(11) +1
13 sitex
 
naïve
20.09.16
15:14
(10) +1
14 megabax
 
20.09.16
15:14
(11) Сначала было меньше, думал, мало поставил поэтому не работает, поставил побольше... все равно не работает
15 megabax
 
20.09.16
15:16
(10) Разнес по разным модулям, теперь говорит:
{ОбщийМодуль.шапСобытияКлиент.Модуль(3)}: Метод объекта не обнаружен (шапПриНачалеРаботыСистемы)
    шапСобытия.шапПриНачалеРаботыСистемы();
16 jsmith
 
20.09.16
15:17
&НаКлиенте
Процедура Икс1()
    
    ОбщийМодуль1.Икс2();
    
КонецПроцедуры

&НаСервере
Процедура Икс2() Экспорт
КонецПроцедуры
17 jsmith
 
20.09.16
15:17
В данном случае будет скомпилировано два экземпляра этого общего модуля, один на сервере, один на клиенте. Все процедуры и функции, объявленные с директивой компиляции &НаСервере, попадут в серверный экземпляр модуля, соответственно все процедуры и функции, объявленные с директивой компиляции &НаКлиенте, попадут в клиентский экземпляр модуля. Все процедуры и функции, объявленные без директив компиляции попадут и в клиентский, и в серверный экземпляры модуля.
18 gitotuta
 
20.09.16
15:18
в общем модуле никак.
Вообще клиент сервер в общем модуле рекомендуется использовать только для общих процедур для сервера и клиента
19 sitex
 
naïve
20.09.16
15:18
(15) Дели по общим модулям короче. (17) +1
20 jsmith
 
20.09.16
15:19
Ну можно в одном как в (16)
21 megabax
 
20.09.16
15:19
(16) (18) А если надо, тогда как быть? Как мне на клиенте получить значение константы?
22 gitotuta
 
20.09.16
15:20
(21) вызвать серверный модуль
23 gitotuta
 
20.09.16
15:20
Сделай 2 модуля:
шапКлиент и шапСервер
24 gitotuta
 
20.09.16
15:21
и шапВызовСервера еще
25 Nuobu
 
20.09.16
15:21
(21) У тебя есть какой-то модуль:
РасчетКонстант.
Он делается на клиенте, значит должен называться: РасчетКонстантНаКлиенте.
Тебе из него нужно получать данные с сервера, тогда нужно создавать еще один модуль:
РасчетКонстантСервер.
26 megabax
 
20.09.16
15:22
(17) (19) Если я из модуля шапСобытия убираю от процедур шапПриНачалеРаботыСистемы и ПолучитьДатуСреза опять ругается, что нету такой функции
)
(25) Дык я так и делаю. А он ругается, что такая функция не обнаружена.
27 megabax
 
20.09.16
15:23
(26) То есть выдается сообщение как в (15)
28 sitex
 
naïve
20.09.16
15:24
(27)  прочти (25) , + процедуры то сделай экспортные и обращайся к ним с учетом своих названий.
29 DrZombi
 
гуру
20.09.16
15:27
(26) Убери Команды компелятору
30 jsmith
 
20.09.16
15:28
Короче, такая байда будет работать только в режиме толстого клиента.
В тонком клиенте другой расклад. Делай 2 модуля.
31 megabax
 
20.09.16
15:31
(28) Дык так и сделал.
В клеинтсокм модуле:
Процедура шапПриНачалеРаботыСистемы() Экспорт
    шапСобытияСервер.шапПриНачалеРаботыСистемы();
конецпроцедуры


В модуле шапСобытияСервер:
&НаСервере
функция ПолучитьДатуСреза() экспорт
    возврат НачалоДня(Константы.шапДатаПоследнегоСреза.Получить());    
конецфункции    


&НаСервере
Процедура шапПриНачалеРаботыСистемы() Экспорт
    //сообщить("При начале работы системы");
    если ПолучитьДатуСреза()+7*24*3600>НачалоДня(ТекущаяДата()) тогда
        
    конецесли;
конецпроцедуры

не работает
(29) убираю, после этого не проходит синтаксический контроль
32 gitotuta
 
20.09.16
15:32
вызов сервера стоит?
33 megabax
 
20.09.16
15:37
(32) в модуле шапСобытияСервер стоит
34 elCust
 
20.09.16
15:43
(17)  >>> Все процедуры и функции, объявленные без директив компиляции попадут и в клиентский, и в серверный экземпляры модуля.

Хотел поинтересоваться. Откуда в вас такие сведения? Без указания директивы всегда выполнялось на сервере вроде?

P.S
Мне для общего развития.
35 gitotuta
 
20.09.16
15:44
(33) а еще какие галки стоят?
36 megabax
 
20.09.16
15:47
(35) Клиент и Сервер
37 sitex
 
naïve
20.09.16
15:57
(36) Каждый модуль для своих целей в (25) так и описал. Галки также расставь соответственно правильно, для клиентских "Клиент" , которые на сервере выполняются "Сервер".
38 megabax
 
20.09.16
16:05
(37) Дык я уже всяко пробовал. И ставил галки и выключал.
Помогло только когда я из модуля управляемого приложения перенес вызов в модуль сеанса.
Непонятно, почему из ПриНачалеРаботы системы невозможно вызвать процедуру серверного модуля???
39 aleks_default
 
20.09.16
16:18
(38) ты вызов сервера на серверном общем модуле не поставил
40 sitex
 
naïve
20.09.16
16:21
(38) В проц-е ПриНачалеРаботыСистемы  можно вызывать и проц-ы и функции.
41 sitex
 
naïve
20.09.16
16:21
(38) +модуля управляемого приложения
42 aleks_default
 
20.09.16
16:25
(39)+ Или влез в директиву компиляции
#Если Клиент Тогда
43 aleks_default
 
20.09.16
16:28
(42)т.е. инструкции препроцессора
44 Мыш
 
20.09.16
16:50
Если у общего модуля установлено свойство Сервер и еще какое-либо свойство, то это означает, что общий модуль будет доступен одновременно на сервере и в выбранном клиенте. При этом необходимо понимать, что фактически это будет несколько вариантов скомпилированного кода (по числу выбранных клиентов и собственно для сервера).

При этом если метод, расположенный в таком общем модуле, вызывается со стороны клиента, то будет использована клиентская копия общего модуля, а если с сервера – серверная.
Закон Брукера: Даже маленькая практика стоит большой теории.