С удивлением для себя обнаружил, что интерпретатор 1С вне зависимости от версии платформы позволяет в инструкции препроцессора отделить наименование объявляемой процедуры от её параметров и "тела". Именно это и позволяет написать единое "тело" процедуры для обоих контекстов, подставив это "тело" в разные для клиента и для сервера процедуры (объявить эти процедуры с разными наименованиями, по одной для каждого контекста).
Также параметры этих процедур можно сделать как зависящим от директивы компиляции (оставить их после наименования процедуры внутри инструкции препроцессора), так и независящими (оставить их после инструкции препроцессора перед "телом" процедуры).
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Реквизит1 = "123";
Реквизит2 = "";
Реквизит1Заполнен = Ложь;
Реквизит2Заполнен = Истина;
Реквизит1ПриИзмененииНаСервере();
Реквизит2ПриИзмененииНаСервере();
КонецПроцедуры
#Область Реквизит1ПриИзменении
// Вариант процедуры с разным составом параметров.
#Если НаКлиенте Тогда
// Обработчик события ПриИзменении элемента Реквизит1.
&НаКлиенте
Процедура Реквизит1ПриИзменении(Элемент)
#Иначе
&НаСервере
Процедура Реквизит1ПриИзмененииНаСервере()
#КонецЕсли
Реквизит1Заполнен = ЗначениеЗаполнено(Реквизит1);
КонецПроцедуры
#КонецОбласти //Реквизит1ПриИзменении.
#Область Реквизит2ПриИзменении
// Вариант процедуры с единым составом параметров.
#Если НаКлиенте Тогда
// Обработчик события ПриИзменении элемента Реквизит2.
&НаКлиенте
Процедура Реквизит2ПриИзменении(
#Иначе
&НаСервере
Процедура Реквизит2ПриИзмененииНаСервере(
#КонецЕсли
Элемент = NULL)
Реквизит2Заполнен = ЗначениеЗаполнено(Реквизит2);
КонецПроцедуры
#КонецОбласти // Реквизит2ПриИзменении.
Даже процедура "Реквизит1ПриИзменении" доступна для выбора в палитре свойств элемента Реквизит1 для события "ПриИзменении". В варианте "с единым составом" процедуру "Реквизит2ПриИзменении" в палитре свойств для события "При изменении" необходимо будет "заполнять текстом", так как в списке выбора будет только процедура "Реквизит1ПриИзменении".
Основной минус - это то, что синтаксис помощник не сможет правильно сгруппировать начало-конец процедуры, примечания и инструкции препроцессора; поэтому рекомендую объединять эту конструкцию в область, чтобы хоть как-то понять границы "блока процедуры".
Должен отметить, что данный способ противоречит пункту 3 стандарта Соглашению по написанию кода/Использование директив компиляции и инструкций препроцессора:
3. Не следует разрывать инструкциями препроцессора ... объявления и места вызова процедур и функций.
Хоть конкретного примера "неправильного" разрыва инструкцией объявления процедуры в этой статье и не приведено, но все-равно применять или нет это способ имитации &НаКлиентеНаСервере каждый должен решать для себя "на свой страх и риск".
Альтернативное решение предложено в статье Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере, где контекст передается параметром ЭтаФорма в единую серверную процедуру "без контекста", а все производимые изменения процедуры выполняются в значении этого параметра.
Тестировалось на платформе 8.3.22.1709.
В приложении к статье находится обработка с кодом из листинга этой статьи.