1с на клиенте и на сервере что значит

Обновлено: 05.07.2024

Инструкции препроцессора "&НаСервереНаКлиенте" и "&НаКлиентеНаСервереБезКонтекста"

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

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

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

Данная директива может применяться только в модуле команды. Сама процедура или функция, объявленная с такой директивой, может быть использована как на клиентской, так и на серверной стороне в модуле команды. Приведу пример использования в команде справочника. Для этого в тестовой конфигурации добавим команду "Тестируем" для справовочника "ПростойСправочник":

Изображение

Модуль команды содержит следующий программный код:

Теперь рассмотрим поведение платформы при ее выполнении. Вызовем команду в режиме предприятия и проанализируем количество вызовов сервера. Картина будет следующей:

Изображение

Таким образом, при вызове процедуры с директивой препроцессора "НаКлиентеНаСервере" с клиентской стороны вызова сервера не происходит. Единственный вызов сервера в нашем прмере происходил при обращении к серверной процедуре "Сервер".

Из всего вышесказанного можно заключить, что процедуры и функции с директивой " НаКлиентеНаСервере" фактически имеет те же возможности, что и клиентские процедуры и функции с директивой "НаКлиенте". Использование директивы "НаКлиентеНаСервере" позволяет вызывать любые процедуры модуля команды, а также получать доступ к клиентскому контексту формы.

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

Рассмотрим теперь работу процедур и функций с директивой "&НаКлиентеНаСервереБезКонтекста".

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

Директива " НаКлиентеНаСервереБезКонтекста" может быть использована в модулях управляемых форм на клиенте и на сервере. При этом такие процедуры и функции не могут получить доступ к контексту формы, всем экспортным переменным формы, но возможен вызов процедур и функций из серверных общих модулей, а тажке не глобальных серверных и клиенских одновременно.

Рассмотрим небольшой пример их использования. В модуле формы элемента справочника "ПростойСправочник" напишем следующий программный код:

Процедура "Тестируем" принадлежит команде формы. При ее запуске осуществляется вызов процедуры "ТестируемКлиентСервер" с директивой "НаКлиентеНаСервереБезКонтекста". Как было сказано выше, данная процедура не сможет получить доступ к контексту формы и другим клиентским процедурам. Но все серверные процедуры модуля формы без контекста будут доступны для вызова, а также серверные процедуры общего модуля.

Вызов сервера будет произведен, что логично, при вызове серверной процедуры со стороны клиента.

Вывод

Подытожим выше сказанное:

  1. Процедуры и функции с директивой "НаКлиентеНаСервере" используются только в модулях команд и ограничены возможностями клиентской стороны.
  2. Процедуры и функции с директивой "НаКлиентеНаСервереБезКонтекста" используются только в модулях форм и позволяют работать с серверной стороной без передачи контекста формы (реквизиты формы, экспортные переменные модуля формы и др.).
  3. Основное различие между двумя рассматриваемыми директивами - это контекст их применения. Одна команда препроцессору используется только в модулях команд, другая в модулях управляемых форм.

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

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

Немного теории о стороне выполнения кода. При работе 1С в режиме клиент-сервера, запускается несколько процессов. На компьютере пользователя запускается 1cv8.exe, на сервере 1С запускается rphost.exe, rmngr.exe и ragent.exe.

ragent.exe

Приложение ragent.exe это по сути и есть наша служба агента 1С, которую мы можем посмотреть в списке служб Windows. Данное приложение отвечает за запуск всех остальных приложений и за распределение нагрузки между рабочими rphost.

rphost.exe

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

Количество ИБ на процесс rphost

rmngr.exe

В общем случае данное приложение отвечает за выполнение регламентных заданий.

Сторона выполнения кода

После того, как мы в общих чертах описали приложения, выполняющиеся на сервере, перейдем к описанию директив препроцессора, т.е. тех самых &НаКлиенте, &НаСервере. В зависимости от того, на какой стороне выполняется код, мы имеем доступ к файлам либо пользовательского компьютера, либо к файлам на сервере. При этом очень важно понимать, что код &НаКлиенте выполняется с правами пользователя, запустившего 1С. Код &НаСервере выполняется с правами пользователя, под которым запущена служба агента 1С. Как правило, это пользователь USR1CV8, если никто этого не поменял.

&НаКлиенте

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

&НаСервере

Код выполняется на сервере 1С, в процессе rphost. Файлы, созданные в процедурах &НаСервере, будут сохранены на сервере и смогут быть записаны только в те папки, на которые у пользователя службы агента 1С есть доступ на запись. &НаСервере уже можно свободно писать запросы, обращаться к предопределенным данным и к реквизитам ссылки через точку.

&НаСервереБезКонтекста

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

При вызове процедуры без контекста, процедура не видит реквизитов формы и не может к ним обращаться ни для чтения, ни для изменения.

И вот здесь нам как раз может помочь директива &НаСервереБезКонтекста.

