новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

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

  • Добавить свою публикацию
  • для этого требуется регистрация

В курс дела

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

 &НаКлиентеНаСервереБезКонтекста
Процедура Сервер() 	
    Сообщить("Клиент и сервер без контекста"); 	
КонецПроцедуры   
&НаКлиентеНаСервере
Процедура ТестСерверКлиент()   	
	Сообщить("Клиент и сервер"); 	
КонецПроцедуры

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

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

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

Изображение

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

 &НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	
	Сервер();
	
	ТестСерверКлиент();
	           
КонецПроцедуры// Процедура для тест. вызова процедуры с СЕРВЕРА
&НаСервере
Процедура Сервер() 	
    Сообщить("Сервер"); 
	ТестСерверКлиент();
КонецПроцедуры// Процедура для тест. вызова процедуры с КЛИЕНТА
&НаКлиентеНаСервере
Процедура ТестСерверКлиент()   	
	Сообщить("Клиент и сервер"); 	
КонецПроцедуры

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

Изображение

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

 

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


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


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

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

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


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

 &НаКлиенте
Процедура Тестируем(Команда)
	
	ТестируемКлиентСервер();
	
КонецПроцедуры
&НаКлиентеНаСерверебезКонтекста
Процедура ТестируемКлиентСервер()
	
	Сообщить("На клиенте и на сервере без контекста");
	
КонецПроцедуры

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

 

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

Вывод

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

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

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

 
0
Читайте также
(V 7.7) Справка по работе с метаданными (с примерами)
Получение метаданных в программе 1С 7.7 происходит через объект "Метаданные"
Выполнение запроса в общем модуле
"Вынести выполнение запроса в функцию общего модуля"
Недостатки объектной модели
Принцип объектной модели и его недостатки
Разработки
Еще от автора
≡ к списку статей