Как работает серверный вызов в 1С

Клиент-серверная архитектура заложена в платформе изначально — со времен «1С:Предприятие 8.0». Однако при разработке на 8.0 и 8.1 о разделении кода на клиентскую и серверную часть можно было не заботиться, поскольку на клиенте (на толстом клиенте) был доступен тот же функционал, что и на сервере. Всё изменилось с выходом платформы «1С:Предприятие 8.2», когда появился тонкий клиент. Теперь на клиенте доступен один функционал, на сервере — другой. Клиент и сервер «общаются» между собой с помощью серверного вызова. Конечно, это усложнило процесс разработки, но с другой стороны – можно создавать более оптимальные (быстрые) решения, поскольку все сложные задачи выполняются на сервере.

Немного базовой теории

Перед тем, как перейти к содержательной части, договоримся о некоторых ограничениях:

  • Мы подразумеваем, что Вы знаете о существовании четырёх директив компиляции, доступных в модулях формы: «&НаКлиенте», «&НаСервере», «&НаСервереБезКонтекста» и «&НаКлиентеНаСервереБезКонтекста».

  • Все примеры будут опираться на работу «1С:Предприятие 8» в клиент-серверном режиме. Файловый вариант по сути является эмуляцией клиент-серверного режима, с небольшими отклонениями (для данной статьи это не критично).

  • В рамках этого материала рассматривается исключительно взаимодействие клиента и сервера 1С. Работа с базой данных, преобразование данных и прочие нюансы работы системы – это темы других статей.

Далее, освежим в памяти немного теории.

Директивы, в имени которых упоминается «Клиент», устанавливают ограничение на обращение к базе данных.

Процедуры или функции, написанные под директивой «Без контекста», не имеют доступа к контексту (данным) формы. Исходя из этой информации, легко представить ограничения директив по доступу к данным в виде следующей таблицы:

Директива Данные формы База данных
 &НаКлиенте +
 &НаСервере + +
 &НаСервереБезКонтекста +
 &НаКлиентеНаСервереБезКонтекста

 

Опережая вопрос «Для чего же директива с самым длинным названием, если она ограничивает и использование контекста форм, и обращения к базе данных?», напомню: любая процедура и функция поддерживает обработку информации, переданной в неё в качестве параметров.

Отсюда делаем вывод: у методов, описанных под директивой «&НаКлиентеНаСервереБезКонтекста», единственным источником данных являются эти самые переданные параметры.

Не стоит забывать и про доступность вызова одних процедур и функций из других. Для этого стоит запомнить, что можно вызывать только те процедуры и функции, которые находятся под одноимённой (с родительским методом) директивой или под директивой, находящейся ниже (чем у родительского метода) согласно списку:

  • &НаКлиенте;
  • &НаСервере;
  • &НаСервереБезКонтекста;
  • &НаКлиентеНаСервереБезКонтекста.

То есть из метода, описанного под директивой «&НаКлиенте», можно вызывать процедуры и функции, описанные под любой директивой. А вот «из-под» директивы «&НаСервереБезКонтекста» можно вызывать только то, что описано под директивой «&НаСервереБезКонтекста» или «&НаКлиентеНаСервереБезКонтекста». 

Теперь про серверный вызов

Серверный вызов — это передача какой-то информации с клиентской части «1С:Предприятие 8» на серверную часть с целью вернуть обратно некий набор данных.

Самый первый серверный вызов инициализируется в момент начала сеанса работы 1С. То есть когда пользователь выполняет вход в информационную базу:

Серверный вызов в момент входа пользователя в информационную базу

Рисунок 1

«Оу! При чём тут Библиотека?!» — спросите Вы.

Всё очень просто:

Рисунок 2

Обратите внимание, что доступ к базе данных есть только на серверной части, а соединение между клиентом и сервером имеет ограниченную пропускную способность. Это и неудивительно – ведь соединение между клиентской и серверной частью может быть установлено даже по нестабильному низкоскоростному каналу связи (например, посредством мобильного интернета).

Кроме этого, передача данных между клиентом и сервером возможна только посредством серверного вызова.

Но, для того чтобы перейти к основной теме данной статьи, необходимо сначала разобраться – где будет выполняться программный код, написанный под определенными директивами. То есть на какой части приложения «1С:Предприятие 8» будут доступны процедуры и функции, описанные под директивами «&НаКлиенте», «&НаСервере», «&НаСервереБезКонтекста» и «&НаКлиентеНаСервереБезКонтекста»:

