Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 апр 2024, 06:02

Инструкции препроцессора

Автор 1cwiki, 18 июл 2015, 15:29

0 Пользователей и 1 гость просматривают эту тему.

1cwiki

Раздел
Общее описание встроенного языка
Инструкции препроцессора
Для указания разрешения использования процедур и функций общих модулей и модулей объектов используют инструкции препроцессора.
Синтаксис:

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

   где:
   <Логическое выражение> = [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора>]...]
   <Символ препроцессора> = {НаКлиенте | НаСервере | ТолстыйКлиентОбычноеПриложение | ТолстыйКлиентУправляемоеПриложение | Клиент | Сервер | ВнешнееСоединение }
   <Булева операция> = {И | ИЛИ}

Используемые термы:

   #Если (#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), которые определены в соответствующих приложениях.
   Для выполнения на клиенте:

   #Если ТолстыйКлиентОбычноеПриложение Тогда
   ...
   #КонецЕсли
   #Если ТолстыйКлиентУправляемоеПриложение Тогда
   ...
   #КонецЕсли

   Для выполнения на тонком клиенте:

   #Если ТонкийКлиент Тогда
   ...
   #КонецЕсли

   Для выполнения на веб-клиенте:

   #Если ВебКлиент Тогда
   ...
   #КонецЕсли

В файл–серверном варианте

В обычном клиенте в обычном и управляемом режиме доступны НаКлиенте, Клиент, ТолстыйКлиентОбычноеПриложение, ТолстыйКлиентУправляемоеПриложение , НаСервере, Сервер.
В файловом варианте инструкции препроцессора #Если Сервер..., #Если Клиент..., #Если ТолстыйКлиентОбычноеПриложение или #Если ТолстыйКлиентУправляемоеПриложение... определены всегда, поэтому экземпляр кода будет присутствовать всегда.
В тонком клиенте доступны – ТонкийКлиент, НаКлиенте, Клиент.
На серверной части тонкого клиента – Сервер, НаСервере.
Во внешнем соединении – ВнешнееСоединение, НаСервере, Сервер.

В сессии СОМ-соединения

Для включения возможности использования процедур и функций в сессии внешнего соединения применяется инструкция препроцессора ВнешнееСоединение.

   #Если ВнешнееСоединение Тогда
   ...
   #КонецЕсли

Особенности использования инструкций препроцессора совместно с директивами компиляции см. в главе "Директивы компиляции".

В мобильном приложении (клиент)

Для включения возможности использования процедур и функций в мобильном приложении на стороне клиента применяется инструкция препроцессора МобильноеПриложениеКлиент. Директива действует независимо от Клиент, то есть код одновременно и Клиент и МобильноеПриложениеКлиент.

   #Если МобильноеПриложениеКлиент Тогда
   ...
   #КонецЕсли

В мобильном приложении (сервер)

Для включения возможности использования процедур и функций в мобильном приложении на стороне сервера применяется инструкция препроцессора МобильноеПриложениеСервер. Директива действует независимо от Сервер, то есть код одновременно и Сервер и МобильноеПриложениеСервер.

   #Если МобильноеПриложениеСервер Тогда
   ...
   #КонецЕсли

Теги:
Рейтинг@Mail.ru

Поиск