Директивы компиляции 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С:Предприятие 8.3. Руководство разработчика». Фирма «1С», 2023.
- Официальная документация платформы «1С:Предприятие» — раздел «Директивы компиляции».
- «Разработка сложных отчётов в 1С:Предприятие 8.3» — Е.А. Гончаров, 2021.
- Статья «Директивы компиляции в 1С:Предприятие» на портале «Инфостарт» (infostart.ru).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →