При разработке интеграционных решений или веб-сервисов на платформе 1С:Предприятие часто возникает необходимость ограничить выполнение определенного кода только для конкретных контекстов вызова. У начинающих разработчиков часто возникает логичный вопрос: существует ли директива препроцессора вида #Если HTTPСервис Тогда, подобная уже привычным нам #Если Сервер Тогда или #Если Клиент Тогда?
Давайте разберемся в этом вопросе подробно, проанализируем, почему такая возможность отсутствует, и рассмотрим эффективные способы решения задачи по идентификации вызова HTTP-сервиса в коде.
Важно понимать, как работают директивы препроцессора в 1С. Эти инструкции (препроцессорные макросы) обрабатываются платформой на этапе компиляции кода. Платформа 1С заранее знает, для какого типа модуля выполняется компиляция (клиентский, серверный, внешний модуль и т.д.), и физически исключает «лишний» код из скомпилированного байт-кода.
HTTP-сервис не является отдельным типом модуля с точки зрения архитектуры компиляции. Это роль, которую сервер 1С исполняет в текущий момент времени. Код, написанный внутри обработчиков HTTP-сервиса, всегда выполняется в контексте сервера. Поскольку платформа не разделяет серверный код на «обычный» и «код HTTP-сервиса» на этапе компиляции, использование инструкций препроцессора здесь невозможно.
Поскольку директивы препроцессора нам недоступны, мы должны использовать инструменты времени выполнения (runtime). Самый надежный способ узнать, в каком контексте исполняется текущий сеанс — обратиться к свойствам сеанса. Для этих целей мы используем метод ПолучитьТекущийСеансИнформационнойБазы().
Давайте рассмотрим, как это реализовать на практике. Мы можем проверить свойство ИмяПриложения, которое возвращает строку, идентифицирующую тип текущего соединения с информационной базой.
Разберем пример проверки для HTTP-сервиса и фонового задания:
// Пример проверки типа текущего сеанса
ТекущийСеанс = ПолучитьТекущийСеансИнформационнойБазы();
Если ТекущийСеанс.ИмяПриложения = "HTTPServiceConnection" Тогда
// Код, который должен выполниться только при вызове HTTP-сервиса
Сообщить("Выполняется код HTTP-сервиса");
ИначеЕсли ТекущийСеанс.ИмяПриложения = "BackgroundJob" Тогда
// Код для фонового задания
Сообщить("Выполняется фоновое задание");
КонецЕсли;
Использование подобных проверок непосредственно внутри бизнес-логики может усложнить поддержку кода. Чтобы сделать вашу конфигурацию более чистой и понятной, рекомендуем придерживаться следующих правил:
Если. Лучше создайте отдельные методы для обработки запросов HTTP-сервиса и обычных серверных вызовов.ПолучитьТекущийСеансИнформационнойБазы().Если всегда задавайте себе вопрос: действительно ли логика работы метода должна быть разной? Часто бывает достаточно просто передать необходимые параметры в процедуру, вместо того чтобы проверять, откуда пришел вызов.Подводя итог, можно сказать, что хотя прямой инструкции #Если HTTPСервис Тогда в платформе не существует, вы всегда можете эффективно управлять исполнением кода, анализируя свойство ИмяПриложения текущего сеанса. Этот подход является стандартным, надежным и полностью поддерживается платформой 1С:Предприятие 8.3.