Открыть сервис

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

Директива компиляции — это специальная инструкция, встроенная в исходный текст программы на языке встроенного языка платформы «1С:Предприятие», которая указывает транслятору (компилятору) на необходимость включения или исключения определённого фрагмента кода из результирующего исполняемого модуля. Директивы компиляции позволяют создавать универсальные конфигурации, работающие в различных режимах (управляемое приложение, обычное приложение, внешнее соединение) и на разных версиях платформы, без необходимости поддержки нескольких отдельных версий кода.

История и предпосылки появления

Появление директив компиляции в платформе «1С:Предприятие» связано с переходом на версию 8.0 и последующим развитием архитектуры. В версии 8.1 и 8.2 платформа стала поддерживать несколько режимов работы клиентского приложения: толстый клиент, тонкий клиент, веб-клиент, а также режим внешнего соединения. Каждый из этих режимов имеет разный набор доступных типов данных, объектов метаданных и методов глобального контекста. Выполнение кода, предназначенного для другого режима, приводило к ошибке времени выполнения. Для решения этой проблемы были введены директивы компиляции, позволяющие компилятору отсекать неподходящий код на этапе трансляции.

Виды директив компиляции

В платформе «1С:Предприятие» (версии 8.3 и выше) используются следующие основные директивы компиляции:

Директивы контекста выполнения

Эти директивы определяют, в каком контексте (клиентском или серверном) должен выполняться код. Они ставятся перед объявлением процедуры или функции.

  • &НаКлиенте — код выполняется на стороне клиентского приложения. Доступны все клиентские объекты и методы, но недоступны серверные вызовы без специального механизма.
  • &НаСервере — код выполняется на стороне сервера «1С:Предприятие». Доступны серверные объекты метаданных, работа с базой данных, но недоступны клиентские интерфейсные элементы.
  • &НаСервереБезКонтекста — код выполняется на сервере, но при этом не имеет доступа к контексту формы (например, к реквизитам формы). Используется для повышения производительности и безопасности при вызове серверных методов из клиента.
  • &НаКлиентеНаСервереБезКонтекста — комбинированная директива, позволяющая выполнять процедуру или функцию как на клиенте, так и на сервере без контекста. Используется для универсальных вычислительных функций.

Директивы режима совместимости

Эти директивы позволяют включать или исключать код в зависимости от версии платформы, для которой компилируется конфигурация. Они ставятся в начале строки кода (перед оператором).

  • #Если <Условие> Тогда — открывает блок условной компиляции.
  • #ИначеЕсли <Условие> Тогда — задаёт альтернативное условие.
  • #Иначе — блок, выполняемый, если ни одно из условий не истинно.
  • #КонецЕсли — завершает блок условной компиляции.

В качестве условия могут использоваться предопределённые макросы, такие как ВерсияПлатформы, РежимИсполнения, ТипПлатформы, а также пользовательские макросы, определённые в конфигурации.

Примеры использования

Пример 1: Разделение клиентского и серверного кода

``` &НаКлиенте Процедура ОбработатьНажатиеКнопки(Команда) // Клиентский код, работающий с формой Сообщить("Кнопка нажата на клиенте"); КонецПроцедуры

&НаСервере Процедура ПолучитьДанныеИзБазы() // Серверный код, выполняющий запрос к базе данных Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник.Номенклатура"; Результат = Запрос.Выполнить(); КонецПроцедуры ```

Пример 2: Условная компиляция для разных версий платформы

```

Если ВерсияПлатформы >= "8.3.10" Тогда

// Использовать новый метод, доступный только с версии 8.3.10 Результат = Новый Структура("Ключ", Значение);

Иначе

// Использовать старый метод для более ранних версий Результат = Новый Структура; Результат.Вставить("Ключ", Значение);

КонецЕсли

```

Синтаксис и правила использования

  • Директивы контекста выполнения (&НаКлиенте, &НаСервере и т.д.) ставятся непосредственно перед объявлением процедуры или функции. Между директивой и объявлением не должно быть других операторов.
  • Директивы условной компиляции (#Если, #Иначе, #КонецЕсли) ставятся в начале строки и могут быть вложенными.
  • Директивы компиляции обрабатываются на этапе компиляции модуля, а не во время выполнения. Это означает, что код, исключённый директивой, не попадает в результирующий исполняемый файл и не занимает память.
  • Неправильное использование директив (например, попытка обратиться к серверному объекту в клиентском коде без соответствующей директивы) приводит к ошибке компиляции.

Применение и значение

Директивы компиляции являются ключевым инструментом для разработки кроссплатформенных и многовариантных конфигураций. Они позволяют:

  • Создавать универсальные модули — один и тот же исходный код может быть скомпилирован для разных режимов работы (управляемое приложение, обычное приложение, внешнее соединение) без дублирования.
  • Поддерживать обратную совместимость — конфигурация может быть развёрнута на разных версиях платформы, при этом код, использующий новые возможности, будет выполняться только на подходящих версиях.
  • Повышать производительность — исключение неиспользуемого кода уменьшает размер исполняемого модуля и сокращает время его загрузки.
  • Упрощать отладку — разработчик может явно указать контекст выполнения для каждой процедуры, что снижает риск ошибок, связанных с неправильным доступом к объектам.

Ограничения и особенности

  • Директивы контекста выполнения не могут быть использованы для глобальных переменных модуля — только для процедур и функций.
  • Условная компиляция (#Если) не поддерживает сложные логические выражения с операциями И, ИЛИ, НЕ — только сравнение строк и чисел.
  • При использовании директив необходимо строго соблюдать правила синтаксиса, иначе компилятор выдаст ошибку.
  • В некоторых версиях платформы (до 8.3.6) поддержка директив была ограниченной, что требовало от разработчиков дополнительных проверок.

Интересные факты

  • Директивы компиляции в «1С:Предприятие» концептуально схожи с директивами препроцессора в языках C/C++ (#ifdef, #ifndef), но имеют более узкую специализацию, ориентированную на архитектуру платформы.
  • В ранних версиях платформы (до 8.2) разработчики вынуждены были использовать костыльные приёмы, такие как проверка доступности метода через попытку вызова в блоке Попытка...Исключение, что было неэффективно и ненадёжно.
  • С появлением директив компиляции разработка сложных конфигураций стала значительно проще и безопаснее, что способствовало росту популярности платформы среди крупных предприятий.

Источники

  1. «1С:Предприятие 8.3. Руководство разработчика». Фирма «1С», 2023.
  2. Официальная документация платформы «1С:Предприятие» — раздел «Директивы компиляции».
  3. «Разработка сложных отчётов в 1С:Предприятие 8.3» — Е.А. Гончаров, 2021.
  4. Статья «Директивы компиляции в 1С:Предприятие» на портале «Инфостарт» (infostart.ru).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →