Препроцессор

Встроенный язык

Синтаксис и применение Препроцессор в платформе 1С:Предприятие. Описание и примеры кода.

Синтаксис

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



<Инструкция> = { Если <Логическое выражение> Тогда | ИначеЕсли <Логическое выражение> Тогда | Иначе | КонецЕсли | Вставка | КонецВставки | Удаление | КонецУдаления }


Логическое выражение



<Логическое выражение> = [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора>]…]


Символ препроцессора



<Символ препроцессора> = { Сервер | НаСервере | Клиент | НаКлиенте | ТонкийКлиент | МобильныйКлиент | ВебКлиент | ВнешнееСоединение | ТолстыйКлиентУправляемоеПриложение | ТолстыйКлиентОбычноеПриложение | МобильныйАвтономныйСервер | МобильноеПриложениеКлиент | МобильноеПриложениеСервер | Область | КонецОбласти }


Булева операция



<Булева операция> = {И | Или}


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



#Если (#If) 

#Тогда (#Then) 

#ИначеЕсли (#ElsIf) 

#Иначе (#Else) 

#КонецЕсли (#EndIf) 

#Область (#Region) 

#КонецОбласти (#EndRegion) 

#Вставка (#Insert) 

#КонецВставки (#EndInsert) 

#Удаление (#Delete) 

#КонецУдаления (#EndDelete) 

И (AND) 

ИЛИ (OR) 

НЕ (NOT) 

Клиент (Client) 

НаКлиенте (AtClient) 

НаСервере (AtServer) 

Сервер (Server) 

ТонкийКлиент (ThinClient) 

ВебКлиент (WebClient) 

МобильныйАвтономныйСервер (MobileStandaloneServer) 

МобильноеПриложениеКлиент (MobileAppClient) 

МобильноеПриложениеСервер (MobileAppServer) 

МобильныйКлиент (MobileClient) 

ТолстыйКлиентОбычноеПриложение(ThickClientOrdinaryApplication) 

ТолстыйКлиентУправляемоеПриложение (ThickClientManagedApplication) 

ВнешнееСоединение (ExternalConnection) 


Регистр букв (строчные или заглавные) при написании не имеет значения.

Описание использования:
Группировка и свертка групп строк в модулях на встроенном языке 
#Область [<Имя области>]
…
#КонецОбласти 

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


Если <Имя области> отсутствует, не является идентификатором или состоит из нескольких идентификаторов, будет выдаваться синтаксическая ошибка.


При редактировании модуля, в случае, если имя области не указано, при отображении свернутой области будет использована не локализуемая строка вида "[.....]".


Эти инструкции препроцессора ни на что не влияют. При формировании клиентской части модулей в управляемом приложении, инструкции вырезаются из формируемого клиентского модуля и, соответственно, в клиентское приложение не передаются.



Инструкции препроцессора #Область и #КонецОбласти должны быть парными. Они не могут пересекаться с другими инструкциями препроцессора. 
Такой код вызовет ошибки компиляции модуля.



#Область Обл1
…
#Если Клиент Тогда
…
#КонецОбласти
…
#КонецЕсли


Инструкции препроцессора #Область и #КонецОбласти могут быть вложенными, т.е. обозначать области, вложенные друг в друга:



#Область Обл1
…
#Область Обл2
…
…
#КонецОбласти
…
#КонецОбласти


Поскольку единственное назначение инструкций препроцессора #Область и #КонецОбласти состоит в обозначении группируемых или группируемых и сворачиваемых строк в модулях на встроенном языке, не поддерживается пересечение этих инструкций с другими группируемыми конструкциями встроенного языка, например, с процедурами/функциями, условными операторами, циклами.


Правильно:



#Область Обл1
…
Процедура Проц1()
…
КонецПроцедуры
…
#КонецОбласти


Неправильно (группируемые части модуля пересекаются):



#Область Обл1
…
Процедура Проц1()
…
#КонецОбласти
…
КонецПроцедуры

Инструкции препроцессора в различных вариантах работы

При описании того, какие инструкции препроцессора определены в различных вариантах работы, будем считать, что:



Клиентская часть - это приложение системы "1С:Предприятие", которое работает на компьютере пользователя. 

Серверная часть - это приложение системы "1С:Предприятие", которое работает на компьютере, на котором работает кластер серверов системы "1С:Предприятие".


В различных вариантах использования определены различные наборы инструкций препроцессора:



Файловый вариант: 


Тонкий клиент: 


Клиентская часть: Клиент, НаКлиенте, ТонкийКлиент. 

Серверная часть: Сервер, НаСервере. 


Веб-клиент: 


Клиентская часть: Клиент, НаКлиенте, ВебКлиент. 

Серверная часть: Сервер, НаСервере. 


Внешнее соединение: 


