При работе с механизмом расширений в платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда клиентские процедуры (с директивой &НаКлиенте) успешно перехватываются расширением, а серверные (&НаСервере) игнорируются системой. В этой статье мы подробно разберем, почему серверный код может «не подцепляться», как на это влияет безопасный режим и что делать, если отладчик упорно игнорирует ваши изменения.
Рассмотрим стандартную ситуацию: нам необходимо изменить логику расчета строки в документе «Начисление родительской платы» в конфигурации БГУ 2.0. Мы создаем расширение, переносим в него форму и добавляем процедуру РассчитатьСтрокуСервер с аннотацией &После или &Вместо. Однако при выполнении кода в режиме «1С:Предприятие» система ведет себя так, будто расширения не существует.
Проанализируем основные причины такого поведения:
&НаСервереБезКонтекста, а в расширении вы указали просто &НаСервере, расширение не сработает.Первым делом проверим настройки самого расширения в конфигураторе. Откроем список расширений (Меню — Конфигурация — Расширения конфигурации) и вызовем палитру свойств нашего расширения.
Разберем важные опции:
Важный нюанс: Даже если флаг «Безопасный режим» кажется снятым, рекомендуется установить его, сохранить изменения, а затем снова снять и обновить конфигурацию базы данных. Это иногда помогает «встряхнуть» настройки платформы.
Проверим код расширения. Для серверных процедур крайне важна точность. Если мы используем аннотацию &После, код должен выглядеть примерно так:
&НаСервере
&После("РассчитатьСтрокуСервер")
Процедура Расш1_РассчитатьСтрокуСервер(СтрокаТЧ, РезультатРасчета)
// Ваша дополнительная логика
Сообщить("Выполнен расчет в расширении!");
КонецПроцедуры
Если же мы решили полностью заменить алгоритм, используем &Вместо. Помните, что при использовании &Вместо оригинальная процедура не выполнится, пока вы явно не вызовете её через ПродолжитьВызов().
&НаСервере
&Вместо("РассчитатьСтрокуСервер")
Процедура Расш1_РассчитатьСтрокуСервер(СтрокаТЧ, РезультатРасчета)
// Если нужно выполнить типовой код:
ПродолжитьВызов(СтрокаТЧ, РезультатРасчета);
// Если нужно полностью заменить логику:
// Пишем свой код расчета здесь
КонецПроцедуры
Выясним причину, по которой &НаКлиенте работает, а сервер — нет. На клиенте контекст всегда очевиден, тогда как на сервере платформа должна сопоставить расширенный метод с оригинальным в конкретном серверном вызове. Если вы ошиблись в типах параметров или их количестве, расширение также будет проигнорировано без вывода ошибок.
Если настройки верны, а код все равно не работает, проанализируем ситуацию с кэшем. Кэш 1С бывает клиентским и серверным (в случае клиент-серверного варианта). В файловом варианте проблема кэша также актуальна.
Попробуем следующие действия по шагам:
%AppData%\1C\1Cv8 и %LocalAppData%\1C\1Cv8).Часто проблема заключается не в том, что код не работает, а в том, что отладчик в него «не заходит». Посмотрим на настройки отладки:
Во-первых, убедитесь, что сервер 1С запущен с параметром -debug. Без этого отладка серверных вызовов в принципе невозможна. Во-вторых, проверьте настройки подключения отладчика: меню Отладка — Подключение. В списке доступных предметов должны быть серверные сеансы.
Также в настройках расширения (в конфигураторе) убедитесь, что установлена галочка «Использовать при отладке». Если вы используете несколько расширений, проверьте их приоритеты. Если другое расширение, стоящее выше в списке, перехватывает ту же процедуру через &Вместо и не вызывает ПродолжитьВызов(), то ваш код никогда не получит управления.
Подведем итоги. Если ваше серверное расширение формы «молчит», выполните следующие действия: снимите безопасный режим, проверьте идентичность директив (&НаСервере), убедитесь в вызове ПродолжитьВызов() при необходимости и обязательно очистите кэш. В большинстве случаев, как и в рассмотренной теме с форума, проблема кроется в сочетании включенного безопасного режима и «зависшего» кэша метаданных, который не дает платформе увидеть обновленную структуру модулей.