luckyea77 (luckyea77) wrote,
luckyea77
luckyea77

Category:

Инструкции препроцессора в 1С 8.3

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

Препроцессор обрабатывает исходный код на встроенном языке до его компиляции. Препроцессор может обрабатывать только инструкции препроцессора, которые начинаются с символа решетка «#». В результате работы препроцессора, какие-то куски кода могут отсутствовать в скомпилированном модуле.

С помощью инструкций препроцессора можно указать где именно будет выполняться код на встроенном языке: на сервере, на клиенте, в вебклиенте и т.д.

Например:

а = 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-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

Tags: #Если, #КонецЕсли, программирование
Subscribe

Posts from This Journal “программирование” Tag

promo luckyea77 ноябрь 4, 21:52 5
Buy for 10 tokens
В прошлом посте " Эпоха интеллекта" я публиковал эссе генерального директора OpenAI Сэма Альтмана. В нем Альтман пишет, что мы можем представить себе возможности создавать любое программное обеспечение, которое только можно представить, и многое другое. Недавно я с помощью нейросети создал…
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments