#std439

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

1.

Директивы компиляции:

  • &НаКлиенте (&AtClient);
  • &НаСервере (&AtServer);
  • &НаСервереБезКонтекста (&AtServerNoContext).

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

В серверных или клиентских общих модулях контекст выполнения очевиден, поэтому директивы компиляции там обычно не нужны. В модулях с признаками клиент/сервер директивы затрудняют понимание того, какие процедуры будут доступны фактически.

Проверки

#v8cs:form-module-pragma

2.

Не используйте проверки #Если Сервер / #Если Клиент внутри #std469: клиент-серверных общих модулей. Надежно определить контекст выполнения в таком варианте нельзя.

Если логика должна различаться между клиентом и сервером, размещайте ее в отдельных общих модулях с постфиксами Клиент и Сервер, а не в КлиентСервер.

Неправильно

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

Правильно

// ОбщийМодуль.ЛокализацияСервер
Функция КодОсновногоЯзыка() Экспорт
    Возврат ЛокализацияКлиентСервер.КодОсновногоЯзыкаСервер();
КонецФункции
// ОбщийМодуль.ЛокализацияКлиент
Функция КодОсновногоЯзыка() Экспорт
    Возврат ЛокализацияКлиентСервер.КодОсновногоЯзыкаКлиент();
КонецФункции

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

При этом в обычных клиентских модулях допустимо ветвление по режимам клиента (например, #Если ВебКлиент).

3.

Не разрывайте инструкциями препроцессора и областями:

  • грамматические конструкции;
  • выражения;
  • объявления процедур/функций;
  • места вызова процедур/функций.

Неправильно

Процедура Пример1()
  а = 1
#Область ИмяОбласти
    + 2;
#КонецОбласти // разрыв выражения
КонецПроцедуры
#Область ИмяОбласти
Процедура Пример2()
    // ...
#КонецОбласти // разрыв процедуры
КонецПроцедуры
Если <...> Тогда
    // ...
#Если ВебКлиент Тогда // разрыв блока Если
Иначе
    // ...
#КонецЕсли
КонецЕсли;
Результат = Пример4(Параметр1,
#Если Клиент Тогда
    Параметр2, // некорректный вызов функции
#КонецЕсли
    Параметр3);

Правильно

Процедура Пример1()
    а = 1 + 2;
КонецПроцедуры
#Область ИмяОбласти
Процедура Пример2()
    // ...
КонецПроцедуры
#КонецОбласти
Если <...> Тогда
    // ...
Иначе
#Если ВебКлиент Тогда
    // код для веб-клиента
#Иначе
    // код для остальных клиентов
#КонецЕсли
КонецЕсли;
#Если Клиент Тогда
    Параметр2 = ЗначениеДляКлиента;
#Иначе
    Параметр2 = ЗначениеПоУмолчанию;
#КонецЕсли

Результат = Пример4(Параметр1, Параметр2, Параметр3);

Эти ошибки автоматически диагностируются средой 1C:Enterprise Development Tools (EDT).

См. также
Проверки

#bslls:CompilationDirectiveNeedLess #bslls:ParseError

#acc:104 #acc:547

Источник

https://its.1c.ru/db/v8std#content:439