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

от admin

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

Каждая процедура и функция модуля формы, модуля команды и общего модуля управляемого приложения предваряется директивой компиляции, определяющей среду исполнения данной процедуры. Директива предваряется символом «&». Допустимые директивы:

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

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

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

Отсутствие директивы компиляции перед процедурой (функцией) означает использование директивы по умолчанию. Директивой по умолчанию является &НаСервере. Не допускается использование нескольких директив компиляции перед одной процедурой (функцией). Не допускается наличие одноименных процедур (функций), отличающихся только директивами компиляции.

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

В модуле команды предопределенная процедура-обработчик ОбработатьКоманду должна предваряться директивой &НаКлиенте, так как выполнение команды происходит в клиентском приложении.

Модуль формы
В модуле формы доступны директивы компиляции – &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста.
Модуль команды
В модуле команды доступны директивы компиляции – &НаКлиенте, &НаСервере, &НаКлиентеНаСервере.
Общий модуль
В общем модуле доступны директивы компиляции – &НаКлиенте, &НаСервере.

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

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

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

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

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

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

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

Изображение

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

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

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

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

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

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

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

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

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

Вывод

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

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

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

Модули

Модули служат непосредственно для хранения исполняемого кода на языке 1С предприятия. Модули как правило состоят из:

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

Читать:
Чем char отличается от string

Модуль приложения

Модуль приложения используется для отслеживания запуска\завершения программы. Отрабатывает только в случае если 1С запускается интерактивно, то есть показывается на экране. В 1С есть два модуля приложения один для запуска обычного приложения, второй для запуска управляемого приложения. Модуль приложения управляемого приложения компилируется на стороне клиента. То есть недоступны обращения к базе данных и прочие объекты доступные только на сервере. В модуле обычного приложения, понятно таких проблем нет. В модуле приложения могут как обычно размещаться объявления переменных, процедуры и функции, а также предопределенные обработчики событий. В модуле доступны следующие события:

Если в модуле приложения объявить экспортную процедуру или функцию, то можно будет обращаться к ней напрямую без указания имени модуля, из любого другого модуля(если экспортная процедура объявлена в модуле управляемого приложения то очевидно, что она будет доступна только из клиентских модулей). По существу мы получим процедуру глобального контекста. При этом нужно понимать, что этот модуль компилируется при старте системы всегда, поэтому при наличии большого числа процедур в этом модуле будет падать скорость запуска приложения.

Модуль внешнего соединения

Модуль срабатывает в момент запуска приложения в режиме ком соединения, в этом модуле так же есть события ПриНачалеРаботыСистемы и ПриЗавершенииРаботыСистемы в этом модуле не создается окно и нет возможности взаимодействовать с пользователем . Компилируется на сервере.

Модуль сеанса

Запускается и при запуске пользователем и в случае ком соединения, его предназначение – установка параметров сеанса, в модуле сеанса есть только один обработчик УстановкаПараметровСеанса , этот обработчик вызывается первым при запуске приложения. Модуль сеанса компилируется на сервере и запускается в привилегированном режиме — без контроля прав конкретного пользователя. Так же в модуле сеанса запрещены экспортные процедуры и функции.

Внимание. Этот модуль запускается не только при старте системы, но еще и при обращении к параметрам сеанса которые не были определены. В этом случае в первом параметре процедуры УстановкаПараметровСеанса будет массив с параметрами к которым произошло обращение.

Общие модули

Общие модули служат для хранения процедур и функций, которые должны быть доступны из любого места конфигурации. Как правило в них описывают какие то общие механизмы. Количество общих модулей неограниченно. Обычно общие модули разбивают по функционалу. В отличии от предопределенных модулей, у общих модулей есть возможность указать, в каком контексте они будут скомпилированы. В общих модулях доступны только описания процедур и функций, недоступно описание переменных и раздел основной программы. При написании процедур в общих модулях необходимо учитывать место компиляции этого модуля. Есть возможность установить свойство глобальный в этом случае экспортные процедуры будут доступны без указания названий модуля. Глобальные модули компилируются при старте системы и также замедляют старт системы(особенно это плохо, когда там содержатся такие функции которые могут никогда не понадобиться или используются очень редко). Использование процедур из этих модулей может ухудшить читаемость кода. То есть строчка

Читается гораздо лучше чем просто

Галочка Привилегированный указывает на то что при обработке процедур из этого модуля система не будет обращать внимания на права пользователя, это бывает удобно при больших объемах обработки данных когда обработка должна отработать как можно быстрее и нет смысла уменьшать ее быстродействие проверкой прав или когда на время работы процедуры, необходимо дать пользователю недостающие права. Место компиляции модуля определяется с помощью установки свойств модуля. Доступные значения:

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

Модуль формы

Формы делятся на управляемые и на обычные. В управляемых формах код делится на клиентский и серверный. В обычных формах весь код выполняется на клиенте. Модуль предназначен для обработки действий пользователя и событий формы. (Подробно о событиях выполняемых в модуле формы можно будет почитать либо по ссылке, которая будет здесь, либо события будут добавлены сюда).

Модуль объекта

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

Модуль менеджера

Модуль позволяет добавить функционал расширяющий возможности менеджера, например: В модуле менеджера справочника номенклатура можно указать:

Директивы компиляции и инструкции препроцессора

Это новшество реализовано только в управляемом приложении. Использование директив в обычном приложении недоступно. В обычном приложении нет разделения программирования для клиента и сервера. В управляемом приложении перед функциями, процедурами и глобальными переменными можно явно указать где выполнять код (на сервере или на клиенте).

&НаКлиенте — определяет клиентскую процедуру (функцию).
&НаСервере — определяет серверную процедуру (функцию) с контекстом.
&НаСервереБезКонтекста — определяет серверную процедуру (функцию) без контекста.
&НаКлиентеНаСервереБезКонтекста — определяет процедуру (функцию), исполняемую в модуле формы на клиенте и на сервере.
&НаКлиентеНаСервере — определяет процедуру (функцию), исполняемую в модуле команды, выполняемую на клиенте и на сервере.
Без контекста — это означает без доступа к данным формы.

Инструкции препроцессора

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

Русский Английский
#Если #If
#Тогда #Then
#ИначеЕсли #ElsIf
#Иначе #Else
#КонецЕсли #EndIf
#Область #Region
#КонецОбласти #EndRegion
Клиент (для совместимости) Client
НаКлиенте AtClient
Сервер (для совместимости) Server
НаСервере AtServer
МобильноеПриложениеКлиент MobileAppClient
МобильноеПриложениеСервер MobileAppServer
ТолстыйКлиентОбычноеПриложение ThickClientOrdinaryApplication
ТолстыйКлиентУправляемоеПриложение ThickClientManagedApplication
ВнешнееСоединение ExternalConnection
ТонкийКлиент ThinClient
ВебКлиент WebClient
И AND
ИЛИ OR
НЕ NOT

#Если НаСервере Тогда
#КонецЕсли

#Если НаКлиенте Тогда
#КонецЕсли

#Область [<Имя области>]
#КонецОбласти

Комментарии (0)

Для того чтобы добавить сообщение, необходимо Войти или Зарегистрироваться

Похожие статьи