У цій статті ми покажемо, як взаємодіють клієнтська і серверна частини платформи і які є особливості у використанні директив компіляції.
Це буде корисно початківцям розробникам і тим, у кого є прогалини в області клієнт-серверної взаємодії - все пояснимо «на пальцях» :)
Клієнт-серверна архітектура закладена в платформі спочатку - з часів «1С: Підприємство 8.0».
Однак при розробці на 8.0 і 8.1 про поділ коду на клієнтську і серверну частину можна було не турбуватися. оскільки на клієнті (на товстому клієнті) був доступний той же функціонал, що і на сервері.
Все змінилося з виходом платформи «1С: Підприємство 8.2», коли з'явився тонкий клієнт. Тепер на клієнті доступний один функціонал, на сервері - інший. Клієнт і сервер «спілкуються» між собою за допомогою серверного виклику.
Звичайно, це ускладнило процес розробки, але з іншого боку - можна створювати більш оптимальні (швидкі) рішення, оскільки всі складні завдання виконуються на сервері.
Трохи базової теорії
Перед тим, як перейти до змістовної частини, домовимося про деякі обмеження:
- Ми маємо на увазі, що Ви знаєте про існування чотирьох директив компіляції, доступних в модулях форми: «# 038; НаКліенте», «# 038; НаСервере», «# 038; НаСервереБезКонтекста» і «# 038; НаКліентеНаСервереБезКонтекста».
- Всі приклади будуть спиратися на роботу «1С: Підприємство 8» в клієнт-серверному режимі. Файловий варіант по суті є емуляцією клієнт-серверного режиму, з невеликими відхиленнями (для даної статті це не критично)
- В рамках цього матеріалу розглядається виключно взаємодія клієнта і сервера 1С. Робота з базою даних, перетворення даних і інші нюанси роботи системи - це теми інших статей.
Далі, освіжимо в пам'яті трохи теорії.
Директиви, в імені яких згадується «Клієнт», встановлюють обмеження на звернення до бази даних.
Процедури або функції, які перебувають під директивою «Без контексту», не мають доступу до контексту (даними) форми. Виходячи з цієї інформації, легко уявити обмеження директив щодо доступу до даних у вигляді такої таблиці:
Випереджаючи питання «Для чого ж директива з найдовшою назвою, якщо вона обмежує і використання контексту форм, і звернення до бази даних?», Нагадаю: будь-яка процедура і функція підтримує обробку інформації, переданої в неї в якості параметрів.
Звідси робимо висновок: у методів, описаних під директивою «# 038; НаКліентеНаСервереБезКонтекста», єдиним джерелом даних є ці самі передані параметри.
Не варто забувати і про доступність виклику одних процедур і функцій з інших. Для цього варто запам'ятати, що можна викликати тільки ті процедури і функції, які знаходяться під однойменною (з батьківським методом) директивою або під директивою, що знаходиться нижче (чим у батьківського методу) згідно зі списком:
- # 038; НаКліенте
- # 038; НаСервере
- # 038; НаСервереБезКонтекста
- # 038; НаКліентеНаСервереБезКонтекста.
Тобто з методу, описаного під директивою «# 038; НаКліенте», можна викликати процедури та функції, описані під будь-який директивою. А ось «з-під» директиви «# 038; НаСервереБезКонтекста» можна викликати тільки те, що описано під директивою «# 038; НаСервереБезКонтекста» або «# 038; НаКліентеНаСервереБезКонтекста».
Тепер про серверний виклик
Серверний виклик - це передача якоїсь інформації з клієнтської частини «1С: Підприємство 8» на серверну частину з метою повернути назад якийсь набір даних.
«Оу! При чому тут Бібліотека ?! »- запитаєте Ви.
Все дуже просто:
Зверніть увагу, що доступ до бази даних є тільки на серверної частини, а з'єднання між клієнтом і сервером має обмежену пропускну здатність. Це й не дивно - адже з'єднання між клієнтської і серверної частиною може бути встановлено навіть по нестабільного низкоскоростному каналу зв'язку (наприклад, за допомогою мобільного інтернету).
Крім цього, передача даних між клієнтом і сервером можлива тільки за допомогою серверного виклику.
Але, для того щоб перейти до основної теми даної статті, необхідно спочатку розібратися - де буде виконуватися програмний код, написаний під певними директивами. Тобто на якій частині додатка «1С: Підприємство 8» будуть доступні процедури і функції, описані під директивами «# 038; НаКліенте», «# 038; НаСервере», «# 038; НаСервереБезКонтекста» і «# 038; НаКліентеНаСервереБезКонтекста»:
Бачимо, що на стороні клієнта у нас будуть доступні процедури і функції, написані під двома директивами з чотирьох, а на стороні сервера - під трьома з чотирьох.
Відразу виникають питання: «Навіщо таке різноманіття і чим воно корисне?», «Як метод, описаний під директивою« # 038; НаКліентеНаСервереБезКонтекста »може виконуватися і на клієнті, і на сервері?».
Зараз ми постараємося зрозуміти особливості роботи системи при використанні директив і чому необхідно вміти правильно використовувати кожну з існуючих директив компіляції.
І в цьому нам допоможуть наші нові друзі, знайомтеся!
Це процес серверної частини програми «1С: Підприємство 8». Він існує на сервері 1С. Знає, які клієнтські сеанси в даний момент запущені, але самостійно не може ініціювати взаємодію з ними. Працює з клієнтською частиною тільки через отриманий від неї серверний виклик.
А це серверний виклик. Як було сказано вище, він породжується процесом клієнтської частини і покликаний «прислужувати» йому. Він передає запити з боку клієнта на сторону сервера, а також займається транспортуванням даних з клієнта на сервер і назад.
Отже, давайте розглянемо кілька особливостей роботи програмного коду в «1С: Підприємство 8», написаного під різними директивами.
Дія 1. Відкриття користувачем форми з даними.
У момент натискання Користувачем кнопки відкриття форми з інтерфейсу, відбувається передача керування на Сервер. За переданими параметрами виходять необхідні для побудови дані з БД і відбувається формування контексту форми, який потім відправляється на клієнтську частину. У користувача на екрані відображається запитана форма.
Дія 2. Отримання з відкритою Користувачем форми додаткових даних з бази даних.
Отримання цих даних може бути описано під двома директивами - «# 038; НаСервере» і «# 038; НаСервереБезКонтекста». Розглянемо обидва випадки.
Явище 1. Директива «# 038; НаСервере»
При виклику процедури або функції під директивою «# 038; НаСервере» з форми з боку клієнта відбувається «упаковка» всього контексту форми і відправка його на сторону сервера.
Після виконання методу на сервері, весь цей «пакет» транспортується назад. Таким чином, форма з усіма елементами і даними двічі проходить через найвужче місце системи.
Явище 2. Директива «# 038; НаСервереБезКонтекста»
При виклику процедури або функції під директивою «# 038; НаСервереБезКонтекста» з форми з боку клієнта відбувається передача на сторону сервера тільки тих даних, які були вказані в якості параметрів. Зворотно ж передається тільки необхідна інформація в уже підготовленому вигляді.
Таким чином, серверний виклик не несе зайвого навантаження, і для передачі даних між клієнтом і сервером буде потрібно менше ресурсів.
З прикладів видно, що далеко не завжди виправдано вказівку директиви компіляції «# 038; НаСервере» з точки зору використання контексту (даних) форми на сервері.
Якщо можливо вирішити задачу шляхом відправки на сервер тільки певного набору даних, то треба цю можливість використовувати і описувати метод під директивою «# 038; НаСервереБезКонтекста». Це дозволить зменшити навантаження на серверний виклик, а також не позичати сервер обробкою і зберіганням непотрібної в поточний момент інформації.
До речі, саме тому до версії платформи 8.3.7.1759 на складних формах для управління видимістю елементів рекомендувалося використовувати панелі зі сторінками, а не властивість «Видимість». Тільки починаючи з цього релізу відпрацювання зміни видимості елементів стала виконуватися на стороні клієнта.
До цього моменту при кожній зміні властивості «Видимість» відбувався серверний виклик, як при використанні директиви «# 038; НаСервере».
Але використання директиви «# 038; НаСервереБезКонтекста» не є панацеєю. Крім навантаження на серверний виклик, завжди необхідно замислюватися ще над одним параметром.
Крок 3. Обробка даних табличній частині форми з отриманням додаткової інформації з Бази даних.
Явище 1. Построчная обробка табличній частині на стороні клієнта з організацією серверного виклику для отримання додаткової інформації з бази даних.
Ми вже знаємо - краще використовувати директиву «# 038; НаСервереБезКонтекста».
Цікаве виклад, однозначно +++, але звичайно для себе звичайно нічого нового не знайшов.
Вважаю що 1С сама винна в тому що зробив такий підхід, що 95% користується директивою НаСервере. Їм як мінімум треба було б поміняти значень директив, тобто НаСервере - щоб виконувалося без контексту (і створювалося за замовчуванням, а директива НаСеререСКонтекстом - вже з контекстом, тоді вільно / мимоволі але більшість розробників б стало більш правильно використовувати їх.
Всі ці контексти - це винахід 1С, як зазвичай. Нормальні середовища розробки самі визначають, де виконуватися коду. Клієнт-сервер - це низький рівень, навіщо туди 1С з надбудови над мовою верхнього рівня полізла - незрозуміло.