Перейти к содержанию

Использование инструкций препроцессора в клиент-серверных общих модулях

В стандарте 1С "Использование директив компиляции и инструкций препроцессора" на ИТС написано:

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

Процедуры и функции, которые работают по-разному при вызове с клиента и с сервера, следует размещать в общих модулях с постфиксами Клиент и Сервер, а не КлиентСервер.

В противном случае невозможно гарантировать корректную работу клиент-серверных процедур и функций в различных режимах работы платформы 1С:Предприятие.

Неправильно:

Функция КодОсновногоЯзыка() Экспорт
  #Если НЕ ТонкийКлиент И НЕ ВебКлиент Тогда
   Возврат Метаданные.ОсновнойЯзык.КодЯзыка;
  #Иначе
   Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента("КодОсновногоЯзыка");
  #КонецЕсли
  КонецФункции

также неправильно:

  Функция КодОсновногоЯзыка() Экспорт
  #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
   Возврат Метаданные.ОсновнойЯзык.КодЯзыка;
  #Иначе
   Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента("КодОсновногоЯзыка");
  #КонецЕсли
  КонецФункции
  ВыполняемыйАлгоритм();

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

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

В то же время, как и в обычных клиентских модулях, допустимо ветвление кода для учета специфики различных режимов работы клиентского приложения: веб-клиент, тонкий или толстый клиент (например, #Если ВебКлиент).

См. также

Экранирование кода

// sonar:UsingPreprocessorInstructionsInClientServerModules:off
// sonar:UsingPreprocessorInstructionsInClientServerModules:on