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

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

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

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

Например:

Процедура ПанельАдминистрированияБСП_ОбработкаОповещения(Форма, ИмяСобытия, Параметр, Источник) Экспорт
 
	Если НЕ ОблачныйАрхивКлиентПовтИсп.РазрешенаРаботаСОблачнымАрхивом() Тогда
		Возврат;
	КонецЕсли;
 
	#Если НЕ ВебКлиент Тогда
 
	Если ИмяСобытия = "ОблачныйАрхив:УстановленАгент" Тогда
		ПараметрыОкруженияСервер = ОблачныйАрхивВызовСервера.ПолучитьНастройкиОблачногоАрхива("ПараметрыОкруженияСервер");
		ИнформацияОКлиенте = ОблачныйАрхивВызовСервера.ПолучитьНастройкиОблачногоАрхива("ИнформацияОКлиенте", ИмяКомпьютера());
		АктивацииАгентовКопирования = ОблачныйАрхивВызовСервера.ПолучитьНастройкиОблачногоАрхива("АктивацииАгентовКопирования", ИмяКомпьютера());
		ПанельАдминистрированияБСП_ПереключитьНаПравильнуюСтраницу(
			Форма,
			Новый Структура("ПараметрыОкруженияСервер, ИнформацияОКлиенте, АктивацииАгентовКопирования",
				ПараметрыОкруженияСервер,
				ИнформацияОКлиенте,
				АктивацииАгентовКопирования));
	КонецЕсли;
 
	#КонецЕсли
 
КонецПроцедуры

Часть кода расположенная между #Если НЕ ВебКлиент Тогда и #КонецЕсли будет отсутствовать в данной процедуре при выполнении в веб клиенте 1С.

Еще пример:

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
	Если ИспользоватьРучныеСкидки И КэшированныеЗначения.ИспользоватьРучныеСкидкиВПродажах = Неопределено Тогда
		КэшированныеЗначения.ИспользоватьРучныеСкидкиВПродажах = ПолучитьФункциональнуюОпцию("ИспользоватьРучныеСкидкиВПродажах");
	КонецЕсли;
 
	Если ИспользоватьАвтоматическиеСкидки И КэшированныеЗначения.ИспользоватьАвтоматическиеСкидкиВПродажах = Неопределено Тогда
		КэшированныеЗначения.ИспользоватьАвтоматическиеСкидкиВПродажах = ПолучитьФункциональнуюОпцию("ИспользоватьАвтоматическиеСкидкиВПродажах");
	КонецЕсли;
#КонецЕсли

Данный кусок кода будет присутствовать в скомпилированном модуле только при выполнении на сервере, в режиме обычного приложения или при подключении через COM (внешнее соединение).

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

  1. Обработка исходного кода препроцессором
  2. Компиляция модуля во внутренний байт-код 1С
  3. Исполнение байт-кода на виртуальной машине 1С (интерпретация)

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

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

Возможные варианты инструкций препроцессора:

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

Клиент и НаКлиенте — одно и то же. Сервер и НаСервере — одно и то же.

Также есть инструкции для выделения областей в модуле и для директивы «Изменение и контроль» в расширениях. В данной статье они не будут рассмотрены.

Инструкции препроцессора и директивы компиляции

Сначала выполняются инструкции препроцессора, а уже потом определяются директивы компиляции. Например:

#Если НаСервере Тогда
&НаКлиенте
Процедура КлиентскаяПроцедурa()
КонецПроцедуры
#КонецЕсли

Данный кусок кода будет присутствовать в серверном модуле формы, но не будет скомпилирован. В клиентском модуле формы его даже не будет.

Исполнение процедур и функций

В файловой базе данных инструкции препроцессора будут игнорироваться, куски кода не будут вырезаны при компиляции.

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

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

В типовых конфигурациях можно часто встретить конструкцию:

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда 
... 
#КонецЕсли

в модулях объекта, модулях менеджера, в модулях набора записей, в модуле сеанса. Это нужно для того, чтобы не было ошибок при работе в режиме толстого клиента в управляемом приложении. Если в данных модулях будет обращение к серверным общим модулям (без флага Вызов сервера), то это вызовет ошибку компиляции.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями: