Некотороые особенности компиляции модулей |
Зачем нужны директивы препроцессора?
Если для общего модуля установлен флажок компиляции «Сервер» и, например, «Клиент (управляемое приложение)» будет создано два откомпилированных общих модуля. Один будет жить в контексте сервера, а другой – в контексте управляемого приложения. Из этого следует, что в таком общем модуле, вообще говоря, нужно использовать директивы для определения того места, где будет компилироваться та или иная процедура (ведь “начинка” процедуры вовсе не обязана отрабатывать, как на сервере, так и на клиенте и может функционировать только в одном из контекстов).
&НаСервере Процедура ТестированиеКомпиляцииНаСервере() … КонецПроцедуры
Зачем галка «Вызов сервера» у общего модуля? Методы серверного общего модуля, если об общем модуле не позаботится особо, не доступны для вызова со стороны клиента. Они станут доступны только тогда, когда у общего модуля будет поставлена галка «Вызов сервера»
Зачем нужна директива «НаКлиентеНаСервереБезКонтекста»?
Метод общего модуля с директивой «НаКлиентеНаСервереБезКонтекста» будет скомпилирован одновременно, как на стороне клиента, так и на стороне сервера. При этом, если вызов модуля будет осуществляться с клиента, то будет произведен вызов именно клиентского метода. А, если вызов будет осуществляться с сервера – то вызов серверного метода.
Глобальные переменные Глобальные переменные можно объявить в модуле управляемого приложения, но они компилируются только на клиенте. Серверных глобальных переменных нет! Альтернативой является использование параметров сеанса.
Как изолировать код в общем модуле, который может исполняться в разных контекстах?
Изолировать код в общем модуле можно при помощи инструкций препроцессора. Эти инструкции отрабатывают раньше директив компиляции. Инструкциями препроцессора можно ограничить любую часть модуля, но рекомендуется ограничивать только части методов.
#Если Сервер (|Клиент|ТонкийКлиент|WebКлиент|ВнешнееСоединение) … #КонецЕсли Синтаксис: #Если <Логическое выражение> Тогда Как сгруппировать область кода в модуле?
Для этого служит инструкция препроцессора:
#Область [<Имя области>] [<Имя области>] – это идентификатор, который будет использоваться для отображения заголовка области, когда область свернута. Где используется директива «НаКлиентеНаСервере»? Директива «НаКлиентеНаСервере» доступна только в модуле команды, нигде более не используется.
Что будет, если директива компиляции ошибочна? Если при написании директивы компиляции допущена ошибка, то метод не будет включен ни в один контекст. Такая ситуация возможна, например, для методов Объекта. В управляемом приложении все методы Объекта компилируются на Сервере, в обычном – на клиенте. И, если, например, указать директиву компиляции &НаСервере для некоторого метода, а потом запустить приложение, как обычное, то возникнет ошибка времени исполнения.
|