Какие директивные компиляции могут быть в модуле формы

1. Атрибуты «где исполнять» (шифруют вызов между клиентом и сервером)

&НаКлиенте
Процедура или функция выполняется только на клиенте (UI-потоке).

<br/>&НаКлиенте
Процедура ОбновитьКартинку(Команда)
// рисуем что-то в форме
КонецПроцедуры

&НаСервере
Выполнение только на сервере (база данных, фоновая задача). Параметры и результат автоматически сериализуются.

<br/>&НаСервере
Функция ПолучитьОстатки(МассивСкладов)
// тяжёлая работа с БД
КонецФункции

&НаКлиентеСервере
Двойная реализация: сначала пробует выполнить на клиенте, если нет — на сервере. Полезно для код-reuse.

<br/>&НаКлиентеСервере
Функция РасчитатьИтого(Таблица)
КонецФункции

2. Привязка к командам и событиям формы

&Команда("ИмяКоманды")
Делает процедуру обработчиком пользовательской команды формы (в разделе «Команды»).

<br/>&Команда("ПечатьОтчёта")
Процедура ПечатьОтчётаКоманда(Команда)
ПоказатьОтчёт();
КонецПроцедуры

&КомандаБезПараметров или &БезПараметров
Для команд, не передающих объект-команду как параметр.

<br/>&КомандаБезПараметров
Процедура ОбновитьДанные()
// нет аргумента «Команда»
КонецПроцедуры

&Переопределение
Если вы расширяете базовую (родительскую) процедуру/функцию формы в расширении.

<br/>&Переопределение
Процедура ПриОткрытииФормы()
// дополняем стандартное
Предок();
// свой код
КонецПроцедуры

3. Общие и вспомогательные атрибуты

&Журналировать
Автоматически пишет в журнал регистрации факт и входные/выходные данные вызова процедуры.

<br/>&Журналировать
Процедура СохранитьДанные(Параметры)
КонецПроцедуры

&ИспользоватьСборку("ИмяСборки")
Подключение внешней .NET-сборки прямо в модуле (редко встречается в формах).

<br/>&ИспользоватьСборку("MyDotNetLibrary")

&ИспользоватьОбщийМодуль("ИмяМодуля")
Чтобы вызвать процедуры из общего модуля как будто они в том же модуле формы.

<br/>&ИспользоватьОбщийМодуль("УправлениеОбменами")

4. Препроцессорные директивы (#…)

4.1. Условная компиляция

Позволяет включать/отключать участки кода в зависимости от платформы или контекста:

Если Сервер Тогда

// код только на сервере

ИначеЕсли Клиент Тогда

// только на клиенте

КонецЕсли

4.2. Группировка кода

За счёт #Область можно сворачивать большие фрагменты:

Область ОбработчикиКоманд

&Команда("Refresh")

Процедура RefreshКоманда(Команда)  КонецПроцедуры

&Команда("Save")

Процедура SaveКоманда(Команда)  КонецПроцедуры
#КонецОбласть

5. Когда и зачем использовать

  1. &НаКлиенте / &НаСервере / &НаКлиентеСервере
    — чёткое разграничение, чтобы не «упростить» и не сломать сериализацию или производительность.

  2. &Команда / &БезПараметров
    — надёжная привязка обработчиков к кнопкам и пунктам меню, без «магии» из интерфейса.

  3. &Переопределение
    — безопасная доработка типовых форм в расширениях, без копирования базового кода.

  4. Условная компиляция (#Если … #КонецЕсли)
    — писать универсальные модули, работающие и в толстом, и в тонком клиенте, и в кластере сервера.

  5. Группировка (#Область)
    — повышает читаемость длинных модулей, ускоряет навигацию в коде.

Итог

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

  • Сохранять понятное разделение клиент-серверного кода.

  • Обеспечивать кросс-платформенную (тонкий/толстый) работу модулей.

  • Удобно структурировать и документировать большой объём логики в одном модуле формы.

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