Рисунок 3

Видим, что на стороне клиента у нас будут доступны процедуры и функции, написанные под двумя директивами из четырёх, а на стороне сервера – под тремя из четырёх.

Сразу возникают вопросы: «Зачем такое многообразие и чем оно полезно?», «Как метод, описанный под директивой «&НаКлиентеНаСервереБезКонтекста» может выполняться и на клиенте, и на сервере?».

Сейчас мы постараемся понять особенности работы системы при использовании директив и почему необходимо уметь правильно использовать каждую из существующих директив компиляции.

И в этом нам помогут наши новые друзья, знакомьтесь!

Это процесс клиентской части приложения «1С:Предприятие 8». Он запускается на компьютере пользователя и сожительствует в оперативной памяти с другими процессами (38 вкладок браузера, поток аудио из социальной сети, telegram и другие). Может порождать серверный вызов.

Это процесс серверной части приложения «1С:Предприятие 8». Он существует на сервере 1С. Знает, какие клиентские сеансы в данный момент запущены, но самостоятельно не может инициировать взаимодействие с ними. Работает с клиентской частью только через полученный от неё серверный вызов.

А это серверный вызов. Как было сказано выше, он порождается процессом клиентской части и призван «прислуживать» ему. Он передает запросы со стороны клиента на сторону сервера, а также занимается транспортировкой данных с клиента на сервер и обратно.
 

Итак, давайте рассмотрим несколько особенностей работы программного кода в «1С:Предприятие 8», написанного под разными директивами.

Действие 1. Открытие пользователем формы с данными.

Рисунок 4

Рисунок 5

В момент нажатия Пользователем кнопки открытия формы из интерфейса, происходит передача управления на Сервер. По переданным параметрам получаются необходимые для построения данные из БД и происходит формирование контекста формы, который затем отправляется на клиентскую часть. У пользователя на экране отображается запрошенная форма.

Действие 2. Получение из открытой Пользователем формы дополнительных данных из Базы данных.

Рисунок 6

Получение этих данных может быть описано под двумя директивами — «&НаСервере» и «&НаСервереБезКонтекста». Рассмотрим оба случая.

Явление 1. Директива «&НаСервере»

Рисунок 7

При вызове процедуры или функции под директивой «&НаСервере» из формы со стороны клиента происходит «упаковка» всего контекста формы и отправка его на сторону сервера.

После выполнения метода на сервере, весь этот «пакет» транспортируется обратно. Таким образом, форма со всеми элементами и данными дважды проходит через самое узкое место системы.

Явление 2. Директива «&НаСервереБезКонтекста»

Рисунок 8

При вызове процедуры или функции под директивой «&НаСервереБезКонтекста» из формы со стороны клиента происходит передача на сторону сервера только тех данных, которые были указаны в качестве параметров. Обратно же передаётся только необходимая информация в уже подготовленном виде.

Таким образом, серверный вызов не несёт лишней нагрузки, и для передачи данных между клиентом и сервером потребуется меньше ресурсов.

Из примеров видно, что далеко не всегда оправдано указание директивы компиляции «&НаСервере» с точки зрения использования контекста (данных) формы на сервере.

Если возможно решить возникшую задачу путём отправки на сервер только определённого набора данных, то надо эту возможность использовать и описывать метод под директивой «&НаСервереБезКонтекста». Это позволит уменьшить нагрузку на серверный вызов, а также не занимать сервер обработкой и хранением ненужной в текущий момент информации.

Кстати, именно поэтому до версии платформы 8.3.7.1759 на сложных формах для управления видимостью элементов рекомендовалось использовать панели со страницами, а не свойство «Видимость». Только начиная с этого релиза отработка изменения видимости элементов стала выполняться на стороне клиента.

До этого момента при каждом изменении свойства «Видимость» происходил серверный вызов, как при использовании директивы «&НаСервере».

Но использование директивы «&НаСервереБезКонтекста» не является панацеей. Помимо нагрузки на серверный вызов, всегда необходимо задумываться ещё над одним параметром.

Действие 3. Обработка данных табличной части формы с получением дополнительной информации из Базы данных.

Рисунок 9

Явление 1. Построчная обработка табличной части на стороне клиента с организацией серверного вызова для получения дополнительной информации из базы данных.

Мы уже знаем – лучше использовать директиву «&НаСервереБезКонтекста».

Рисунок 10

Рисунок 11

При таком построении программного кода происходит множественное обращение со стороны клиента на сервер – по количеству элементов цикла, запущенного на стороне клиента.

Явление 2. Предварительная обработка табличной части на стороне клиента с целью подготовки требуемых к обработке на сервере данных и «упаковки» их в набор параметров. Затем передача этого набора на сервер для получения дополнительной информации из базы данных.

Используем всё ту же директиву «&НаСервереБезКонтекста».

Рисунок 12

В данном случае количество серверных вызовов сведено к минимуму за счёт предварительной подготовки параметров.

Большое количество текущих серверных вызовов может свидетельствовать о неоптимальном программном коде.

Избегайте создания серверных вызовов внутри цикла. Подготовьте набор параметров и единожды выполните его передачу для обработки на сервер. Если предполагается сложная обработка большого количества данных формы – передайте её полностью на сервер (при помощи директивы «&НаСервере») и выполните все действия на стороне сервера.

Если цель серверного вызова, созданного внутри цикла – получить какую-либо информацию из базы данных, то данная операция включает в себя запрос в цикле. А это очень негативно влияет на производительность всей системы в целом.

С директивой «&НаСервереБезКонтекста» вроде бы разобрались. Она нужна для того, чтобы уменьшить объем информации, передаваемой в рамках одного серверного вызова. Дополнительно разобрались с количеством текущих серверных вызовов – необходимо стремиться к их минимизации.

Давайте теперь попробуем разобраться, для чего нужна директива «&НаКлиентеНаСервереБезКонтекста».

Действие 4. Выполнение обработки данных.

Когда предполагается выполнение одной и той же обработки данных из нескольких участков программного кода, разумно этот код поместить в самостоятельную процедуру или функцию. Остаётся только решить, под какой директивой её написать.

Рисунок 13

Та-дам!

Рисунок 14

Для копирования у нас есть ксерокс. Но куда его поставить? На сторону клиента или сервера? Под какой директивой его разместить?

Как было озвучено ранее – любая процедура и функция поддерживает обработку информации, переданной в неё в качестве параметров.

 

Давайте для начала попробуем разместить копировальный аппарат на стороне клиента. Для этого описываем процедуру или функцию «Ксерокс» под директивой «&НаКлиенте». Тогда процесс клиентской части в любой момент сможет без проблем обратиться к ней и все действия будут выполнены в соответствии с программным кодом.

Но что произойдёт, если потребность в копировании возникнет на стороне сервера? Например, для подготовки данных, передаваемых на сторону клиента, потребуется сделать копию? Напомню – процесс серверной части не имеет возможности самостоятельно инициировать клиентские вызовы. 

Рисунок 15

Получается, что использовать директиву «&НаКлиенте» неправильно, а директиву «&НаСервере», как мы изучили ранее – нежелательно. Давайте посмотрим поведение системы при использовании директивы «&НаСервереБезКонтекста».

Рисунок 16

Вроде бы результат достигнут – и с сервера, и с клиента доступно копирование. Но для того, чтобы получить копию данных, используемых на клиенте, приходится делать серверный вызов. А это опять ведет к лишней нагрузке на соединение и временным затратам.

Избавиться от излишней передачи на сервер при сохранении возможности копирования на клиенте и на сервере можно при помощи директивы «&НаКлиентеНаСервереБезКонтекста».

Рисунок 17

Не углубляясь в детали, отметим, что метод, описанный под данной директивой управления, создаётся в двух копиях – и на стороне клиента, и на стороне сервера. Это позволяет выполнить необходимые действия там, где появилась потребность в них (клиент/сервер), без лишних серверных вызовов.

Конечно, вместо того чтобы выделять повторяющийся программный код, описывать его в отдельном методе под директивой «&НаКлиентеНаСервереБезКонтекста», можно поступить по-другому. Просто взять и написать один и тот же участок кода и в клиентской, и в серверной процедуре.

С точки зрения выполнения программы результат будет одинаков. Но объяснение «почему так не надо делать» – это уже совершенно другая тема…

Вместо заключения

В данной статье мы на наглядных примерах рассмотрели влияние различных директив компиляции на такое явление системы «1С:Предприятие 8», как серверный вызов. Как видно, основная причина для выбора правильной директивы – производительность транспортировки данных между клиентской и серверной частью.

Придерживайтесь при разработке следующих правил:

  • По возможности не передавайте контекст формы на сторону сервера
  • Минимизируйте количество текущих серверных вызовов
  • Длительные и ресурсоёмкие задачи запускайте на выполнение на стороне сервера (при возможности – в фоновом режиме).

