Как определить тип клиентского приложения в 1С:Предприятие?

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

При разработке на платформе 1С:Предприятие 8 часто возникает необходимость выполнить определенную логику только для конкретного типа клиента: например, для веб-клиента, тонкого или толстого клиента. Однако разработчики нередко сталкиваются с ситуацией, когда код, написанный для этих целей, всегда отрабатывает как Сервер. Давайте разберем, почему так происходит и как правильно реализовать определение среды выполнения.

Разбираемся в причинах ошибки

Основная проблема, с которой сталкиваются начинающие разработчики, кроется в понимании директив компиляции. В модулях управляемого приложения, если перед процедурой или функцией явно не указана директива &НаКлиенте, платформа по умолчанию назначает директиву &НаСервере. В этом случае ваш код принудительно выполняется на сервере, а сервер, в свою очередь, не «знает» о специфике конкретного клиентского процесса, запустившего этот вызов.

Кроме того, препроцессорные инструкции (которые начинаются с символа #) анализируются в момент компиляции модуля. Если функция скомпилирована как серверная, препроцессор #Если Сервер Тогда будет всегда истинным, что и приводит к тому результату, который наблюдал автор темы.

Решение проблемы: использование директивы &НаКлиенте

Чтобы код корректно определял тип клиента, он обязательно должен выполняться в контексте клиента. Для этого необходимо явно указать директиву &НаКлиенте перед началом вашей функции. Рассмотрим подробнее, как это сделать правильно.

Разберем по шагам создание функции для определения вида приложения:

  1. Объявите функцию с обязательной директивой &НаКлиенте.
  2. Используйте внутри функции препроцессорные инструкции, чтобы исключить ошибки компиляции для тех типов клиентов, которые не поддерживают определенные методы.
  3. Вызывайте эту функцию только из других клиентских процедур.

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


&НаКлиенте
Функция ПолучитьВидПриложения() Экспорт
    #Если ВебКлиент Тогда
        Возврат "Веб-клиент";
    #ИначеЕсли ТолстыйКлиентОбычноеПриложение Тогда
        Возврат "Толстый клиент, обычное приложение";
    #ИначеЕсли ТолстыйКлиентУправляемоеПриложение Тогда
        Возврат "Толстый клиент, управляемое приложение";
    #ИначеЕсли ТонкийКлиент Тогда
        Возврат "Тонкий клиент";
    #ИначеЕсли МобильноеПриложениеКлиент Тогда
        Возврат "Мобильное приложение";
    #КонецЕсли
КонецФункции

Альтернативный подход: использование функции КлиентскоеПриложениеТип()

Помимо использования препроцессоров, платформа 1С предоставляет более современный и лаконичный метод — функцию КлиентскоеПриложениеТип(). Она возвращает значение перечисления ТипКлиентскогоПриложения. Использование этого метода позволяет сделать код более читаемым и избавляет от необходимости прописывать множество условий #Если.

Преимущества этого подхода:

Рекомендации по использованию БСП

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

Заключение

Подводя итог нашей работы, запомните следующие важные моменты:

Применяя эти правила, вы сможете избежать «загадочного» поведения платформы и сделать ваш код надежным и предсказуемым.

← На главную