Клиентская часть: недоступно, 

Серверная часть: Сервер, НаСервере,ВнешнееСоединение. 


Интернет-сервисы, фоновые и регламентные задания: 


Клиентская часть: недоступно. 

Серверная часть: Сервер, НаСервере. 


Толстый клиент в управляемом режиме: 


Клиентская часть: Сервер, НаСервере, Клиент, НаКлиенте, ТолстыйКлиентУправляемоеПриложение. 

Серверная часть: Сервер, НаСервере, Клиент, НаКлиенте, ТолстыйКлиентУправляемоеПриложение.


Толстый клиент в обычном режиме: 


Клиентская часть: Сервер, НаСервере, Клиент, НаКлиенте, ТолстыйКлиентОбычноеПриложение. 

Серверная часть: Сервер, НаСервере, Клиент, НаКлиенте, ТолстыйКлиентОбычноеПриложение.



Клиент-серверный вариант: 




Тонкий клиент: 



Клиентская часть: Клиент, НаКлиенте, ТонкийКлиент. 

Серверная часть: Сервер, НаСервере. 


Веб-клиент: 


Клиентская часть: Клиент, НаКлиенте, ВебКлиент. 

Серверная часть: Сервер, НаСервере. 


Мобильный клиент: 


Клиентская часть: Клиент, НаКлиенте, МобильныйКлиент. 

Серверная часть: Сервер, НаСервере. 


Мобильный клиент с автономным режимом: 


Клиентская часть: Клиент, НаКлиенте, МобильныйКлиент. 

Серверная часть: Сервер, НаСервере. 



Серверная часть на мобильном устройстве: Сервер, НаСервере, МобильныйАвтономныйСервер.


Внешнее соединение: 


Клиентская часть: недоступно. 

Серверная часть: ВнешнееСоединение.


Интернет-сервисы, фоновые и регламентные задания: 


Клиентская часть: недоступно. 

Серверная часть: Сервер, НаСервере.


Толстый клиент в управляемом режиме: 


Клиентская часть: Клиент, НаКлиенте, ТолстыйКлиентУправляемоеПриложение. 

Серверная часть: Сервер, НаСервере.


Толстый клиент в обычном режиме: 


Клиентская часть: Клиент, НаКлиенте, ТолстыйКлиентОбычноеПриложение. 

Серверная часть: Сервер, НаСервере.


Мобильная платформа:


Клиентская часть: Клиент, НаКлиенте, МобильноеПриложениеКлиент. 

Серверная часть: Сервер, НаСервере, МобильноеПриложениеСервер. 



Если используется неглобальный общий модуль, для которого установлено использование на клиенте (любом) и на сервере, то методы, заключенные в условие #Если Сервер Тогда #КонецЕсли, будут доступны только в том случае, если вызов этих методов выполняется со стороны сервера. Вызов таких методов со стороны клиента недоступен.
В остальных случаях инструкции Сервер и НаСервере полностью идентичны и инструкции Клиент и НаКлиенте также полностью идентичны.


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

Точечная модификация метода в расширении (с аннотацией &ИзменениеИКонтроль)

В текст расширяемого метода можно внести точечные изменения. Для этого метод должен быть скопирован в расширение с аннотацией &ИзменениеИКонтроль. С помощью инструкций #Вставка … #КонецВставки и #Удаление … #КонецУдаления отмечаются фрагменты текста, которые необходимо добавить в расширяемый модуль и, соответственно, удалить из него.
Полное описание, параметры и ограничения

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

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

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

Синтаксис:

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

<Инструкция> = { Если <Логическое выражение> Тогда | ИначеЕсли <Логическое выражение> Тогда | Иначе | КонецЕсли | Вставка | КонецВставки | Удаление | КонецУдаления }

Логическое выражение

<Логическое выражение> = [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора>]…]

Символ препроцессора

<Символ препроцессора> = { Сервер | НаСервере | Клиент | НаКлиенте | ТонкийКлиент | МобильныйКлиент | ВебКлиент | ВнешнееСоединение | ТолстыйКлиентУправляемоеПриложение | ТолстыйКлиентОбычноеПриложение | МобильныйАвтономныйСервер | МобильноеПриложениеКлиент | МобильноеПриложениеСервер | Область | КонецОбласти }

Булева операция

<Булева операция> = {И | Или}

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

#Если (#If)

#Тогда (#Then)

#ИначеЕсли (#ElsIf)

#Иначе (#Else)

#КонецЕсли (#EndIf)

#Область (#Region)

#КонецОбласти (#EndRegion)

#Вставка (#Insert)

#КонецВставки (#EndInsert)

#Удаление (#Delete)

#КонецУдаления (#EndDelete)

И (AND)

ИЛИ (OR)

НЕ (NOT)

