1С 8.x Управляемое приложение 1С 7.7. Бухучет Статьи Ссылки
1С 8.x arrow Управляемое приложение arrow Модули arrow Некотороые особенности компиляции модулей
Некотороые особенности компиляции модулей Печать

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

 

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

 

&НаСервере

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

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

 

 

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

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

 

 

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

 

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

 

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

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

 

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

 

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

 

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

#КонецЕсли

Синтаксис:

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

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

 

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

 

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

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

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

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

 

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

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