Инструкции препроцессора
Для указания разрешения использования процедур и функций общих модулей и модулей объектов используют инструкции препроцессора.
Синтаксис:
#Если <Логическое выражение> Тогда
#ИначеЕсли <Логическое выражение> Тогда
…
#Иначе
#КонецЕсли
где:
<Логическое выражение> = [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора>]…]
<Символ препроцессора> = {НаКлиенте | НаСервере | ТолстыйКлиентОбычноеПриложение | ТолстыйКлиентУправляемоеПриложение | Клиент | Сервер | ВнешнееСоединение }
<Булева операция> = {И | ИЛИ}
Используемые термы:
#Если (#If)
#Тогда (#Then)
#ИначеЕсли (#ElsIf)
#Иначе (#Else)
#КонецЕсли (#EndIf)
#Область (#Region)
#КонецОбласти (#EndRegion)
Клиент (Client)
НаКлиенте (AtClient)
НаСервере (AtServer)
МобильноеПриложениеКлиент (MobileAppClient)
МобильноеПриложениеСервер (MobileAppServer)
ТолстыйКлиентОбычноеПриложение(ThickClientOrdinaryApplication)
ТолстыйКлиентУправляемоеПриложение (ThickClientManagedApplication)
Сервер (Server)
ВнешнееСоединение (ExternalConnection)
ТонкийКлиент (ThinClient)
ВебКлиент (WebClient)
И (AND)
ИЛИ (OR)
НЕ (NOT)
Регистр букв (строчные или заглавные) при написании не имеет значения.
Описание использования:
Группировка и свертка групп строк в модулях на встроенном языке
#Область [<Имя области>]
…
#КонецОбласти
[<Имя области>] – это идентификатор, который будет использоваться для отображения заголовка области, когда область свернута.
Если <Имя области> отсутствует, не является идентификатором или состоит из нескольких идентификаторов, будет выдаваться синтаксическая ошибка.
При редактировании модуля, в случае, если имя области не указано, при отображении свернутой области будет использована не локализуемая строка вида "[.....]".
Эти инструкции препроцессора ни на что не влияют. При формировании клиентской части модулей в управляемом приложении, инструкции вырезаются из формируемого клиентского модуля и, соответственно, в клиентское приложение не передаются.
Инструкции препроцессора #Область и #КонецОбласти должны быть парными. Они не могут пересекаться с другими инструкциями препроцессора.
Такой код вызовет ошибки компиляции модуля.
#Область Обл1
…
#Если Клиент Тогда
…
#КонецОбласти
…
#КонецЕсли
Инструкции препроцессора #Область и #КонецОбласти могут быть вложенными, т.е. обозначать области, вложенные друг в друга:
#Область Обл1
…
#Область Обл2
…
…
#КонецОбласти
…
#КонецОбласти
Поскольку единственное назначение инструкций препроцессора #Область и #КонецОбласти состоит в обозначении группируемых или группируемых и сворачиваемых строк в модулях на встроенном языке, не поддерживается пересечение этих инструкций с другими группируемыми конструкциями встроенного языка, например с процедурами/функциями, условными операторами, циклами.
Правильно:
#Область Обл1
…
Процедура Проц1()
…
КонецПроцедуры
…
#КонецОбласти
Неправильно (группируемые части модуля пересекаются):
#Область Обл1
…
Процедура Проц1()
…
#КонецОбласти
…
КонецПроцедуры
В варианте клиент-сервер
Если используется клиент–серверный вариант запуска системы "1С:Предприятие", то можно организовывать выполнение различных процедур и функций на сервере приложения или на клиентском месте.
Для выполнения на сервере (инструкции Сервер и НаСервере равнозначны):
#Если НаСервере Тогда
…
#КонецЕсли
Для того, чтобы процедура присутствовала и была вызвана на стороне сервера, фрагмент кода должен выглядеть следующим образом:
#Если Сервер Тогда
Процедура Проц1() Экспорт
…
КонецПроцедуры
#КонецЕсли
Важно! В приведенном тексте ВСЯ процедура, а не ее часть находится внутри блока #Если Сервер Тогда … #КонецЕсли.
При запуске конфигурации на выполнение производится загрузка и компиляция конфигурации. Экземпляры всех общих модулей создаются как на серверной, так и на клиентской стороне. Если в каком-то из общих модулей содержится приведенный фрагмент кода, то он в соответствии с инструкцией препроцессора #Если Сервер Тогда … #КонецЕсли будет скомпилирован только на стороне сервера, а на стороне клиента данный фрагмент «выпадет» из компилируемого текста и, таким образом, процедура на стороне клиента не будет представлена совсем.
Далее, при компиляции на стороне клиента модулей, в которых содержится обращение к данной процедуре, будет произведен ее поиск на стороне клиента. На стороне клиента таковой процедуры нет, следовательно, она не будет найдена. Тогда будет произведен поиск процедуры в общих модулях на стороне сервера, где она будет обнаружена и все вызовы будут переправляться для выполнения на сервер "1С:Предприятия".
Если блок #Если Сервер Тогда … #КонецЕсли включает только часть процедуры, то процедура будет присутствовать как на стороне клиента, так и на стороне сервера. Только на клиентской стороне она будет без той части, которая заключена в блок, поэтому результат выполнения процедуры может зависеть от того, где обрабатывается вызов этой процедуры.
Для выполнения на клиентском месте в обычном и управляемом режиме:
#Если НаКлиенте Тогда
…
#КонецЕсли
или
#Если Клиент Тогда
…
#КонецЕсли
Инструкция препроцессора НаКлиенте (AtClient) определена для всех клиентских приложений. Для тонкой подстройки модуля под конкретное клиентское приложение дополнительно введены инструкции ТолстыйКлиентОбычноеПриложение (ThickClientOrdinaryApplication), ТолстыйКлиентУправляемоеПриложение (ThickClientManagedApplication), ТонкийКлиент (ThinClient) и ВебКлиент (WebClient), которые определены в соответствующих приложениях.
Для выполнения на клиенте:
#Если ТолстыйКлиентОбычноеПриложение Тогда
…
#КонецЕсли
#Если ТолстыйКлиентУправляемоеПриложение Тогда
…
#КонецЕсли
Для выполнения на тонком клиенте:
#Если ТонкийКлиент Тогда
…
#КонецЕсли
Для выполнения на веб-клиенте:
#Если ВебКлиент Тогда
…
#КонецЕсли
В файл–серверном варианте
В обычном клиенте в обычном и управляемом режиме доступны НаКлиенте, Клиент, ТолстыйКлиентОбычноеПриложение, ТолстыйКлиентУправляемоеПриложение , НаСервере, Сервер.
В файловом варианте инструкции препроцессора #Если Сервер…, #Если Клиент…, #Если ТолстыйКлиентОбычноеПриложение или #Если ТолстыйКлиентУправляемоеПриложение… определены всегда, поэтому экземпляр кода будет присутствовать всегда.
В тонком клиенте доступны – ТонкийКлиент, НаКлиенте, Клиент.
На серверной части тонкого клиента – Сервер, НаСервере.
Во внешнем соединении – ВнешнееСоединение, НаСервере, Сервер.
В сессии СОМ-соединения
Для включения возможности использования процедур и функций в сессии внешнего соединения применяется инструкция препроцессора ВнешнееСоединение.
#Если ВнешнееСоединение Тогда
…
#КонецЕсли
Особенности использования инструкций препроцессора совместно с директивами компиляции см. в главе "Директивы компиляции".
В мобильном приложении (клиент)
Для включения возможности использования процедур и функций в мобильном приложении на стороне клиента применяется инструкция препроцессора МобильноеПриложениеКлиент. Директива действует независимо от Клиент, то есть код одновременно и Клиент и МобильноеПриложениеКлиент.
#Если МобильноеПриложениеКлиент Тогда
…
#КонецЕсли
В мобильном приложении (сервер)
Для включения возможности использования процедур и функций в мобильном приложении на стороне сервера применяется инструкция препроцессора МобильноеПриложениеСервер. Директива действует независимо от Сервер, то есть код одновременно и Сервер и МобильноеПриложениеСервер.
#Если МобильноеПриложениеСервер Тогда
…
#КонецЕсли