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