В данном примере произойдет следующее: описание формы, таблица значений с 100000 строк и реквизит1 будут преобразованы в XML, отправлены на сервер. На сервере будет выполнен небольшой неявный запрос к СУБД, в значение реквизит1 будет записан результат этого запроса, все данные опять преобразуются в XML и отправятся на сервер. Учитывая, что таблица значений очень большая, то получится, что мы большой объем данных дважды в холостую передали между клиентом и сервером. Это не оптимально.

Во втором примере мы не стали передавать контекст формы, в итоге произошла только передача ссылки на элемент перечисления с сервера на клиент.

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

Пример 3, предположим, у нас есть название для перечисления, которое хранится в реквизите Реквизит2, мы можем его передать в качестве параметра функции:

Ну и напоследок еще один пример, как делать не надо:

Если мы в качестве параметра передаем ЭтаФорма, то по факту мы внеконтекстный вызов превращаем в контекстный. Если без этого не обойтись, то стоит делать контекстный вызов.

В платформе 8.2 в управляемом приложении для оптимизации работы приложений предлагается разделение функции клиента и сервера. На клиенте, например, нельзя обращаться к данным БД. А на стороне сервера не доступны данные формы, в модуле которой находится процедура с директивой &НаСервереБезКонтекста. Программный код в 1С располагается в различных модулях, модуле объекта, модуле формы, общих модулях и т.д. Процедуры и функции каждого модуля могут компилироваться как на сервере, так и на клиенте. Рассмотрим возможности вызова различных процедур и функции из процедур, компилируемых на стороне сервера, и процедур, компилируемых на стороне клиента.

Итак, со стороны клиента можно вызывать

1) клиентские процедуры данного модуля, с директивой &НаКлиенте;


2) серверные процедуры данного модуля, с директивой &НаСервере;


3) клиентские процедуры общего модуля, с директивой &НаКлиенте(при условии наличия в свойствах доступности в нескольких контекстах, «Клиент» обязателен и др.);


4) все процедуры клиентского общего модуля , в свойствах общего модуля должно быть только свойство «Клиент(управляемое приложение)». Директиву &НаКлиенте в общем модуле в этом случае не пишут;


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


Со стороны сервера можно вызывать

1) серверные процедуры данного модуля, с директивой компиляции &НаСервере;


2) все процедуры серверного общего модуля, причем в свойствах общего модуля должно быть только свойство «Сервер». Директиву &НаСервере в общем модуле в этом случае не пишут;


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


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

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

Существуют рекомендации использовать общие модули, скомпилированные только на сервере или только на клиенте. Соответственно использовать в модуле со свойством «Клиент» все клиентские модули, а в модуле со свойством «сервер» использовать все серверные методы.

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


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

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

Клиент-серверный вариант работы

Клиент-серверная архитектура разделяет всю работающую систему на три различные части, определенным образом взаимодействующие между собой:

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

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

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

Другим важным аспектом использования 3-х уровневой архитектуры является удобство администрирования и упорядочивание доступа пользователей к информационной базе. В этом варианте пользователь не должен знать о физическом расположении конфигурации или базы данных. Весь доступ осуществляется через кластер серверов «1С:Предприятия 8». При обращении к той или иной информационной базе пользователь должен указать только имя кластера и имя информационной базы, а система запрашивает соответственно имя и пароль пользователя.

«1С:Предприятие 8» использует возможности системы управления базами данных для эффективной выборки информации:
  • механизм запросов ориентирован на максимальное использование СУБД для выполнения расчетов и составления отчетов,
  • просмотр больших динамических списков обеспечивается без выполнения большого количества обращений к базе данных; при этом пользователю предоставляются возможности эффективного поиска, а также настройки отбора и сортировки.

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

Клиентские приложения

Клиент-серверный вариант работы

Кластер серверов

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

Сервер баз данных

В качестве сервера баз данных могут использоваться:

Администрирование кластера серверов

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

Выполнение основной функциональности на сервере

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

На сервере выполняется подготовка данных форм, расположение элементов, запись данных форм после изменения. На клиенте отображается уже подготовленная на сервере форма, выполняется ввод данных и вызовы сервера для записи введенных данных и других необходимых действий.

Аналогично командный интерфейс формируется на сервере и отображается на клиенте. Также и отчеты формируются полностью на сервере и отображаются на клиенте.

Клиент-серверный вариант работы

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

  • Запросы к базе данных,
  • Запись данных,
  • Проведение документов,
  • Различные расчеты,
  • Выполнение обработок,
  • Формирование отчетов,
  • Подготовка форм к отображению.
  • Получение и открытие форм,
  • Отображение форм,
  • «Общение» с пользователем (предупреждения, вопросы…),
  • Небольшие расчеты в формах, требующие быстрой реакции (например, умножение цены на количество),
  • Работа с локальными файлами,
  • Работа с торговым оборудованием.

Использование встроенного языка на клиенте

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

Клиент-серверный вариант работы

На клиенте не допускается непосредственная работа с базой данных. Не допускается работа непосредственно с прикладными объектами, например, недоступны такие типы встроенного языка, как СправочникОбъект.<имя>. Не допускается использование запросов. При необходимости вызова действий с данными в клиентском коде нужно вызывать серверные процедуры, которые уже будут обращаться к данным.

Читайте также: