Клієнт серверні виклики

У платформі 8.2 в керованому додатку для оптимізації роботи додатків пропонується поділ функції клієнта і сервера. Програмний код в 1С розташовується в різних модулях, модулі об'єкта, модулі форми, загальних модулях і т.д. Процедури і функції кожного модуля можуть компілюватися як на сервері, так і на клієнті. Розглянемо можливості виклику різних процедур і функції з процедур, компільованих на стороні сервера, і процедур, компільованих на стороні клієнта.

У платформі 8.2 в керованому додатку для оптимізації роботи додатків пропонується поділ функції клієнта і сервера. На клієнті, наприклад, не можна звертатися до даних БД. А на стороні сервера не доступні дані форми, в модулі якої знаходиться процедура з директивою НаСервереБезКонтекста. Програмний код в 1С розташовується в різних модулях, модулі об'єкта, модулі форми, загальних модулях і т.д. Процедури і функції кожного модуля можуть компілюватися як на сервері, так і на клієнті. Розглянемо можливості виклику різних процедур і функції з процедур, компільованих на стороні сервера, і процедур, компільованих на стороні клієнта.

Отже, з боку клієнта можна викликати

1) клієнтські процедури даного модуля, з директивою НаКліенте;

Клієнт серверні виклики

2) серверні процедури даного модуля, з директивою На сервері;

Клієнт серверні виклики

3) клієнтські процедури загального модуля, з директивою НаКліенте (за умови наявності у властивостях доступності в декількох контекстах, «Клієнт» є обов'язковим і ін.);

Клієнт серверні виклики

4) всі процедури клієнтського загального модуля. у властивостях загального модуля має бути тільки властивість «Клієнт (кероване додаток)». директиву НаКліенте в загальному модулі в цьому випадку не пишуть;

Клієнт серверні виклики

5) процедури серверного загального модуля, але з додатковим властивістю «Виклик сервера», причому важливо щоб загальний модуль мав тільки властивість компіляції на сервері.

Клієнт серверні виклики

З боку сервера можна викликати

1) серверні процедури даного модуля, з директивою компіляції На сервері;

Клієнт серверні виклики

2) всі процедури серверного загального модуля, причому у властивостях загального модуля має бути тільки властивість «Сервер». директиву НаСервере в загальному модулі в цьому випадку не пишуть;

3) процедури загального модуля, з директивою НаСервере (за умови наявності у властивостях доступності в декількох контекстах, «Сервер» є обов'язковим і ін).

Крім того, якщо у властивостях загального модуля вказані кілька місць компіляції «Клієнт, Сервер», а в процедурі не вказана ніяка директива компіляції, то в цьому випадку процедура буде скомпільована і на стороні сервера, і на стороні клієнта. І її можна викликати відповідно і з клієнтських методів, і з серверних. В цьому випадку потрібно уважно використовувати процедуру, необхідно щоб її код міг виконуватися і на сервері, і на клієнті.

Існує ще одна особливість. В одному загальному модулі, що має кілька місць компіляції ( «Сервер, клієнт») не можна викликати з клієнтської процедури серверну того ж модуля, навіть якщо поставити галку «виклик сервера». Властивість «виклик сервера» має сенс при наявності тільки одного властивості загального модуля «компіляції на Сервері».

Існують рекомендації використовувати загальні модулі, скомпільовані тільки на сервері або тільки на клієнті. Відповідно використовувати в модулі з властивістю «Клієнт» всі клієнтські модулі, а в модулі з властивістю «сервер» використовувати всі серверні методи.

Ще одне зручне властивість загального модуля. Якщо у властивостях загального модуля активувати властивість «Глобальний», то процедури цього модуля можна викликати безпосередньо, без імені загального модуля.

Клієнт серверні виклики

Але не варто захоплюватися використанням цієї властивості, так як в такому випадку модуль компілюватиметься при запуску системи, що збільшує час запуску.

1. Олексій Роза (DoctorRoza) 02.07.11 9:40 Зараз в темі

Розглянемо можливості виклику різних процедур і функції з процедур, компільованих на стороні сервера, і процедур, компільованих на стороні клієнта.

З боку сервера можна викликати
1) серверні процедури даного модуля, з директивою компіляції На сервері;

Скажіть, буде являтся помилкою наступний код, що виконується в модулі форми документа Прибуткова:
НаКліенте
Процедура СпісокНоменклатуриКолічествоПріІзмененіі (Елемент)
РассчітатьСумму ();
КонецПроцедури

Процедура РассчітатьСумму ()
НомерСтр = Елементи.СпісокНоменклатури.ТекущаяСтрока;
Стр = Об'ект.СпісокНоменклатури [НомерСтр];
Стр.Сумма = Стр.Цена * Стр.Колічество;
КонецПроцедури // РассчітатьСумму ()

Думаю, що все вірно! Тому, поправте маленько, що директива компіляції НаСервере не завжди є обов'язковою. Процедура / функція без цієї директиви працює завжди на сервері!

2. BigB (BigB) 162 04.07.11 8:20 Зараз в темі

А де ж директиви НаСервереБезКонтекста, НаКліентеНаСервереБезКонтекста?

3. Дмитро Шерстобитов (DitriX) 2492 06.07.11 11:53 Зараз в темі

А де ж директиви НаСервереБезКонтекста, НаКліентеНаСервереБезКонтекста?

Ось це було б цікаво

4. Дмитро Гомзін (plevakin) 07.07.11 14:13 Зараз в темі

Існує завдання після проведення документа з форми документа оновлювати його форму (після проведення змінюється наприклад борг клієнта, відобразимо це зміна на формі). Чи можна отримати на сервері елементи форми документа?

5. Денис Яковлєв (iceflash) 4 12.12.11 22:26 Зараз в темі

(4) plevakin, Може не так зрозумів, а навіщо? Провели документ - змінилися залишки \ обертів, робимо запит. Обчислення значення записуємо в реквізит форми, який відображається на формі.

6. Денис Яковлєв (iceflash) 4 12.12.11 22:28 Зараз в темі

(2) BigB, Ага, було б цікаво, точніше там ніби як все зрозуміло, то ж саме все, але єдине - "Без контексту" =) Ось що є сам контекст, ще не розбирався, але як я зрозумів не передається інформація про формі / реквізитах форми, але з прімерчік було б корисно, так.

7. Сергій Ожерельев (Поручик) 3592 13.04.12 00:46 Зараз в темі

Ніколи цього не розумів в 8.2. Фактично функції компілятора або транслятора поклали на програміста і назвали зручністю для розробника.

8. Михайло Ликов (Miha.L) 13.04.12 1:03 Зараз в темі

9. Сергій Толмачов (sss999) 35 13.06.12 8:45 Зараз в темі

10. Сергій Толмачов (sss999) 35 13.06.12 10:21 Зараз в темі

чув таке, що якщо вказано # насервере то все що після доступно тільки сервера, звідси питання, як працює виклик процедур з клієнта тобто # накліенте, якщо фактично на клієнті не видно що всередині директиви # насервере.

11. Ігор Богданов (avz_1C) 10 20.06.12 13:06 Зараз в темі

Велике спасибі, реально допомогло :-)

12. Філін (Філін) 56 10.07.12 22:49 Зараз в темі

(10) sss999, Не треба плутати # і ))
- це директива компіляції, визначає, де буде працювати процедура або функція. Зауважте, що директиви ставляться відразу на всю процедуру або функцію, але не на частини коду всередині них.
# - це інструкції препроцесору. Вже з назви видно, що вони працюють ще до компіляції. Причому працюють дуже просто: якщо умова інструкції не виконується, то текст після його запровадження буде просто викинуть з модуля.
Виходить, якщо дуже захотіти, можна робити такі неподобства, і нічого за це не буде:

13. Олександр Литкін (TrinitronOTV) 08.12.13 17:58 Зараз в темі

а ось мені не зрозумілий такий момент: у мене файловий варіант бази даних і отже мені не зрозуміло, як в цьому випадку будуть працювати виклики "на сервері" і "на клієнті" в керованому додатку? хто-небудь підкажіть, будь ласка

14. Олексій Бєлоусов (AllexSoft) 08.12.13 19:23 Зараз в темі

(13) TrinitronOTV, точно так само як і в клієнт-північному варіанті роботи бази, справа в тому що запускається якась штучна середовище виконання "сервер", яка працює з даними, ну а тонкий клієнт підключається до цього "штучного сервера" і працює як зазвичай в клієнт-сервері. ну просто в разі файлової бази сервер і клієнт існують в рамках одного процесу 1С підприємства)

15. Олександр Литкін (TrinitronOTV) 10.12.13 5:33 Зараз в темі

(14) спасибі, AllexSoft, тобто виходить, що все виконується на клієнтській машині?

26. Ольга Ковальова (volha-77) 16 19.03.15 21:07 Зараз в темі

НаКліенте
Процедура ТабліцаТоваровТоварПріІзмененіі (Елемент)
МодульОбслужіваніяДокументов.ПріВводеТовара (ЕтаФорма);
КонецПроцедури

У функції МодульОбслужіваніяДокументов.ПріВводеТовара () потрібно звертатися, як до даних поточного рядка, так і до реквізитів шапки документа, також дані поточного рядка повинні змінюватися в цій функції, тому я передаю туди ЕтаФорма.

НаКліенте
Процедура глПріВводеТовара (Форма) Експорт

Об'ектФорми = Форма.Об'ект;
ТекущіеДанниеТЧ = Форма.Елементи.ТабліцаТоваров.ТекущіеДанние;


інші клієнтські виклики
серверні виклики, отримання ціни, партії і т.д.
.

