Содержание:
1. Директивы компиляции
2. Инструкции препроцессора 1С
3. При запуске клиент-сервера 1С 8.3
1. Директивы компиляции
Директива препроцессора — это специальный способ указать командой препроцессору 1С, где будет выполнен код 1С. В качестве примера можно привести тот факт, что нельзя выдать пользователю диалоговое сообщение на сервере – это будет работать только на клиенте.
Директива 1С определяется символом «&».
Допустимые директивы 1С:
· &НаКлиенте (&AtClient)
· &НаСервере (&AtServer)
· &НаСервереБезКонтекста (&AtServerNoContext)
· &НаКлиентеНаСервереБезКонтекста(&AtClientAtServerNoContext)
· &НаКлиентеНаСервере (&AtClientAtServer)
В директивах 1С БезКонтекста недоступны реквизиты формы 1С 8.3 и экспортные переменные формы 1С, но доступен вызов процедур и функций 1С из серверных общих модулей 1С 8.3. По умолчанию если перед процедурой (функцией) ничего не указано, то применяется директива 1С &НаСервере. Перед одной процедурой (функцией) нельзя применять одновременно несколько директив компиляции. Также недопустимо наличие процедур (функций) с одинаковым именем, отличающихся только директивами компиляции.
2. Инструкции препроцессора 1С
Инструкции препроцессора 1С применяются для группировки кода, указания разрешения использования процедур (функций) на сервере и клиенте, а также в расширении при изменении части кода. Инструкции выполняются раньше директив компиляции. Ими можно ограничить любую часть модуля, но рекомендуется ограничивать только части методов. Инструкции препроцессора 1С обозначается в коде символом»#».
Для возможности свертки кода и группировки строк 1С применяется инструкция препроцессора 1С #Область. Обязательно указание имени области и инструкция, заканчивающаяся конструкцией #КонецОбласти.
3. При запуске клиент-сервера 1С 8.3
При использовании клиент–сервера 1С 8.3 для запуска платформы 1С:Предприятие 8 есть возможность выполнять различные процедуры (функции) или их части на сервере приложения 1С или на клиенте.
Конструкции НаСервере/Сервер и НаКлиенте/Клиент имеют в таком случае одинаковое значеие.
В расширении
В расширении в директиве 1С &ИзменениеИКонтроль используется инструкция препроцессора 1С #Вставка и #Удаление, которая позволяет частично изменить(добавить новые фрагменты или удалить) код процедуры (функции). Инструкция #Вставка заканчивается текстом #КонецВставки¸ Инструкция #Удаление заканчивается текстом #КонецУдаления.
Специалист компании «Кодерлайн»
Владимир Карцев
Препроцессор
Препроцессор обрабатывает исходный код на встроенном языке до его компиляции. Препроцессор может обрабатывать только инструкции препроцессора, которые начинаются с символа решетка «#». В результате работы препроцессора, какие-то куски кода могут отсутствовать в скомпилированном модуле.
С помощью инструкций препроцессора можно указать где именно будет выполняться код на встроенном языке: на сервере, на клиенте, в вебклиенте и т.д.
Например:
а = 1; б = 2; #Если ВебКлиент Тогда Сообщить("Вы работаете через веб-клиент!"); #КонецЕсли в = 3;
Часть кода расположенная между #Если ВебКлиент Тогда и #КонецЕсли будет отсутствовать в данной процедуре при выполнении не в веб клиенте 1С.
Еще пример:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда а = 1; б = 2; в = 3; #КонецЕсли
Данный кусок кода будет присутствовать в скомпилированном модуле только при выполнении на сервере, в режиме обычного приложения или при подключении через COM (внешнее соединение).
У каждой инструкции препроцессора обязательно должен быть завершающий оператор #КонецЕсли. Если его не указать, то будет ошибка компиляции «Ожидается завершение оператора препроцессора Если (If)»:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда а = 1; б = 2; в = 3; //модуль не будет скомпилирован!!!
Процесс выполнения кода на встроенном языке 1с:
1. Обработка исходного кода препроцессором
2. Компиляция модуля во внутренний байт-код 1С
3. Исполнение байт-кода на виртуальной машине 1С (интерпретация)
При этом один и тот же модуль может быть скомпилирован как на сервере, так и на клиенте. С помощью инструкций препроцессора можно указать должен ли присутствовать в скомпилированном модуле тот или кусок кода.
Инструкции препроцессора
Возможные варианты инструкций препроцессора:
— Клиент
— НаКлиенте
— НаСервере
— Сервер
— ТонкийКлиент
— ВебКлиент
— МобильныйАвтономныйСервер
— МобильноеПриложениеКлиент
— МобильноеПриложениеСервер
— МобильныйКлиент
— ТолстыйКлиентОбычноеПриложение
— ТолстыйКлиентУправляемоеПриложение
— ВнешнееСоединение
Клиент и НаКлиенте — одно и то же. Сервер и НаСервере — одно и то же.
Также есть инструкции для выделения областей в модуле и для директивы «Изменение и контроль» в расширениях. В данной статье они не будут рассмотрены.
Инструкции препроцессора и директивы компиляции
Директивы компиляции используются в модулях форм и команд. Они определяют где будет скомпилирована процедура: на клиенте или на сервере. Директивы компиляции начинаются с символа &.
Сначала выполняются инструкции препроцессора, а уже потом определяются директивы компиляции. Например:
#Если НаСервере Тогда &НаКлиенте Процедура КлиентскаяПроцедурa() КонецПроцедуры #КонецЕсли
Данный кусок кода будет присутствовать в серверном модуле формы, но не будет скомпилирован. В клиентском модуле формы его даже не будет.
Часто инструкции препроцессора по ошибке называют директивы препроцессора. Но правильно все-таки инструкции препроцессора.
Исполнение процедур и функций
В файловой базе данных инструкции препроцессора будут игнорироваться, куски кода не будут вырезаны при компиляции.
В клиент-серверном варианте экземпляры общих модулей создаются как на сервере, так и на клиенте. Если в модуле есть #Если Сервер Тогда … #КонецЕсли, то кусок кода между ними будет только на сервере. Если обратиться к процедуре в этом куске кода на клиенте, то вызов будет перенаправлен на сервер, потому что на клиенте не будет этой процедуры. Если между #Если Сервер Тогда … #КонецЕсли находится только часть процедуры, то она будет присутствовать только на сервере, и тогда вызов этой процедуры на сервере будет отличаться от вызова на клиенте.
Если в модуле есть #Если ТонкийКлиент (или толстый) Тогда … #КонецЕсли, то этот кусок будет только на клиенте. Если там была процедура, то к ней нельзя будет обращаться на сервере, потому что нельзя с сервера вызывать клиента.
В типовых конфигурациях можно часто встретить конструкцию:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда ... #КонецЕсли
В модулях объекта, модулях менеджера, в модулях набора записей, в модуле сеанса. Это нужно для того, чтобы не было ошибок при работе в режиме толстого клиента в управляемом приложении. Если в данных модулях будет обращение к серверным общим модулям (без флага Вызов сервера), то это вызовет ошибку компиляции.
Смотрите также:
Электронный учебник по по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Программное решение для сдачи и подготовки к экзаменам
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки
- Раздел
- Общее описание встроенного языка
Инструкции препроцессора
Для указания разрешения использования процедур и функций общих модулей и модулей объектов используют инструкции препроцессора.
Синтаксис:
#Если <Логическое выражение> Тогда
#ИначеЕсли <Логическое выражение> Тогда
…
#Иначе
#КонецЕсли
где:
<Логическое выражение> = [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора>]…]
<Символ препроцессора> = {НаКлиенте | НаСервере | ТолстыйКлиентОбычноеПриложение | ТолстыйКлиентУправляемоеПриложение | Клиент | Сервер | ВнешнееСоединение }
<Булева операция> = {И | ИЛИ}
Используемые термы:
#Если (#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), которые определены в соответствующих приложениях.
Для выполнения на клиенте:
#Если ТолстыйКлиентОбычноеПриложение Тогда
…
#КонецЕсли
#Если ТолстыйКлиентУправляемоеПриложение Тогда
…
#КонецЕсли
Для выполнения на тонком клиенте:
#Если ТонкийКлиент Тогда
…
#КонецЕсли
Для выполнения на веб-клиенте:
#Если ВебКлиент Тогда
…
#КонецЕсли
В файл–серверном варианте
В обычном клиенте в обычном и управляемом режиме доступны НаКлиенте, Клиент, ТолстыйКлиентОбычноеПриложение, ТолстыйКлиентУправляемоеПриложение , НаСервере, Сервер.
В файловом варианте инструкции препроцессора #Если Сервер…, #Если Клиент…, #Если ТолстыйКлиентОбычноеПриложение или #Если ТолстыйКлиентУправляемоеПриложение… определены всегда, поэтому экземпляр кода будет присутствовать всегда.
В тонком клиенте доступны – ТонкийКлиент, НаКлиенте, Клиент.
На серверной части тонкого клиента – Сервер, НаСервере.
Во внешнем соединении – ВнешнееСоединение, НаСервере, Сервер.
В сессии СОМ-соединения
Для включения возможности использования процедур и функций в сессии внешнего соединения применяется инструкция препроцессора ВнешнееСоединение.
#Если ВнешнееСоединение Тогда
…
#КонецЕсли
Особенности использования инструкций препроцессора совместно с директивами компиляции см. в главе «Директивы компиляции».
В мобильном приложении (клиент)
Для включения возможности использования процедур и функций в мобильном приложении на стороне клиента применяется инструкция препроцессора МобильноеПриложениеКлиент. Директива действует независимо от Клиент, то есть код одновременно и Клиент и МобильноеПриложениеКлиент.
#Если МобильноеПриложениеКлиент Тогда
…
#КонецЕсли
В мобильном приложении (сервер)
Для включения возможности использования процедур и функций в мобильном приложении на стороне сервера применяется инструкция препроцессора МобильноеПриложениеСервер. Директива действует независимо от Сервер, то есть код одновременно и Сервер и МобильноеПриложениеСервер.
#Если МобильноеПриложениеСервер Тогда
…
#КонецЕсли
Эти конструкции предназначены для явного указания того, где должен выполняться программный код. Для этого во встроенном языке 1с существуют специальные конструкции.
Директивы компиляции
Это новшество реализовано только в управляемом приложении. Использование директив в обычном приложении недоступно. В обычном приложении нет разделения программирования для клиента и сервера. В управляемом приложении перед функциями, процедурами и глобальными переменными можно явно указать где выполнять код (на сервере или на клиенте).
&НаКлиенте — определяет клиентскую процедуру (функцию).
&НаСервере — определяет серверную процедуру (функцию) с контекстом.
&НаСервереБезКонтекста — определяет серверную процедуру (функцию) без контекста.
&НаКлиентеНаСервереБезКонтекста — определяет процедуру (функцию), исполняемую в модуле формы на клиенте и на сервере.
&НаКлиентеНаСервере — определяет процедуру (функцию), исполняемую в модуле команды, выполняемую на клиенте и на сервере.
Без контекста — это означает без доступа к данным формы.
Инструкции препроцессора
Инструкции могут задаваться для процедур (функций) целиком или для отдельных участков программного кода.
Русский | Английский |
---|---|
#Если | #If |
#Тогда | #Then |
#ИначеЕсли | #ElsIf |
#Иначе | #Else |
#КонецЕсли | #EndIf |
#Область | #Region |
#КонецОбласти | #EndRegion |
Клиент (для совместимости) | Client |
НаКлиенте | AtClient |
Сервер (для совместимости) | Server |
НаСервере | AtServer |
МобильноеПриложениеКлиент | MobileAppClient |
МобильноеПриложениеСервер | MobileAppServer |
ТолстыйКлиентОбычноеПриложение | ThickClientOrdinaryApplication |
ТолстыйКлиентУправляемоеПриложение | ThickClientManagedApplication |
ВнешнееСоединение | ExternalConnection |
ТонкийКлиент | ThinClient |
ВебКлиент | WebClient |
И | AND |
ИЛИ | OR |
НЕ | NOT |
Примеры
#Если НаСервере Тогда
#КонецЕсли
#Если НаКлиенте Тогда
#КонецЕсли
#Область [<Имя области>]
#КонецОбласти
Инструкции препроцессору
Синтаксис инструкций препроцессору
#Если <Логическое выражение> Тогда
#ИначеЕсли <Логическое выражение> Тогда
…
#Иначе
#КонецЕсли
где:
<Логическое выражение> = [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора>]…]
<Символ препроцессора> = {НаКлиенте | НаСервере | ТолстыйКлиентОбычноеПриложение | ТолстыйКлиентУправляемоеПриложение | Клиент | Сервер | ВнешнееСоединение }
<Булева операция> = {И | ИЛИ}
Процесс компиляции и исполнения программного кода проходит в 1С в несколько стадий. Препроцессор вырезает все «лишнее» из процедуры (для данного контекста), и передает на компиляцию, компилятор производит компиляцию в машинный код, интерпретатор получает машинный код и исполняет его. Некоторые куски кода могут быть намерено объявлены программистом как «лишние» для сервера. Таким образом один и тот же модуль может быть выполнен в двух разных вариантах, например при исполнении на клиенте он будет содержать блок интерактивного взаимодействия с пользователем, а при исполнении на сервере нет, в этом нет никакого смысла, более того модуль может быть завершен с ошибкой исполнения из-за недоступности интерактивного метода на сервере.
- Препроцессор — специальная программа, которая перерабатывает программный код из «вида» удобного для работы программиста, в «вид», удобный для работы копилятора;
- Компилятор — специальная программа, которая умеет перерабатывать программный код в «машинный» код — выполняемый непосредственно процессором компьютера;
- Интерпретатор — специальная программа, которая вместо компилирования кода в машинный код для процессора, выполняет его самостоятельно. Интерпретатор с предварительной компиляцией — компилирует программу не в машинный код, а в специальный «байт-код» удобный для последующего выполнения интерпретатором.
О том как код написанный программистом превращается в байт код интересно описано в статьте на хабре https://habr.com/ru/post/489392/
Рассмотрим конкретный пример. Например у нас запущена конфигурация в режиме толстого клиента (без управляемых форм). В модуле объекта мы сделали предупреждение о нехватке остатка на складе (не стоит так делать в реальных базах).
Как видим на рисунке все работает и выполняется. Но проблема в том, что если данный документ будет проводится какой-то регламентной работой, которая будет выполняться на сервере 1С:Предприятие, то модуль просто не будет скомпилирован. Создадим новый общий модуль и выставим у него «Сервер» и «Вызов сервера»:
В модуле попытаемся создать документ с превышением остатка:
Процедура СоздатьИПровестиДокумент() Экспорт
ДокОбъект = Документы.РеализацияТоваров.СоздатьДокумент();
ДокОбъект.Дата = ТекущаяДата();
НоваяСтрока = ДокОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Сапоги");
НоваяСтрока.Количество = 30;
НоваяСтрока.Цена = 1;
НоваяСтрока.Сумма = 30;
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
Затем в какой нибудь обработке вызовем эту экспортную процедуру, в файловом режиме ошибки не будет и все выполняется как обычно (следствие того что сервер эмулируется платформой, в этом же приложении), но как только мы запустим базу в клиент-серверном варианте, то увидим следующее
В контексте серверного модуля прекрасно создается документ, но метод предупреждение не работает. Идем в справку для метода «Предупреждение» (ctrl-F1), нас интересует в справке раздел «доступность». В разделе доступность нет слова «Сервер», значит этот метод в серверных модулях не может быть использован, модуль попросту не скомпилируется.
Как поступить если необходимо часть модуля выполнять только там где он доступен, а остальной код трогать не хочется? Надо использовать инструкции препроцессору, т.е. объяснить программе что кусочек кода должен присутствовать\исполняться только тогда когда он может быть выполнен.
Переделаем наш пример с инструкцией препроцессору:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Для каждого СтрокаТовары Из Товары Цикл
Остаток = ПолучитьОстаток(СтрокаТовары.Номенклатура);
Если Остаток < СтрокаТовары.Количество Тогда
//после # идет инструкция, код внутри Если...КонецЕсли не будет включен в модуль в случае серверного выполнения
#Если Клиент Тогда
Предупреждение("Нет остатка");
#КонецЕсли
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Пример использования в типовой конфигурации (см.ниже), кусок выдернут из общего модуля, у модуля установлены флажки «сервер» и «клиент», т.е. модуль одновременно будет скомпилирован и в клиентском приложении и сервером 1с. Вопрос же задается только если шапка нового документа заполняется «на клиенте», или по-другому кусок кода будет присутствовать в модуле, только в случае когда этот же общий модуль будет воспроизводиться на клиенте.
Процедура ЗаполнитьШапкуДокумента(ДокументОбъект, ТекПользователь, ВалютаРегламентированногоУчета = Неопределено, ТипОперации = "", ПараметрОбъектКопирования = Неопределено, ПараметрОснование = неопределено, СтруктураПараметровДляПолученияДоговора = Неопределено) Экспорт
МетаданныеДокумента = ДокументОбъект.Метаданные();
Если ОбщегоНазначения.ЕстьРеквизитДокумента("Ответственный", МетаданныеДокумента) Тогда
ДокументОбъект.Ответственный = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ТекПользователь, "ОсновнойОтветственный");
КонецЕсли;
#Если Клиент Тогда
Если ПараметрОбъектКопирования <> Неопределено
И ОбщегоНазначения.ЕстьРеквизитДокумента("КурсВзаиморасчетов", МетаданныеДокумента) Тогда
СтруктураКурсаДокумента = МодульВалютногоУчета.ПолучитьКурсВалюты(ДокументОбъект.ВалютаДокумента, ДокументОбъект.Дата);
Если СтруктураКурсаДокумента.Курс <> ДокументОбъект.КурсВзаиморасчетов
Или СтруктураКурсаДокумента.Кратность <> ДокументОбъект.КратностьВзаиморасчетов Тогда
Ответ = Вопрос("Курс валюты изменился. Поменять курс в документе?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
ДокументОбъект.КурсВзаиморасчетов = СтруктураКурсаДокумента.Курс;
Если ОбщегоНазначения.ЕстьРеквизитДокумента("КратностьВзаиморасчетов", МетаданныеДокумента) Тогда
ДокументОбъект.КратностьВзаиморасчетов = СтруктураКурсаДокумента.Кратность;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
#КонецЕсли
Инструкции могут включать целиком процедуру или несколько процедур
Используемые термы (ключевые слова):
#Если (#If)
#Тогда (#Then)
#ИначеЕсли (#ElsIf)
#Иначе (#Else)
#КонецЕсли (#EndIf)
#Область (#Region)
#КонецОбласти (#EndRegion)
#Вставка (#Insert)
#КонецВставки (#EndInsert)
#Удаление (#Delete)
#КонецУдаления (#EndDelete)
Клиент (Client)
НаКлиенте (AtClient)
НаСервере (AtServer)
МобильноеПриложениеКлиент (MobileAppClient)
МобильноеПриложениеСервер (MobileAppServer)
МобильныйКлиент (MobileClient)
ТолстыйКлиентОбычноеПриложение(ThickClientOrdinaryApplication)
ТолстыйКлиентУправляемоеПриложение (ThickClientManagedApplication)
Сервер (Server)
ВнешнееСоединение (ExternalConnection)
ТонкийКлиент (ThinClient)
ВебКлиент (WebClient)
И (AND)
ИЛИ (OR)
НЕ (NOT)
Директивы комплиляции
Директивы появились вместе с управляемыми формами. Дело в том что при создании управляемой формы модуль формы компилируется одновременно и на сервере и на клиенте, но в клиентском варианте не будут присутствовать процедуры перед которыми отсутствует ключевое слово «..Клиенте..», для серверной копии модуля аналогично.
- &НаКлиенте — определяет клиентскую процедуру (функцию).
- &НаСервере — определяет серверную процедуру (функцию) с контекстом.
- &НаСервереБезКонтекста — определяет серверную процедуру (функцию) без контекста.
- &НаКлиентеНаСервереБезКонтекста — определяет процедуру (функцию), исполняемую в модуле формы на клиенте и на сервере.
- &НаКлиентеНаСервере — определяет процедуру (функцию), исполняемую в модуле команды, выполняемую на клиенте и на сервере.
Без контекста — это означает без доступа к данным формы.
Директивы &НаКлиенте и подобные принципиально отличаются от инструкций препроцессору. Инструкция, как правило, просто вырезает кусок кода перед тем как он будет передан на компиляцию, а с директивой программа точно знает что такая функция все же есть, но будет выполнена на стороне сервера\клиента.
Примеры использования директив, с этим сложностей нет, в любой управляемой форме, любая процедура снабжена этой директивой. Если директиву не указать то будет считаться что она будет присутствовать на сервере, но во избежании путаницы лучше всегда явно указать где, НаКлиенте или НаСервере, будет скомпилирована функция.
Совместное использование инструкций и директив
Ошибки использования директив компилятору
Излишне частое и неоправданное выполнение контекстных вызовов &НаСервере
В любом деле, а особенно в таком интеллектуальном как программирование, надо шевелить извилинами. Не стоит бездумно использовать директивы &НаСервере, если есть возможность использования &НаСервереБезКонтекста. Визуально может показаться что работают они одинаково хорошо, но между ними большая разница.
Процесс исполнения серверного вызова выглядит примерно следующим образом: форма упаковывается в контейнер (!), переправляется по каналу tcp\ip на сервер, распаковывается сервером, выполняется код целевой процедуры, форма запаковывается обратно в контейнер, передается на клиент, распаковывается клиентом, отображается на экране.
Сразу становится понятным что такие вещи стоит делать как можно реже, и уж точно не в цикле! В случае с «..БезКонтекста» платформа выполняет код «налегке», т.е. на сервер передаются только параметры функции, а обратно прилетает только результат выполнения.
Использование &НаСервере вместо &НаКлиенте
Иногда программист помещает весь код в процедуру «на сервере» хотя код может быть выполнен на клиенте. Если ведется работа с простыми типами (доступными на клиенте), намного лучше весь код выполнить на клиенте. Если необходимо что-то получить с сервера, создать дополнительную функцию «на сервере без контекста» для получения данных, которые невозможно получить в текущей клиентской функции.
You have no rights to post comments
Chesnok
03.12.19
✎
16:52
Доброго дня.
Если не сложно, объясните зачем модуль менеджера документа заключен в команды:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
…
#КонецЕсли
Т.е. если будет соединение через тонкий клиент, то, например, команды печати, которые есть в этом менеджере, работать не будут?
Зачем это надо?
RomanYS
03.12.19
✎
16:55
(0) модуль менеджера на клиенте в УП недоступен, поэтому будет «Сервер».
А вот что такая конструкция исключает пока не соображу
Chesnok
03.12.19
✎
17:00
(1) «модуль менеджера на клиенте в УП недоступен» — т.е. печать форм данного документа, при подключении через ТК, не будет работать?
и что значит: поэтому будет «Сервер»?
RomanYS
03.12.19
✎
17:01
(2) будет работать через сервер
RomanYS
03.12.19
✎
17:02
возможно проблемы будут при ТолстыйКлиентУправляемоеПриложение, но это не точно
Chesnok
03.12.19
✎
17:07
(3) Модуль менеджера будет недоступен, но работать будет. Если не сложно, объясните подробнее.
RomanYS
03.12.19
✎
17:10
(5) по такому вопросу сложно понять, откуда надо начинать объяснять).
В тонком клиенте модуль менеджера доступен только на сервере.
Chesnok
03.12.19
✎
17:14
(6) Т.е. все его процедуры вызываются из серверных методов?
RomanYS
03.12.19
✎
17:16
(7) В тонком клиенте — ДА.
Конструкция Справочники.КакойтоСправочник на клиенте вызовет ошибку.
D_E_S_131
03.12.19
✎
17:24
ОбработкаПолученияФормы() на клиенте отрабатывает, для этого и нужна конструкция препроцессору. Чтобы всякие «запросы» для формирования печ.форм не приводили к ошибке на клиенте.
RomanYS
03.12.19
✎
17:26
(9) Это бы объяснило «зачем», но СП говорит
«Описание:
Обработчик события вызывается на сервере при получении стандартной управляемой формы.»
Cyberhawk
03.12.19
✎
17:28
Такое обрамление нужно, чтобы код не пытался скомпилироваться в толстом клиенте УП
Timon1405
03.12.19
✎
17:30
Franchiser
03.12.19
✎
17:31
Если запустишь, например, Толстый клиент Обычное приложение то вероятно будет ошибка.
Для него код и не компилируется.
Cyberhawk
03.12.19
✎
17:34
(13) Не тупи — для обычного приложения как раз компилируется
RomanYS
03.12.19
✎
17:34
(13) почему?
«Или ТолстыйКлиентОбычноеПриложение»
Franchiser
03.12.19
✎
17:38
(14) верно
Franchiser
03.12.19
✎
17:39
(15) не знаю, нужно код смотреть почему так написано.
Franchiser
03.12.19
✎
17:41
Скорее всего это все пишут в 1с по шаблону, даже если и инстуркции препроцессора в данном модуле не являются обязательными.
RomanYS
03.12.19
✎
17:42
(18) ответ в (12). Но логика какая-то «ускользающая»))
Cyberhawk
03.12.19
✎
17:45
(4) (19) Сразу видно, не работаешь с ИР в виде расширения
Жан Пердежон
03.12.19
✎
17:46
(19) ускользает в прошлое вместе с толстым клиентом
Nikifforoff96
03.12.19
✎
17:49
(1) Исключает МобильноеПриложениеСервер
Franchiser
03.12.19
✎
17:52
(19) возможно используют EDT, которая контролирует корректность использования конструкций препроцессора.
RomanYS
03.12.19
✎
17:58
(20) С ИР не работаю. В (4) практически угадал.
(23) Это домыслы.
Chesnok
03.12.19
✎
18:05
Всем спасибо.
Сияющий в темноте
03.12.19
✎
19:20
модуль менеддера доступен в толстом клиенте на клиенте,но не все функции там доступны,и чтобы исключить ошибки компилляции ставится такая загородка.
на самом деле,там должно стоять,еслм сервер,но для внешнего соединения нужна отдельная директива,а также ыацловый вариант обычного приложения вообще все выполняет на клиенте.