for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Вопросы по 1С
  

&НаКлиенте и &НаСервере
Зингер
Автор

Сообщений: 520
Откуда: Белгород
Дата: 01.04.16 19:46:01
Прошу Вашей помощи.
Начал изучать 1С:Предприятие 8.3 через вэбинары.

Код модуля формы переключателя (optiongroup):
  
  &НаКлиенте  
  Процедура СпособОплатыПриИзменении(Элемент)  
  	элементы.Группа4.Видимость=ПолучитьВидимость(Объект.СпособОплаты);  
  КонецПроцедуры  
    
  &НаСервере  
  Функция ПолучитьВидимость(Способ)  
  	Если Способ=Перечисления.СпособОплаты.Безналичные Тогда  
  		РезультатФункции=Истина;  
  	иначе  
  		РезультатФункции=Ложь;  
  	КонецЕсли;  
  	Возврат РезультатФункции;  
  КонецФункции

Если бы на Fox-e, то код бы выглядел элементарно:
  
  ...container4.visible=iif(...optiongroup1.value=1,.t.,.f.)

Но для модуля из 1С, зачем обращаться к серверу? Как сервер может "знать" что выбрано в переключателе, если еще не нажата "Провести и закрыть"?
Я не совсем понимаю конструкцию &НаКлиенте и &НаСервере. Для "препода" вроде как само собой разумеющееся, а для меня "затык".
Объясните мне пож-та на пальцах что значит &НаКлиенте, &НаСервере и &НаСерверебезконтекста ?
За вопрос прошу сильно не пинать. :al:
Ratings: 0 negative/0 positive

Re: &НаКлиенте и &НаСервере
Foxtrot

Сообщений: 3378
Откуда: Куда:
Дата: 02.04.16 11:49:10
видима потому что объект Перечисления.СпособОплаты.Безналичные не доступен на клиенте, отседа весь этот сырбор


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive

Re: &НаКлиенте и &НаСервере
ssa

Сообщений: 12248
Откуда: Москва
Дата: 02.04.16 12:14:59
Зингер
Прошу Вашей помощи.
Начал изучать 1С:Предприятие 8.3 через вэбинары.

Код модуля формы переключателя (optiongroup):
  
  &НаКлиенте  
  Процедура СпособОплатыПриИзменении(Элемент)  
  	элементы.Группа4.Видимость=ПолучитьВидимость(Объект.СпособОплаты);  
  КонецПроцедуры  
    
  &НаСервере  
  Функция ПолучитьВидимость(Способ)  
  	Если Способ=Перечисления.СпособОплаты.Безналичные Тогда  
  		РезультатФункции=Истина;  
  	иначе  
  		РезультатФункции=Ложь;  
  	КонецЕсли;  
  	Возврат РезультатФункции;  
  КонецФункции

Если бы на Fox-e, то код бы выглядел элементарно:
  
  ...container4.visible=iif(...optiongroup1.value=1,.t.,.f.)
В 1С тоже есть подобная конструкция ( ?(,,) ). Но и твоя тоже далеко не идеал и iif() тут, по большому счету, как собаке пятая нога.
Цитата:
Но для модуля из 1С, зачем обращаться к серверу?
Затем, что на клиенте доступно не все, что есть на сервере. В частности, перечисления. А именно в зависимости от него и производятся нужные действия.
Цитата:
Как сервер может "знать" что выбрано в переключателе, если еще не нажата "Провести и закрыть"?
А ему и не до это знать, к нему не за этим обратились. Не туда смотришь и потому не ловишь суть.
Цитата:
Я не совсем понимаю конструкцию &НаКлиенте и &НаСервере.
И это очень плохо ибо на понимании этого построена работа всго управляемого приложения.
Цитата:
Для "препода" вроде как само собой разумеющееся, а для меня "затык".
Объясните мне пож-та на пальцах что значит &НаКлиенте, &НаСервере и &НаСерверебезконтекста ?
За вопрос прошу сильно не пинать. :al:
Буквально это и значит. Что процедура/функция после такой директивы будет видна и будет исполнятся в указанном месте. Весь исполняемый код разделен на две части: Клиент и Сервер. И это всегда надо держать в голове и все действия выполнять с учетом этого разделения. И фоксовые привычки богоизбранности тут надо забыть.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive

Re: &НаКлиенте и &НаСервере
Зингер
Автор

Сообщений: 520
Откуда: Белгород
Дата: 02.04.16 13:58:45
ssa
И это очень плохо ибо на понимании этого построена работа всего управляемого приложения.
В том то и дело, что я понимаю, что я не понимаю. И интуитивно предчувствую, что этот момент нужно четко уяснить для себя, чтобы не возникало дальнейших проблем.

И прошу, объяснить как так получилось, что для переключения видимости одного элемента на форме, нужно обратиться к функции сервера?
Или понятие "сервер" для 1С другое?

Получается, что выбирая что то на переключателе, который отображается на форме, данные передаются на сервер?
Ratings: 0 negative/0 positive

Re: &НаКлиенте и &НаСервере
ssa

Сообщений: 12248
Откуда: Москва
Дата: 02.04.16 14:26:53
Зингер
ssa
И это очень плохо ибо на понимании этого построена работа всего управляемого приложения.
В том то и дело, что я понимаю, что я не понимаю. И интуитивно предчувствую, что этот момент нужно четко уяснить для себя, чтобы не возникало дальнейших проблем.
Именно! И это очень важно.
Цитата:

И прошу, объяснить как так получилось, что для переключения видимости одного элемента на форме, нужно обратиться к функции сервера?
Еще раз для зацикленных на переключении на форме и в упор не видящих эдемент метаданных под названием ПРЕЧИСЛЕНИЕ - не туда смотришь! Не в видимости, не в форме, не в сервере и не в понимании что есть сервере дело.
Цитата:
Или понятие "сервер" для 1С другое?
Никакое не другое и не надо ему придумывать что-то из того, чего в нем нет.
Цитата:

Получается, что выбирая что то на переключателе, который отображается на форме, данные передаются на сервер?
НЕТ!. Получается, что ты просто не умеешь читать код 1С и ищешь не там, где потерял, а там где светлее.
Ты можешь, наконец, увидеть в коде строку
Если Способ=Перечисления.СпособОплаты.Безналичные Тогда
?
Ты можешь, наконец-то, обратить внимание на Перечисления.СпособОплаты.Безналичные? Ты можешь попытаться понять, что это отнюдь не 1, и не 2, и не 3 и не какое-то иное заранее определенное программистом значение? И потому вместо него нельзя вот просто так поставить ни 1, ни 2, ни .t. и ни что другое? Что значение этого элемента таки надо получить во время выполнения программы ибо оно не известно в момент написания кода? Это так трудно понять?


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive

Re: &НаКлиенте и &НаСервере
Зингер
Автор

Сообщений: 520
Откуда: Белгород
Дата: 02.04.16 14:55:44
М-да. Из всего написанного Вами текста, ценность представляет только предложение
ssa
Что значение этого элемента таки надо получить во время выполнения программы ибо оно не известно в момент написания кода?

Значения элемента Перечисление.СопособОплаты я внес в конфигураторе на закладке Данные. Как значение может быть неизвестно?

Уважаемый, Ssa, я просил не пинать сильно за вопрос и, если Вас раздражает довольно глупый для Вас вопрос, можете просто не отвечать и не ёрничать копируя мои цитаты. Я просил только лишь объяснить см. пост №1, если нет то нет, как-нибудь сам "дойду".
Ratings: 0 negative/0 positive

Re: &НаКлиенте и &НаСервере
Аспид

Сообщений: 3293
Откуда: Москва
Дата: 02.04.16 15:08:00
Попробую как начинающий начинающему)
Как я это понимаю.

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

Но есть данные, которых у клиента нет. Есть например некоторое значение, но коли ты его хочешь изменить, тебе надо получить весь набор данных.
А вот об этом, уже знает только сервер. И потому обращаемся к серверу.

Ну а то что сервер, не знает о клиенте, это и понятно.
Для примера, откуда ХП может знать, кто и зачем ее вызвал)

Вот так примерно мне это видится... Может и не очень точно, но лучше описать свое понимание не могу)

Возможно немного сбивает, что в данном случае Перечисления.СпособОплаты.Безналичные всего 2 значения.
Но при обращении к другим моментам, может быть гораздо больше.


------------------




Исправлено: Аспид, 02.04.16 15:10
Ratings: 0 negative/0 positive

Re: &НаКлиенте и &НаСервере
Зингер
Автор

Сообщений: 520
Откуда: Белгород
Дата: 02.04.16 16:24:28
to Аспид.

Спасибо, доходчиво.
Ratings: 0 negative/0 positive

Re: &НаКлиенте и &НаСервере
ssa

Сообщений: 12248
Откуда: Москва
Дата: 02.04.16 17:01:28
Зингер
М-да. Из всего написанного Вами текста, ценность представляет только предложение
ssa
Что значение этого элемента таки надо получить во время выполнения программы ибо оно не известно в момент написания кода?

Значения элемента Перечисление.СопособОплаты я внес в конфигураторе на закладке Данные.
В виде числа? Перечисление - набор поименованных числовых констант. И значение перечисления таки число, а не название, под которым оно хранится в конфигурации.
Цитата:
Как значение может быть неизвестно?
Оно и известно, Но только серверу. Клиент в конфигурацию лазить не может, он клиент, он работает в отдельном адресном пространстве и может быть вообще на другом компе в другой сети.
Цитата:

Уважаемый, Ssa, я просил не пинать сильно за вопрос и, если Вас раздражает довольно глупый для Вас вопрос, можете просто не отвечать и не ёрничать копируя мои цитаты. Я просил только лишь объяснить см. пост №1, если нет то нет, как-нибудь сам "дойду".
А я что, объясняю какой-то другой пост?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive

Re: &НаКлиенте и &НаСервере
pasha_usue

Сообщений: 3108
Откуда: Е-бург
Дата: 04.04.16 07:15:08
Вообще, есть функция ПредопределенноеЗначение("Перечисления.СпособОплаты.Безналичные"). Но необходимо помнить, что эта функция обращается на сервер, поэтому желательно ее на клиенте кэшировать.

Ну и ваш код на клиенте преобразуется так:
элементы.Группа4.Видимость=(Объект.СпособОплаты=ПредопределенноеЗначение("Перечисления.СпособОплаты.Безналичные"));
Ratings: 0 negative/0 positive

Re: &НаКлиенте и &НаСервере
pasha_usue

Сообщений: 3108
Откуда: Е-бург
Дата: 04.04.16 07:52:35
Зингер
Получается, что выбирая что то на переключателе, который отображается на форме, данные передаются на сервер?
По вашему коду, это не так. Вы на клиенте вызываете функцию сервера с параметром, который доступен на клиенте. На сервере вы сравниваете переданный параметр с доступным на сервере предопределенным значением перечисления, а результат возвращаете на клиента.

НО! При этом, когда вы вызываете вашу серверную функцию, контекст данных формы целиком и полностью отправляется на сервер, а потом возвращается обратно. Все реквизиты, все значения элементов формы. Всё. Об этом эффекте переключения между клиентом и сервером необходимо помнить. И либо использовать директиву "&НаСервереБезКонтекста", либо минимизировать вызовы сервера. Ну, либо пофигу, если производительность устраивает.
Ratings: 0 negative/1 positive

Re: &НаКлиенте и &НаСервере
Зингер
Автор

Сообщений: 520
Откуда: Белгород
Дата: 04.04.16 09:20:09
Спасибо, очень информативно и доходчиво. Начал понимать.
Выходит так, что форма в 1С не обладает своими данными, как в Фоксе, т.е. не имеет своей датасессии.
Преподаватель также пояснял, что клиент может находиться во Владивостоке, а сервер в Москве, этот факт меня смутил (я подумал, передавать данные, которые отвечают за видимость того или иного элемента формы по сети по маршруту Владивосток-Москва глупо). Насколько я понял, когда пишется &НаСервере или &НаСервереБезКонтекста, то речь идет к обращению на так называемый сервер 1С, где находится конфигурация. И лучше, что бы она была на локалке, т.е. без потери скорости передачи данных и без потери самих данных, т.е. "толстый клиент".
Ratings: 0 negative/0 positive

Re: &НаКлиенте и &НаСервере
Foxtrot

Сообщений: 3378
Откуда: Куда:
Дата: 04.04.16 11:21:21
как говорится если очень хочется а нельзя то можно. тогда твой код мона переписать примерно так

&НаКлиенте
Процедура СпособОплатыПриИзменении(Элемент)
Элементы.Группа4.Видимость = ПредопределенноеЗначение("Перечисление.СпособОплаты.Безналичные");
КонецПроцедуры

ps с днем варенья


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive

Re: &НаКлиенте и &НаСервере
Аспид

Сообщений: 3293
Откуда: Москва
Дата: 04.04.16 12:10:55
pasha_usue
НО! При этом, когда вы вызываете вашу серверную функцию, контекст данных формы целиком и полностью отправляется на сервер, а потом возвращается обратно. Все реквизиты, все значения элементов формы. Всё. Об этом эффекте переключения между клиентом и сервером необходимо помнить. И либо использовать директиву "&НаСервереБезКонтекста", либо минимизировать вызовы сервера. Ну, либо пофигу, если производительность устраивает.
Вон оно как оказывается!!!
Спасибо за инфу.
А я то думал, что за зверь такой "&НаСервереБезКонтекста"
А оказывается, очень полезная штука!
Зингер
Выходит так, что форма в 1С не обладает своими данными, как в Фоксе, т.е. не имеет своей датасессии.
Все так же как в фоксе.
Форма имеет те данные, которые ей необходимы. Которые ей предоставили.
И точно так же. Если надо подтянуть какие то доп данные, лезишь на сервер.
Например у тебя накладная, в ней контрагент, договор.
А оказалось договор не тот. За новым ты на сервер и полезешь...

И какая разница программисту где он лежит?
Лучше как раз рассчитывать Владивосток - Москва.
Тогда локально точно быстрее будет)))


------------------
Ratings: 0 negative/0 positive

Re: &НаКлиенте и &НаСервере
pasha_usue

Сообщений: 3108
Откуда: Е-бург
Дата: 04.04.16 14:35:20
Зингер
Спасибо, очень информативно и доходчиво. Начал понимать.
Выходит так, что форма в 1С не обладает своими данными, как в Фоксе, т.е. не имеет своей датасессии.
Преподаватель также пояснял, что клиент может находиться во Владивостоке, а сервер в Москве, этот факт меня смутил (я подумал, передавать данные, которые отвечают за видимость того или иного элемента формы по сети по маршруту Владивосток-Москва глупо). Насколько я понял, когда пишется &НаСервере или &НаСервереБезКонтекста, то речь идет к обращению на так называемый сервер 1С, где находится конфигурация. И лучше, что бы она была на локалке, т.е. без потери скорости передачи данных и без потери самих данных, т.е. "толстый клиент".
Сервер 1С имеет сервисный процесс RPHOST (или несколько). Этот процесс исполняется на сервере. Он же исполняет весь серверный код (общие серверные модули, модули менеджера объекта, модули объекта, модули формы с директивой &НаСервере).

В момент вызова из клиента серверной процедуры, клиент передает контекст с которым он работает на сервер и приостанавливает свою работу. Дальше начинает работать RpHost на сервере. После окончания работы RpHost измененный или неизмененный контекст возвращается на клиента, а клиент возобновляет свою работу.

На клиенте доступные все видимые данные. Только доступны они очень ограниченно, по сути, только ссылка на объект и представление этого объекта. Поэтому, если необходимо обратиться к реквизиту договора, например, необходимо либо вызвать сервер, либо специально заранее этот реквизит притащить на клиента.

Еще надо понимать, что клиенты могут быть разными. Это может быть андроид-клиент, или веб-клиент. И если у веб-клиента есть прослойка в виде вебсервера, то андроид тянет данные так же как и десктопный клиент.

Кстати, при работе с файлами люди очень часто забывают, что сейчас работает RpHost, который расположен на сервере. И он ни о каком вашем диске Це ничегошеньки не знает.

PS. В файловой версии вызов сервера обрабатывается тем же процессом, что и клиентское окно. Но парадигма остается той же.
Ratings: 0 negative/0 positive

Re: &НаКлиенте и &НаСервере
Foxtrot

Сообщений: 3378
Откуда: Куда:
Дата: 06.04.16 12:05:01
сори ошибка была в прошлый раз

&НаКлиенте  
  Процедура СпособОплатыПриИзменении(Элемент)  
   	Элементы.Группа4.Видимость = (Объект.СпособОплаты = ПредопределенноеЗначение("Перечисление.СпособОплаты.Безналичные"));  
  КонецПроцедуры


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive



Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 17 NSF PaulWist Pliskin vnkor ВладимирС of63  (Гостей: 11)

18.06.2019 09:37:17 exec: 0.16
Mem: 1.399 Mb

© 2000-2019 Fox Club 
Яндекс.Метрика