Некотороые особенности компиляции модулей

Зачем нужны директивы препроцессора?

 

Если для общего модуля установлен флажок компиляции «Сервер» и, например, «Клиент (управляемое приложение)» будет создано два откомпилированных общих модуля. Один будет жить в контексте сервера, а другой – в контексте управляемого приложения. Из этого следует, что в таком общем модуле, вообще говоря, нужно использовать директивы для определения того места, где будет компилироваться та или иная процедура (ведь “начинка” процедуры вовсе не обязана отрабатывать, как на сервере, так и на клиенте и может  функционировать только в одном из контекстов).

 

&НаСервере

Процедура ТестированиеКомпиляцииНаСервере()

КонецПроцедуры

 

 

Зачем галка «Вызов сервера» у общего модуля?

Методы серверного общего модуля, если об общем модуле не позаботится особо, не доступны для вызова со стороны клиента. Они станут доступны только тогда, когда у общего модуля будет поставлена галка «Вызов сервера»

 

 

Зачем нужна директива «НаКлиентеНаСервереБезКонтекста»?

 

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

 

Глобальные переменные

Глобальные переменные можно объявить в модуле управляемого приложения, но они компилируются только на клиенте. Серверных глобальных переменных нет! Альтернативой является использование параметров сеанса.

 

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

 

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

 

#Если Сервер (|Клиент|ТонкийКлиент|WebКлиент|ВнешнееСоединение)

#КонецЕсли

Синтаксис:

   #Если <Логическое выражение> Тогда
   #ИначеЕсли <Логическое выражение> Тогда
   …
   #Иначе
   #КонецЕсли

Как сгруппировать область кода в модуле?

 

Для этого служит инструкция препроцессора:

 

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

[<Имя области>] – это идентификатор, который будет использоваться для отображения заголовка области, когда область свернута.

Где используется директива «НаКлиентеНаСервере»?

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

 

Что будет, если директива компиляции ошибочна?

Если при написании директивы компиляции допущена ошибка, то метод не будет включен ни в один контекст. Такая ситуация возможна, например, для методов Объекта. В управляемом приложении все методы Объекта компилируются на Сервере, в обычном – на клиенте. И, если, например, указать директиву компиляции &НаСервере для некоторого метода, а потом запустить приложение, как обычное, то возникнет ошибка времени исполнения.