Клиент (Client)

НаКлиенте (AtClient)

НаСервере (AtServer)

Сервер (Server)

ТонкийКлиент (ThinClient)

ВебКлиент (WebClient)

МобильныйАвтономныйСервер (MobileStandaloneServer)

МобильноеПриложениеКлиент (MobileAppClient)

МобильноеПриложениеСервер (MobileAppServer)

МобильныйКлиент (MobileClient)

ТолстыйКлиентОбычноеПриложение(ThickClientOrdinaryApplication)

ТолстыйКлиентУправляемоеПриложение (ThickClientManagedApplication)

ВнешнееСоединение (ExternalConnection)

Регистр букв (строчные или заглавные) при написании не имеет значения.

Описание использования:

Группировка и свертка групп строк в модулях на встроенном языке

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

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

Если <Имя области> отсутствует, не является идентификатором или состоит из нескольких идентификаторов, будет выдаваться синтаксическая ошибка.

При редактировании модуля, в случае, если имя области не указано, при отображении свернутой области будет использована не локализуемая строка вида "[.....]".

Эти инструкции препроцессора ни на что не влияют. При формировании клиентской части модулей в управляемом приложении, инструкции вырезаются из формируемого клиентского модуля и, соответственно, в клиентское приложение не передаются.

Инструкции препроцессора #Область и #КонецОбласти должны быть парными. Они не могут пересекаться с другими инструкциями препроцессора.
Такой код вызовет ошибки компиляции модуля.

#Область Обл1
…
#Если Клиент Тогда
…
#КонецОбласти
…
#КонецЕсли

Инструкции препроцессора #Область и #КонецОбласти могут быть вложенными, т.е. обозначать области, вложенные друг в друга:

#Область Обл1
…
#Область Обл2
…
…
#КонецОбласти
…
#КонецОбласти

Поскольку единственное назначение инструкций препроцессора #Область и #КонецОбласти состоит в обозначении группируемых или группируемых и сворачиваемых строк в модулях на встроенном языке, не поддерживается пересечение этих инструкций с другими группируемыми конструкциями встроенного языка, например, с процедурами/функциями, условными операторами, циклами.

Правильно:

#Область Обл1
…
Процедура Проц1()
…
КонецПроцедуры
…
#КонецОбласти

Неправильно (группируемые части модуля пересекаются):

#Область Обл1
…
Процедура Проц1()
…
#КонецОбласти
…
КонецПроцедуры

Инструкции препроцессора в различных вариантах работы

При описании того, какие инструкции препроцессора определены в различных вариантах работы, будем считать, что:

Клиентская часть - это приложение системы "1С:Предприятие", которое работает на компьютере пользователя.

Серверная часть - это приложение системы "1С:Предприятие", которое работает на компьютере, на котором работает кластер серверов системы "1С:Предприятие".

В различных вариантах использования определены различные наборы инструкций препроцессора:

Файловый вариант:

Тонкий клиент:

Клиентская часть: Клиент, НаКлиенте, ТонкийКлиент.

Серверная часть: Сервер, НаСервере.

Веб-клиент:

Клиентская часть: Клиент, НаКлиенте, ВебКлиент.

Серверная часть: Сервер, НаСервере.

Внешнее соединение:

Клиентская часть: недоступно,

Серверная часть: Сервер, НаСервере,ВнешнееСоединение.

Интернет-сервисы, фоновые и регламентные задания:

Клиентская часть: недоступно.

Серверная часть: Сервер, НаСервере.

Толстый клиент в управляемом режиме:

Клиентская часть: Сервер, НаСервере, Клиент, НаКлиенте, ТолстыйКлиентУправляемоеПриложение.

Серверная часть: Сервер, НаСервере, Клиент, НаКлиенте, ТолстыйКлиентУправляемоеПриложение.

Толстый клиент в обычном режиме:

Клиентская часть: Сервер, НаСервере, Клиент, НаКлиенте, ТолстыйКлиентОбычноеПриложение.

Серверная часть: Сервер, НаСервере, Клиент, НаКлиенте, ТолстыйКлиентОбычноеПриложение.

Клиент-серверный вариант:

Тонкий клиент:

Клиентская часть: Клиент, НаКлиенте, ТонкийКлиент.

Серверная часть: Сервер, НаСервере.

Веб-клиент:

Клиентская часть: Клиент, НаКлиенте, ВебКлиент.

Серверная часть: Сервер, НаСервере.

Мобильный клиент:

Клиентская часть: Клиент, НаКлиенте, МобильныйКлиент.

Серверная часть: Сервер, НаСервере.

Мобильный клиент с автономным режимом:

Клиентская часть: Клиент, НаКлиенте, МобильныйКлиент.

Серверная часть: Сервер, НаСервере.

