Существует ли инструкция препроцессора #Если HTTPСервис Тогда в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интеграционных решений или веб-сервисов на платформе 1С:Предприятие часто возникает необходимость ограничить выполнение определенного кода только для конкретных контекстов вызова. У начинающих разработчиков часто возникает логичный вопрос: существует ли директива препроцессора вида #Если HTTPСервис Тогда, подобная уже привычным нам #Если Сервер Тогда или #Если Клиент Тогда?

Давайте разберемся в этом вопросе подробно, проанализируем, почему такая возможность отсутствует, и рассмотрим эффективные способы решения задачи по идентификации вызова HTTP-сервиса в коде.

Почему не работает #Если HTTPСервис Тогда

Важно понимать, как работают директивы препроцессора в 1С. Эти инструкции (препроцессорные макросы) обрабатываются платформой на этапе компиляции кода. Платформа 1С заранее знает, для какого типа модуля выполняется компиляция (клиентский, серверный, внешний модуль и т.д.), и физически исключает «лишний» код из скомпилированного байт-кода.

HTTP-сервис не является отдельным типом модуля с точки зрения архитектуры компиляции. Это роль, которую сервер 1С исполняет в текущий момент времени. Код, написанный внутри обработчиков HTTP-сервиса, всегда выполняется в контексте сервера. Поскольку платформа не разделяет серверный код на «обычный» и «код HTTP-сервиса» на этапе компиляции, использование инструкций препроцессора здесь невозможно.

Как программно определить вызов из HTTP-сервиса

Поскольку директивы препроцессора нам недоступны, мы должны использовать инструменты времени выполнения (runtime). Самый надежный способ узнать, в каком контексте исполняется текущий сеанс — обратиться к свойствам сеанса. Для этих целей мы используем метод ПолучитьТекущийСеансИнформационнойБазы().

Давайте рассмотрим, как это реализовать на практике. Мы можем проверить свойство ИмяПриложения, которое возвращает строку, идентифицирующую тип текущего соединения с информационной базой.

Разберем пример проверки для HTTP-сервиса и фонового задания:


// Пример проверки типа текущего сеанса
ТекущийСеанс = ПолучитьТекущийСеансИнформационнойБазы();

Если ТекущийСеанс.ИмяПриложения = "HTTPServiceConnection" Тогда
    // Код, который должен выполниться только при вызове HTTP-сервиса
    Сообщить("Выполняется код HTTP-сервиса");
ИначеЕсли ТекущийСеанс.ИмяПриложения = "BackgroundJob" Тогда
    // Код для фонового задания
    Сообщить("Выполняется фоновое задание");
КонецЕсли;

Рекомендации по реализации логики

Использование подобных проверок непосредственно внутри бизнес-логики может усложнить поддержку кода. Чтобы сделать вашу конфигурацию более чистой и понятной, рекомендуем придерживаться следующих правил:

  1. Вынос логики в общие модули: Если вы понимаете, что логика будет сильно отличаться, не смешивайте её внутри одной функции с множеством условий Если. Лучше создайте отдельные методы для обработки запросов HTTP-сервиса и обычных серверных вызовов.
  2. Использование параметров сеанса: Если вы планируете сложную логику разделения прав или видимости для HTTP-сервисов, рассмотрите возможность установки параметров сеанса при инициализации вызова. Это позволит избавиться от повторных вызовов метода ПолучитьТекущийСеансИнформационнойБазы().
  3. Отказ от избыточной идентификации: Перед написанием условий Если всегда задавайте себе вопрос: действительно ли логика работы метода должна быть разной? Часто бывает достаточно просто передать необходимые параметры в процедуру, вместо того чтобы проверять, откуда пришел вызов.

Подводя итог, можно сказать, что хотя прямой инструкции #Если HTTPСервис Тогда в платформе не существует, вы всегда можете эффективно управлять исполнением кода, анализируя свойство ИмяПриложения текущего сеанса. Этот подход является стандартным, надежным и полностью поддерживается платформой 1С:Предприятие 8.3.

← На главную