Процедуры и функции в модулях управляемых форм, а также в общих клиентских модулях управляемого приложения, требуют четкого определения среды выполнения программного кода.
&НаКлиентеНаСервереБезКонтекста Процедура Сервер() Сообщить("Клиент и сервер без контекста"); КонецПроцедуры &НаКлиентеНаСервере Процедура ТестСерверКлиент() Сообщить("Клиент и сервер"); КонецПроцедуры
Для этих целей, в общей сложности, используются пять директив препроцессора: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста, &НаКлиентеНаСервере. Первые три используются довольно часто при разработке конфигуарции. Последние же две - большая редкость. Именно о них и будет идти речь сегодня в статье.
Данная директива может применяться только в модуле команды. Сама процедура или функция, объявленная с такой директивой, может быть использована как на клиентской, так и на серверной стороне в модуле команды. Приведу пример использования в команде справочника. Для этого в тестовой конфигурации добавим команду "Тестируем" для справовочника "ПростойСправочник":
Модуль команды содержит следующий программный код:
&НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) Сервер(); ТестСерверКлиент(); КонецПроцедуры// Процедура для тест. вызова процедуры с СЕРВЕРА &НаСервере Процедура Сервер() Сообщить("Сервер"); ТестСерверКлиент(); КонецПроцедуры// Процедура для тест. вызова процедуры с КЛИЕНТА &НаКлиентеНаСервере Процедура ТестСерверКлиент() Сообщить("Клиент и сервер"); КонецПроцедуры
Теперь рассмотрим поведение платформы при ее выполнении. Вызовем команду в режиме предприятия и проанализируем количество вызовов сервера. Картина будет следующей:
Таким образом, при вызове процедуры с директивой препроцессора "НаКлиентеНаСервере" с клиентской стороны вызова сервера не происходит. Единственный вызов сервера в нашем прмере происходил при обращении к серверной процедуре "Сервер".
Из всего вышесказанного можно заключить, что процедуры и функции с директивой "НаКлиентеНаСервере" фактически имеет те же возможности, что и клиентские процедуры и функции с директивой "НаКлиенте". Использование директивы "НаКлиентеНаСервере" позволяет вызывать любые процедуры модуля команды, а также получать доступ к клиентскому контексту формы.
На мой взгляд, использование подобных процедур и функций усложняет читабельность программного кода. Если использовать директивы "НаКлиенте", "НаСервере" и "НаСервереБезКонтекста", то код будет более понятным и предсказуемым.
Рассмотрим теперь работу процедур и функций с директивой "&НаКлиентеНаСервереБезКонтекста".
Директива "НаКлиентеНаСервереБезКонтекста" может быть использована в модулях управляемых форм на клиенте и на сервере. При этом такие процедуры и функции не могут получить доступ к контексту формы, всем экспортным переменным формы, но возможен вызов процедур и функций из серверных общих модулей, а тажке не глобальных серверных и клиенских одновременно.
Рассмотрим небольшой пример их использования. В модуле формы элемента справочника "ПростойСправочник" напишем следующий программный код:
&НаКлиенте Процедура Тестируем(Команда) ТестируемКлиентСервер(); КонецПроцедуры &НаКлиентеНаСерверебезКонтекста Процедура ТестируемКлиентСервер() Сообщить("На клиенте и на сервере без контекста"); КонецПроцедуры
Процедура "Тестируем" принадлежит команде формы. При ее запуске осуществляется вызов процедуры "ТестируемКлиентСервер" с директивой "НаКлиентеНаСервереБезКонтекста". Как было сказано выше, данная процедура не сможет получить доступ к контексту формы и другим клиентским процедурам. Но все серверные процедуры модуля формы без контекста будут доступны для вызова, а также серверные процедуры общего модуля.
Вызов сервера будет произведен, что логично, при вызове серверной процедуры со стороны клиента.
Подытожим выше сказанное:
За весь опыт работы с управляемыми формами использовать подобные процедуры и функции приходилось очень редко. Как уже говорил выше, считаю, что их исопльзование ухудшает читабельность кода.