Серверная часть на мобильном устройстве: Сервер, НаСервере, МобильныйАвтономныйСервер.

Внешнее соединение:

Клиентская часть: недоступно.

Серверная часть: ВнешнееСоединение.

Интернет-сервисы, фоновые и регламентные задания:

Клиентская часть: недоступно.

Серверная часть: Сервер, НаСервере.

Толстый клиент в управляемом режиме:

Клиентская часть: Клиент, НаКлиенте, ТолстыйКлиентУправляемоеПриложение.

Серверная часть: Сервер, НаСервере.

Толстый клиент в обычном режиме:

Клиентская часть: Клиент, НаКлиенте, ТолстыйКлиентОбычноеПриложение.

Серверная часть: Сервер, НаСервере.

Мобильная платформа:

Клиентская часть: Клиент, НаКлиенте, МобильноеПриложениеКлиент.

Серверная часть: Сервер, НаСервере, МобильноеПриложениеСервер.

Если используется неглобальный общий модуль, для которого установлено использование на клиенте (любом) и на сервере, то методы, заключенные в условие #Если Сервер Тогда #КонецЕсли, будут доступны только в том случае, если вызов этих методов выполняется со стороны сервера. Вызов таких методов со стороны клиента недоступен.
В остальных случаях инструкции Сервер и НаСервере полностью идентичны и инструкции Клиент и НаКлиенте также полностью идентичны.

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

Точечная модификация метода в расширении (с аннотацией &ИзменениеИКонтроль)

В текст расширяемого метода можно внести точечные изменения. Для этого метод должен быть скопирован в расширение с аннотацией &ИзменениеИКонтроль. С помощью инструкций #Вставка … #КонецВставки и #Удаление … #КонецУдаления отмечаются фрагменты текста, которые необходимо добавить в расширяемый модуль и, соответственно, удалить из него.

Методическая информация

Практические примеры

Препроцессор: отличить #Если от условия, которое проверяется при запуске

В собственном серверном модуле выбираем ветку компиляции, а затем выполняем обычный расчёт и обычное Если над числом.

Где и как запускать

Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.

Подготовка

  1. Используйте отдельную учебную базу без рабочих данных. Создайте серверный общий модуль УчебныйЯзык с флагом Сервер, без Привилегированный.

  2. Вставьте весь модуль выбранного примера, а не одну процедуру внутрь другой. Из своей серверной команды учебной обработки вызовите УчебныйЯзык.ВыполнитьПример().

  3. Все числа, строки и коллекции созданы в самом примере. Документы, регистры, файловая система и сеть не используются; никаких зависимостей от КА2/УНФ/УТ/БП нет.

  4. Браузер показывает код, но не исполняет BSL. Проверки результата нужно выполнить вручную на платформе 8.5.1.1343 в учебной базе.

Процедура ВыполнитьПример() Экспорт
    #Область УчебныйРасчёт
    #Если Сервер Тогда
    СредаКомпиляции = "Сервер";
    #Иначе
    СредаКомпиляции = "Другой контекст";
    #КонецЕсли
    Количество = 3;
    Сумма = Количество * 250;
    Если Количество > 0 Тогда
        Сообщить(Сумма = 750);
    Иначе
        ВызватьИсключение "Количество для учебного расчёта должно быть положительным";
    КонецЕсли;
    Сообщить(СредаКомпиляции = "Сервер");
    #КонецОбласти
КонецПроцедуры

Разбор по шагам

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

  2. При компиляции #Если выбирает доступную ветку исходного текста. Другой вариант присваивания не превращается в обычную проверку при каждом вызове.

  3. Символ # требуется перед Если, Иначе и КонецЕсли в блоке препроцессора. У обычной проверки количества таких символов нет.

  4. После выбора ветки обычные операторы задают количество, вычисляют сумму и проверяют положительность при выполнении.

  5. #Область и #КонецОбласти охватывают целый внутренний блок и не пересекаются с обычным Если. Область помогает сворачивать текст, но не задаёт новый контекст или переменную.

Как проверить результат

  1. В указанном серверном модуле две Истина: сумма 750 и выбранная среда Сервер.

  2. Измените количество на 5: выбранная среда остаётся Сервер, сумма становится 1250. Изменение данных при запуске не переключает #Если.

Ожидаемый результат

Препроцессор и обычное ветвление сопоставлены в одном полностью ограниченном учебном модуле.

На что обратить внимание

  1. Не пишите #Если Количество > 0: это не поддерживаемый символ препроцессора. Для переменных времени исполнения используется обычное Если.

  2. Не переносите без изменения пример на клиент и не ожидайте серверной ветки: настройки модуля и режим клиента определяют символы.

  3. #Область не создаёт изоляцию данных. Её границы не должны пересекать границы процедуры, функции или других группируемых блоков.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.