У загальній функції глобального модуля відбуваються клієнтські виклики, куди також передається форма, і серверні виклики, куди передається Форма.Об'ект.
Все працює, але у мене терзають сумніви, чи правильно так робити - передавати Форму і робити багато окремих серверних викликів - чи не буде це в реальній базі сильно гальмувати роботу.
Може правильно при зміні рядка у формі документа вивантажувати табличну частину в таблицю значень і написати серверну функцію глобального модуля, туди передавати Форма.Об'ект (для отримання реквізитів шапки) і таблицю значень, всі дії здійснювати на сервері, а потім змінену таблицю значень завантажувати в таблицю форми? У такому варіанті теж сумніваюся, при кожній зміні виходить буде заново завантажуватися вся таблиця.
Заздалегідь велике спасибі.

27. Олексій Бєлоусов (AllexSoft) 20.03.15 11:49 Зараз в темі

(26) volha-77, потрібно намагатися якомога менше тягати туди-сюди весь контекст з клієнта на сервер і назад, це все відбивається на роботі форм. так само потрібно намагатися уникати модулів з прапором "виклик сервера", так як вони так само завантажуються в пам'ять клієнта.

У функції МодульОбслужіваніяДокументов.ПріВводеТовара () потрібно звертатися, як до даних поточного рядка, так і до реквізитів шапки документа, також дані поточного рядка повинні змінюватися в цій функції, тому я передаю туди ЕтаФорма.

Функція ПріВводеТовара (знач Контрагент, знач Організація, знач ТекущіеДанниеСтрокі) Експорт
// отримуємо ціну і суму
повернення Новий Структура ( "Ціна, Сума", Ціна, Сума)
КонецФункціі;

ну а виклик перетворюється в
ЗаполнітьЗначеніяСвойств (Елементи.Товари.ТекущіеДанние, МодульОбслужіваніяДокументов.ПріВводеТовара (Об'ект.Контрагент, Об'ект.Організація, Елементи.Товари.ТекущіеДанние));

Ось тоді ви будете тягати з клієнта на сервер і назад тільки гарантовано потрібні дані, а не всю марну купу

28. Ольга Ковальова (volha-77) 16 20.03.15 14:25 Зараз в темі

(27) AllexSoft, велике спасибі за Ваші поради.

29. Ольга Ковальова (volha-77) 16 20.03.15 18:25 Зараз в темі

(27) AllexSoft, Ви пишете "так само потрібно намагатися уникати модулів з прапором" виклик сервера ". Так як вони так само завантажуються в пам'ять клієнта". А якщо в модулі форми викликається клієнтська функція загального модуля, в якій вже йде виклик серверної функції іншого загального модуля з прапором "сервер", то теж вона буде завантажувати пам'ять?

НаКліенте
Процедура ТабліцаТоваровТоварПріІзмененіі (Елемент)
МодульОбслужіваніяДокументов.ПріВводеТовара (Об'ект.Контрагент, Об'ект.Організація, Елементи.ТабліцаТоваров.ТекущіеДанние);
КонецПроцедури

МодульОбслужіваніяДокументов (з прапором Клієнт)
НаКліенте
Функція ПріВводеТовара (знач Контрагент, знач Організація, ТекущіеДанниеСтрокі) Експорт
.
МодульОбслужіваніяДокументовСервер.ПріВводеТовараСервер (.);
ТекущіеДанниеСтрокі.Сумма = Сума
КонецФункціі;

МодульОбслужіваніяДокументовСервер - з прапором Сервер

30. Олексій Бєлоусов (AllexSoft) 23.03.15 10:33 Зараз в темі

(29) volha-77, якщо тільки прапор "сервер" тоді не завантажується в клієнтську робочу пам'ять, якщо "сервер" і "виклик сервера" - то завантажується. так що "виклик сервера" краще не ставити "на всякий випадок" просто так, і намагатися розділяти функції і процедури де він дійсно потрібний, а де ні. Зазвичай я роблю функції-перехідники на чисто серверні модулі, наприклад так:

31. Михайло Кончаренко (Anchoret) 19 15.11.16 15:23 Зараз в темі

Виникло питання
У модулі форми є наступний код:

Де буде виконуватися процедура КнопкаВиполнітьНажатіеНаСервере? На клієнті або на сервері?

32. Віктор Григоренко (JohnGalt) 2 18.11.16 13:26 Зараз в темі

(31) Anchoret, На клієнті, тому що успадковується попереднє вказівку виконання до тих пір, поки не буде іншого вказівки.

Созданіе30.06.11 19:21

Код откритНе вказано

Вивантаження даних (товарів, ТСД, постачальників) з 1С (БП, УПП, КА) в "Відшкодування ПДВ Платник податків 3"

Клієнт серверні виклики

Клієнт серверні виклики

Клієнт серверні виклики

Клієнт серверні виклики