Синтаксис и применение Препроцессор в платформе 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С:Предприятие".
В различных вариантах использования определены различные наборы инструкций препроцессора:
Файловый вариант:
Тонкий клиент:
Клиентская часть: Клиент, НаКлиенте, ТонкийКлиент.
Серверная часть: Сервер, НаСервере.
Веб-клиент:
Клиентская часть: Клиент, НаКлиенте, ВебКлиент.
Серверная часть: Сервер, НаСервере.
Внешнее соединение:
Клиентская часть: недоступно,
Серверная часть: Сервер, НаСервере,ВнешнееСоединение.
Интернет-сервисы, фоновые и регламентные задания:
Клиентская часть: недоступно.
Серверная часть: Сервер, НаСервере.
Толстый клиент в управляемом режиме:
Клиентская часть: Сервер, НаСервере, Клиент, НаКлиенте, ТолстыйКлиентУправляемоеПриложение.
Серверная часть: Сервер, НаСервере, Клиент, НаКлиенте, ТолстыйКлиентУправляемоеПриложение.
Толстый клиент в обычном режиме:
Клиентская часть: Сервер, НаСервере, Клиент, НаКлиенте, ТолстыйКлиентОбычноеПриложение.
Серверная часть: Сервер, НаСервере, Клиент, НаКлиенте, ТолстыйКлиентОбычноеПриложение.
Клиент-серверный вариант:
Тонкий клиент:
Клиентская часть: Клиент, НаКлиенте, ТонкийКлиент.
Серверная часть: Сервер, НаСервере.
Веб-клиент:
Клиентская часть: Клиент, НаКлиенте, ВебКлиент.
Серверная часть: Сервер, НаСервере.
Мобильный клиент:
Клиентская часть: Клиент, НаКлиенте, МобильныйКлиент.
Серверная часть: Сервер, НаСервере.
Мобильный клиент с автономным режимом:
Клиентская часть: Клиент, НаКлиенте, МобильныйКлиент.
Серверная часть: Сервер, НаСервере.
Серверная часть на мобильном устройстве: Сервер, НаСервере, МобильныйАвтономныйСервер.
Внешнее соединение:
Клиентская часть: недоступно.
Серверная часть: ВнешнееСоединение.
Интернет-сервисы, фоновые и регламентные задания:
Клиентская часть: недоступно.
Серверная часть: Сервер, НаСервере.
Толстый клиент в управляемом режиме:
Клиентская часть: Клиент, НаКлиенте, ТолстыйКлиентУправляемоеПриложение.
Серверная часть: Сервер, НаСервере.
Толстый клиент в обычном режиме:
Клиентская часть: Клиент, НаКлиенте, ТолстыйКлиентОбычноеПриложение.
Серверная часть: Сервер, НаСервере.
Мобильная платформа:
Клиентская часть: Клиент, НаКлиенте, МобильноеПриложениеКлиент.
Серверная часть: Сервер, НаСервере, МобильноеПриложениеСервер.
Если используется неглобальный общий модуль, для которого установлено использование на клиенте (любом) и на сервере, то методы, заключенные в условие #Если Сервер Тогда #КонецЕсли, будут доступны только в том случае, если вызов этих методов выполняется со стороны сервера. Вызов таких методов со стороны клиента недоступен.
В остальных случаях инструкции Сервер и НаСервере полностью идентичны и инструкции Клиент и НаКлиенте также полностью идентичны.
Особенности использования инструкций препроцессора совместно с директивами компиляции см в главе "Директивы компиляции".
Точечная модификация метода в расширении (с аннотацией &ИзменениеИКонтроль)
В текст расширяемого метода можно внести точечные изменения. Для этого метод должен быть скопирован в расширение с аннотацией &ИзменениеИКонтроль. С помощью инструкций #Вставка … #КонецВставки и #Удаление … #КонецУдаления отмечаются фрагменты текста, которые необходимо добавить в расширяемый модуль и, соответственно, удалить из него.
Методическая информация
Практические примеры
Препроцессор: отличить #Если от условия, которое проверяется при запуске
В собственном серверном модуле выбираем ветку компиляции, а затем выполняем обычный расчёт и обычное Если над числом.
Где и как запускать
Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.
Подготовка
Используйте отдельную учебную базу без рабочих данных. Создайте серверный общий модуль УчебныйЯзык с флагом Сервер, без Привилегированный.
Вставьте весь модуль выбранного примера, а не одну процедуру внутрь другой. Из своей серверной команды учебной обработки вызовите УчебныйЯзык.ВыполнитьПример().
Все числа, строки и коллекции созданы в самом примере. Документы, регистры, файловая система и сеть не используются; никаких зависимостей от КА2/УНФ/УТ/БП нет.
Браузер показывает код, но не исполняет BSL. Проверки результата нужно выполнить вручную на платформе 8.5.1.1343 в учебной базе.
Процедура ВыполнитьПример() Экспорт
#Область УчебныйРасчёт
#Если Сервер Тогда
СредаКомпиляции = "Сервер";
#Иначе
СредаКомпиляции = "Другой контекст";
#КонецЕсли
Количество = 3;
Сумма = Количество * 250;
Если Количество > 0 Тогда
Сообщить(Сумма = 750);
Иначе
ВызватьИсключение "Количество для учебного расчёта должно быть положительным";
КонецЕсли;
Сообщить(СредаКомпиляции = "Сервер");
#КонецОбласти
КонецПроцедурыРазбор по шагам
Использовать именно серверный общий модуль из подготовки. Символ Сервер — символ препроцессора, не переменная с числом или строкой.
При компиляции #Если выбирает доступную ветку исходного текста. Другой вариант присваивания не превращается в обычную проверку при каждом вызове.
Символ # требуется перед Если, Иначе и КонецЕсли в блоке препроцессора. У обычной проверки количества таких символов нет.
После выбора ветки обычные операторы задают количество, вычисляют сумму и проверяют положительность при выполнении.
#Область и #КонецОбласти охватывают целый внутренний блок и не пересекаются с обычным Если. Область помогает сворачивать текст, но не задаёт новый контекст или переменную.
Как проверить результат
В указанном серверном модуле две Истина: сумма 750 и выбранная среда Сервер.
Измените количество на 5: выбранная среда остаётся Сервер, сумма становится 1250. Изменение данных при запуске не переключает #Если.
Ожидаемый результат
Препроцессор и обычное ветвление сопоставлены в одном полностью ограниченном учебном модуле.
На что обратить внимание
Не пишите #Если Количество > 0: это не поддерживаемый символ препроцессора. Для переменных времени исполнения используется обычное Если.
Не переносите без изменения пример на клиент и не ожидайте серверной ветки: настройки модуля и режим клиента определяют символы.
#Область не создаёт изоляцию данных. Её границы не должны пересекать границы процедуры, функции или других группируемых блоков.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.