Учитывайте потребность в доступности тех или иных видов данных, обоснованность передачи управления и не стесняйтесь при необходимости дробить процедуры и функции. И будет Вашему серверному вызову всегда легко, а Вы от пользователей Вашей программы получите «молчаливую благодарность»!

Так ли это важно думать об оптимизации? Тут имеет смысл вспомнить одну историю.

Программист Иван при доработке 1С на своём предприятии сделал ошибку в выборе директивы компиляции. Из-за неё длительность одного из серверных вызовов была больше возможной на полсекунды.

Пользователей, применяющих этот функционал, – 25 человек, и каждый из них за рабочий день в среднем совершает 110 таких операций. Всего впустую за рабочий месяц потрачено 28875 секунд (21 рабочий день * 25 человек * 110 операций * 0,5 секунды) = 8,02 часов.

Иван, каково тебе осознавать, что за месяц ты задолжал своему предприятию целый рабочий день?

О статье

Данную статью я написал для проекта «Курсы-по-1С» и она вызвала там достаточно высокий интерес. Для того, чтобы ещё больше начинающих (и не только) 1С-разработчиков могло получить пользу от прочтения данного материала, размещаем его полностью тут.

Читайте также и другие мои статьи: [ Наглядно о непонятном ] – Про «догмы» в 1СОтображение прогресса длительных операций в 8.3.10 (и более ранних версиях)Система взаимодействий в платформе 8.3.10.

Надеюсь, материал кому-то принесет пользу, а кого-то просто позабавит. Спасибо за внимание! 🙂

77 Comments

  1. Dzenn

    где-то это уже было

    Reply
  2. Fragster

    (1) курсы-по-1с рф/news/2017-03-09-how-server-call-works/

    (не работают ссылки на национальные домены 🙂 )

    Reply
  3. unichkin

    Подумал что плагиат сначала — поставил минус, потом увидел что автор тот же) Спасибо, хороший материал.

    Reply
  4. echo77

    Отдельный плюс за картиночки! Информация преподнесена легко и доходчиво.

    Reply
  5. Malfarion

    Очень хороший материал, все правильно и понятно описано. Продолжайте.

    Reply
  6. LexSeIch

    Спасибо за статью. Читал Вас на курсах по 1С. Ждём других статей на актуальные темы…

    Reply
  7. script

    В 8.3.11 появилась возможность передачи информации на клиент по инициативе сервера.

    Так что статью нужно немного дополнить, мне кажется.

    Передача информации по инициативе сервера

    Reply
  8. pahich

    (7) Спасибо за прочтение и замечание. Отмечу, что «возможность передачи информации на клиент по инициативе сервера» является механизмом системы взаимодействий, а не стандартной возможностью платформы. Поэтому, рассматривать ее в рамках данного материала не совсем правильно. Рекомендую к прочтению статью про систему взаимодействий, а также про длительные операции.

    Reply
  9. Brawler

    Забавно))

    Reply
  10. ValeriTim

    Отличная статья! И наглядно и читать приятно, и что самое главное — понятно 🙂 Держи звездочку!

    Огромное спасибо.

    А остальным только поучиться в оформлении 🙂

    Reply
  11. 🅵🅾️🆇

    Неплохо для новичков. По хорошему стоит углубиться в тему и показать, что именно физически передается между клиентом и сервером (как форма запаковывается в xml).

    У меня все лапки не доходят Wireshark’ом отследить.

    Reply
  12. spy-83

    круто.

    очень удобно и понятно! визуальное оформление + комментарии

    +++

    Reply
  13. AlexeyPapanov

    Комиксы излишние на мой вкус. А текст стоящий.

    Reply
  14. Абушев

    А как же «ПредопределенноеЗначение» на клиенте?

    Можно было в статью про него тоже.

    Reply
  15. Glebis

    Почему не описано применение оператора «Знач», который позволяет не возвращать значение параметра с клиента на сервер и тем самым уменьшает размер возвращаемого результата серверного вызова?

    Reply
  16. Yashazz

    Блин. Тоже сначала подумал, что плагиат… Да, неплохая и полезная статья.

    Reply
  17. pahich

    (14) 🙂 спасибо! Думаю, что есть много о чем ещё рассказать! Но в рамках данной статьи это будет перегруз…

    Reply
  18. pahich

    (15) ну это уже особенность работы с данными, а не принцип работы серверного вызова.

    Reply
  19. user705522_constantin_h

    Хорошая статья. Спасибо.

    Reply
  20. Serj1C

    (13) А мне больше картинки понравились

    Reply
  21. Andry.Boris

    Хорошая и полезная статья.

    Reply
  22. DPotapov90

    Очень полезная статья, особенно для начинающих. Спасибо 🙂

    Reply
  23. Glebis

    (15)

    с клиента на сервер

    *с сервера на клиент.

    (18)

    (15) ну это уже особенность работы с данными, а не принцип работы серверного вызова.

    дык это же серверный вызов не возвращает данные, взятые на сервере по значению. Поэтому и считаю, что нужно рассказывать про это в рамках рассмотрения работы серверного вызова.

    Reply
  24. Alex

    Очень понравился стиль передачи информации… респект!

    Reply
  25. SeerRM

    Круто! Побольше бы таких статей!

    Reply
  26. arekin

    Роль картинок в этой статьей просто бесценна.

    Спасибо за статью.

    Reply
  27. mikl79

    спасибо, все очень понятно

    Reply
  28. pahich

    (23) Глеб, серверный вызов — транспорт. Что «положат», то и «повезет». Данная тема больше относится к (11) 🙂

    Reply
  29. zurapa

    Статья шикарнейшая — понятно, даже самым маленьким.

    А вот вывод из истории в конце не понравился. Оптимизация — это замечательно! Но, говорить, что программист кому-то задолжал?.. Если бухгалтер медленно считает, или продажник немного продаёт — значит ли это, что он задолжал?..

    Если так важна скорость работы приложения, то 1С в сухую проигрывает другим решениям на java, PostgreSQL и прочему зоопарку технологий… И базы получаются куда живей и масштабируемей.

    Основная прелесть 1С в быстрой удобной разработки и получения результата вчера, при довольно-таки хилом планировании, проектировании… И это играет куда большую роль… А оптимизация в свободное время.

    Сразу написать оптимально не всегда получается. А порой не нужно, потому что делается обработка на раз, или два и срочно. Спасибо не скажут за оптимально написанный код за 8 часов и 1 час работы этой обработки, нежели написать за 30 минут, тяп-ляп и выполнение обработки займёт 3 часа… Вот в этом сила 1С. И говорить, что разработчик кому-то должен, за неоптимальный код совершенно не правильно. Генеральный директор компании «Рога и Копыта» вряд-ли лучше напишет.

    Reply
  30. Xershi

    Из справки:

    &НаКлиенте (&AtClient) — определяет клиентскую процедуру (функцию);

    &НаСервере (&AtServer) — определяет серверную процедуру (функцию);

    &НаСервереБезКонтекста (&AtServerNoContext) — определяет серверную процедуру (функцию), исполняемую на сервере вне контекста формы. Переменные не могут быть внеконтекстными. В таких методах недоступен контекст формы (включая данные формы). Допустимыми являются вызовы только других внеконтекстных методов. При вызове этих методов не выполняется передача данных формы на сервер и обратно. Применение внеконтекстных методов позволяет существенно уменьшить объем передаваемых данных при вызове серверной процедуры из среды клиентского приложения;

    &НаКлиентеНаСервереБезКонтекста (&AtClientAtServerNoContext) — определяет процедуру (функцию), исполняемую в модуле формы на клиенте и на сервере, не имеющую доступа к контексту формы, данным формы, переменным, но имеющую доступ к процедурам и функциям общих модулей – серверных, не глобальных и серверных и клиентских одновременно. Сама процедура (функция) доступна для клиентский, серверных контекстных и неконтекстных процедур и функций модуля формы. Из серверных внеконтекстных методов формы допускается вызов серверных методов общих модулей;

    &НаКлиентеНаСервере (&AtClientAtServer) — определяет процедуру (функцию), исполняемую в модуле команды, выполняемую на клиенте и на сервере, имеющую доступ к процедурам и функциям общих модулей – серверных, не глобальных и серверных и клиентских одновременно, не имеющую доступ к переменным. Сама процедура (функция) доступна для клиентских серверных процедур и функций модуля команды.

    Почему только 4 описали?

    Reply
  31. pahich

    (30) Максим, добрый день!

    Аналогичный вопрос задавали мне в «первоисточнике» вот ссылка

    Частично цитирую ответ:

    «есть директива «&НаКлиентеНаСервере». Она доступна в модуле команды и по сути равна директиве «&НаКлиентеНаСервереБезКонтекста», так как в командах отсутствует контекст формы. Так что любой читатель, столкнувшись с потребностью использовать директиву «&НаКлиентеНаСервере», без труда разберется в её особенностях. Да и в статье указано, что рассматриваются директивы, доступные в модуле формы.»

    Спасибо за прочтение! 🙂

    Reply
  32. pahich

    (29) Михаил, спасибо за прочтение! 🙂

    Цель выдуманной истории — дать пищу для дум на тему «а не стать ли мне еще лучше, чем я есть сейчас» 🙂 Кстати, на эту тему уже холиварят в соседней статье про «Суррогаты» 🙂

    Reply
  33. Xershi

    (31) проверил!

    Да действительно «&НаКлиентеНаСервере» выдает ошибку в модуле формы на 8.3.10.

    Вот пример обработки кому охота это проверить.

    Но я бы все таки оставил оговорку, что 5 метод не для формы!

    Reply
  34. DonAlPatino

    Вот такую бы статью, когда тонкий клиент появился. Помню куча времени ушла, чтобы работу директив осознать. И почему родную 1совскую документацию таким языком пишут, что ничего не понятно :-). Согласен с теме кто одобрил картинки. Картинку с кучей книжке таскаемых туда-сюда в явлении 1 можно на стенку повесить.

    Reply
  35. pahich

    (33) 🙂 Спасибо!

    Reply
  36. Xershi

    (34) документацию пишут технари, которые это разработали. А те кто не в теме и не могут понять, что они имели в виду. Для этого такие статьи и разрабатывают, чтобы понизить уровень входа!

    Reply
  37. ifilll

    По поводу «Вместо заключения», есть другой вариант.

    Плохой программист Джон сделал ошибку в коде, из-за которой каждый пользователь программы был вынужден потратить в среднем 15 минут времени на поиск обхода возникшей проблемы. Пользователей было 10 миллионов. Всего впустую потрачено 150 миллионов минут = 2.5 миллиона часов. Если человек спит 8 часов в сутки, то на сознательную деятельность у него остается 16 часов. То есть Джон уничтожил 156250 человеко-дней ≈ 427.8 человеко-лет. Средний мужчина живет 64 года, значит Джон убил примерно 6 целых 68 сотых человека.

    Как тебе спится, Джон — серийный программист?

    Reply
  38. spacecraft

    (37) 1,5 землекопа… где-то уже это было 🙂

    Reply
  39. ifilll

    В русскоязычном интернете это было на habr’е, в мире это уже давний мем, откуда он появился мне не известно, варьируется он деталями, а суть не меняется.

    Reply
  40. tivanitsky

    Восхитительная статья! :-). Особенно картиночки.

    Reply
  41. DrAku1a

    Вообще-то, это вольный пересказ анекдота «Серийный программист Джон»

    Плохой программист Джон сделал ошибку в коде, из-за которой каждый пользователь программы был вынужден потратить в среднем 15 минут времени на поиск обхода возникшей проблемы. Пользователей было 10 миллионов. Всего впустую потрачено 150 миллионов минут = 2.5 миллиона часов. Если человек спит 8 часов в сутки, то на сознательную деятельность у него остается 16 часов. То есть Джон уничтожил 156250 человеко-дней ≈ 427.8 человеко-лет. Средний мужчина живет 64 года, значит Джон убил примерно 6 целых 68 сотых человека.

    Как тебе спится, Джон — серийный программист?

    Источник (статья на Хабре), не факт что первоисточник, но в ней не указывается авторство.

    Тут вопрос целесообразности. Если программист тратит неделю на то, чтобы оптимизировать код, в результате — получая указанный прирост, то его труд предприятию окупится примерно через пол-года, и это в рамках указанной частоты использования, при условии что стоимость человекочаса программиста равна стоимости человекочаса бухгалтера. В реальности, для обработки запускаемой одним пользователем раз в месяц — в такой оптимизации вообще нет смысла. Например, в основном, все используют универсальные механизмы обмена — на базе конвертации данных. Работает такой обмен гораздо медленнее, чем специально написанная программистом обработка. Почему тогда всё делается через КД?!!

    Reply
  42. ЧерныйКот

    Автор молодец! очень понятно и доходчиво о теме, которая часто вызывает трудности у начинающих.

    Reply
  43. pahich

    (41) Андрей, спасибо за прочтение! )

    Идея истории взята оттуда, но не является «вольным пересказом». Надеюсь, Вы не считаете, что позаимствовать идею — плохо? ))

    Про целесообразность — всегда есть «рамки разумного». Но согласитесь — «сделать быстро» не всегда значит «сделать не оптимально»? Ну и наоборот — «делать медленно» не всегда значит «делать хорошо»…

    Reply
  44. pahich

    (42) Андрей, спасибо!

    Reply
  45. FlyNN

    ЭТАШЭДЭВР!) За одни только картинки поставил бы +100500)

    Reply
  46. DonAlPatino

    (39) Эх, молодежь(с завистью) Старый советский мультфильм: «В стране невыученных уроков»

    Reply
  47. smokevg

    Случайно наткнулся на статью, очень хорошо и понятно написано, спасибо.

    Reply
  48. AnnieCoder

    Если не ошибаюсь, читала статью на гилевском ресурсе. Хорошо разложено по полочкам.

    Reply
  49. АлександрЯрославичъ

    Спасибо! Познавательно и интересно.

    Reply
  50. METAL

    Не совсем в тему, но таки спрошу.

    Есть общий модуль, типовой, название заканчивается на «…ПолныеПрава».

    Стоят галки «Сервер» и «Вызов сервера».

    «Клиент» и «Привилегированный» — НЕ стоят.

    Выполняется метод из этого модуля и даёт ошибку «Нарушение прав доступа» (действительно, пользователь, под которым выполняется код, не имеет доступа к данной таблице)

    Режим — файловый (НЕ клиент-сервер).

    Вопрос: правильно ли понимаю, что в клиент-серверном режиме метод будет реально выполняться без контроля прав (с полными правами независимо от назначенных пользователю ролей), а в файловом — для этого надо будет установить галку Привилегированный?

    Reply
  51. spacecraft

    (52) от названия модуля ничего не зависит, от слова «совсем».

    Reply
  52. pahich

    (52) Михаил, добрый день.

    Нет, отличий в правах доступа к таблицам базы данных между файловым и клиент-серверным вариантом быть не должно. Если только какие-то недокументированные возможности.

    Поэтому или давайте пользователю соответствующие права, или ставьте свойство выполнения в привилегированном режиме у модуля в значение истина. Но тут тоже могут быть подводные камни : )

    Reply
  53. METAL

    (53) Ну, в типовых же его не просто так пишут. Стандарты как бы намекают 🙂 Но пробежался, все что нашёл — такие модули привилегированные

    Reply
  54. METAL

    (54) Добрый день, Павел.

    Спасибо за ответ.

    Да, похоже в нашем случае кто-то сделал этот модуль непривилегированным, который изначально таковым был при выпуске типового решения. На 100% неизвестно, так как нет возможности сравнить с конфигурацией поставщика, но похоже всё так и было.

    Сделал привилегированным, пока всё хорошо. Постараемся расследовать почему таки когда-то сняли эту галку, возможно действительно были какие-то подводные камни. Было бы интересно услышать пару примеров, если сталкивались (ну или в теории)

    Отдельное спасибо за статью и еще одно отдельно за рисунки, огонь!)

    Reply
  55. user1052892

    Добрый день! Подскажите, пожалуйста насчет установки видимости реквизитов формы. Есть функция, которая устанавливает видимость элементов формы. Причем видимость различных элементов зависит от значения констант и реквизитов объектов БД, на которые ссылаются реквизиты объекта формы. Как лучше сделать с точки зрения быстродействия: получать необходимые значения, обращаясь к серверу (возможно, несколько раз) и затем, вернувшись на клиент, установить видимость элементов; или сразу уйти на сервер, там получить все необходимое и там же выставить видимость? Другими словами, в функцией с какой директивой — &насервере или &наклиенте написать: элементы.элемент.видимость = ложь (или истина)? Если в 1-ом варианте удастся получить все данные за 1 раз, то будет ли разница в быстродействии со вторым вариантом? платформа 8.3.10. Спасибо заранее.

    Reply
  56. pahich

    (57) Добрый день. По идее, если это возможно, то лучше получить все за 1 раз в процедуре/функции под директивой «&НаСервереБезКонтекста» и на стороне клиента установить виимость. Если же получение значений для установки видимости невозможно за 1 обращение к БД, то правильнее уйти на сервер и там управлять видимостью. Но это в теории. На самом деле очень многое зависит от сложности формы и количества явных и неявных серверных вызовов. Пробуйте разные варианты и смотрите замер производительности — он покажет и серверные вызовы и потери на каждом из них.

    Reply
  57. user1052892

    (58) большое спасибо

    Reply
  58. user1052892

    Добрый день, не могли бы Вы ещё рассказать, как работает вызов функции модуля с флагом вызов сервера из клиентской процедуры формы (что происходит при вызове). Везде рекомендуют ограничивать такие вызовы, но я не нашла информации почему. Чем такие вызовы опаснее, чем, например, вызов процедуры модуля формы с директивой & насервере

    Reply
  59. pahich

    (60) Ольга, добрый день!

    Не готов сейчас ответить на этот вопрос. Если будет возможность — расследую подробно этот вопрос и оформлю в виде отдельной статьи. Но не обещаю этого : )

    Извините, что не смог помочь )

    Reply
  60. user1052892

    (61) спасибо, ничего страшного. Очень буду ждать статью ))

    Reply
  61. spacecraft

    (60)

    Везде рекомендуют ограничивать такие вызовы, но я не нашла информации почему

    Рекомендация носит не запрещающий характер на сами вызовы, а ограничение на бесконтрольные частые вызовы клиентом сервера. Передача управления с клиента на сервер требует транспортных затрат. Обычно это самое узкое горлышко в работе. Дополнительная «холостая» работа сервера на их обслуживание. Клиент, с момента передачи управления на сервер, ожидает возвращения управления.

    Чем такие вызовы опаснее, чем, например, вызов процедуры модуля формы с директивой & насервере

    Если имеется ввиду такие вызовы с клиента, то они по определению не могут быть опаснее. Это практически такой же вызов, только без сериализации/десериализации данных форм и их передачи.

    Можно их сравнивать с работой вызова клиентом серверного метода с директивой &НаСервереБезКонтекста

    Reply
  62. user1052892

    (63) спасибо

    Reply
  63. user1052892

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

    Reply
  64. spacecraft

    (65) в данном контексте уже рассматривается не сам вызов сервера с клиента, а безопасность модуля.

    Нельзя вызвать серверный метод напрямую с клиента, если он располагается в общем серверном модуле без флага «вызов сервера». Вот эта безопасность и подразумевается.

    Т.е. для обеспечение безопасности, когда к коду/данным нужно обеспечить доступ только с сервера, то такой код необходимо располагать только в серверном общем модуле без флага «вызов сервера». И обращение к нему осуществлять через промежуточные модули, где использовать «вызов сервера».

    Reply
  65. user1052892

    (66)Если я правильно поняла, то некая зловредная программа может получить доступ к данным, если будет вызов функции модуля с флагом «вызов сервера» с клиента, и не сможет этого сделать, если с клиента вызвать серверную функцию модуля формы, а уже оттуда общий модуль без флага «вызов сервера». Так? А почему? А если с клиента вызвать серверную функцию модуля формы, а оттуда общий модуль с флагом»вызов сервера»?

    Reply
  66. spacecraft

    (67) в качестве примера:

    В общем серверном модуле написали функцию, принимающую в качестве параметра модуль формы. Так как это серверная функция (выполняется в контексте сервера), то ожидается получение серверной формы.

    Если этот общий модуль указать флаг «вызов сервера», то возможна ситуация вызова этой функции с клиента. И даже попытки передать туда форму. Но это будет уже клиентская форма, которую на сервер просто так не передать.

    Получаем ситуацию, в которой ошибки при сохранении не будет, но возможна ошибка при выполнении кода во время работы.

    Ошибки времени выполнения более опасны, чем ошибки времени компиляции, так как не отслеживаются сразу.

    Reply
  67. user1052892

    (68) спасибо. Т.е. зловредные программы здесь ни при чём?

    Reply
  68. spacecraft

    (69) еще может быть ситуация, где в таком общем модуле устанавливается привилегированный режим, и открывать доступ с «вызов сервера» тоже не всегда разумно. Это уже от бизнеслогики зависит.

    Reply
  69. user1052892

    (70) спасибо большое

    Reply
  70. Darklight
    Reply
  71. Daynestro07

    Хорошая статья, все понятно разжевала на счет клиент-серверного взаимодействия. Сейчас без этого понимания на УФ можно не соваться.

    Reply
  72. user907301

    А мне очень понравилось, особенно все становится понятно при просмотре комиксов!

    Reply
  73. prime9

    Статья огонь! Ржали как кони, всем отделом когда сервер копию пытался сделать 🙂

    Reply
  74. user876469

    Спасибо, очень познавательно и доходчиво объяснено!

    Reply
  75. pahich

    (76) Пожалуйста )

    Reply
  76. RGEGSD

    Как это я ваще не вник к этому

    Reply
  77. pahich

    (78) Чем-то помочь? )

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *