Как программно определить запуск 1С:Предприятие через веб-сервер

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

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

Постановка задачи и разграничение понятий

Прежде всего, нам необходимо четко разделить два сценария, которые начинающие разработчики часто путают:

  1. Веб-клиент — это работа с базой через обычный интернет-браузер (Chrome, Safari, Firefox).
  2. Тонкий клиент через веб-сервер — это работа через штатное приложение «Тонкий клиент», но в качестве адреса информационной базы указан URL-адрес (HTTP/HTTPS), а не имя сервера 1С.

Наша задача — найти универсальный способ определить, что между клиентским приложением и сервером 1С стоит «прослойка» в виде веб-сервера (Apache или IIS).

Метод 1. Анализ строки соединения (универсальный способ)

Наиболее надежным способом определения типа подключения является использование функции СтрокаСоединения(). Этот метод возвращает параметры, с которыми клиентское приложение подключилось к базе. Проанализируем, как меняется результат этой функции в разных условиях.

Рассмотрим код, который позволяет выявить наличие веб-сервера:


// Функция определяет, идет ли работа через веб-сервер
Функция РаботаерезВебСервер() Экспорт
    
    ТекСтрокаСоединения = НРег(СтрокаСоединения());
    
    // Если соединение идет через веб-сервер, строка начинается с "ws="
    Если Лев(ТекСтрокаСоединения, 3) = "ws=" Тогда
        Возврат Истина;
    КонецЕсли;
    
    Возврат Ложь;
    
КонецФункции

Разберем, почему это работает. Если вы запускаете 1С напрямую (клиент-серверный вариант по протоколу TCP), строка соединения будет начинаться с Srvr=. Если база файловая — с File=. Однако, если публикация выполнена на веб-сервере, платформа использует протокол Web Services (WS), и строка будет иметь вид ws="https://myserver.com/mybase".

Важный нюанс: использование функции НРег() (приведение к нижнему регистру) обязательно, так как в зависимости от версии платформы или настроек операционной системы регистр букв в строке соединения может отличаться.

Метод 2. Использование инструкций препроцессора

Если ваша цель — определить исключительно запуск в браузере (веб-клиент), то лучше всего воспользоваться инструкциями препроцессора. Это позволит системе не просто выполнять код по условию, но и вовсе не компилировать блоки кода, которые недоступны в данной среде.

Проанализируем пример использования:


#Если ВебКлиент Тогда
    Сообщить("Вы работаете через браузер. Некоторые функции печати могут быть ограничены.");
#Иначе
    Сообщить("Вы работаете в толстом или тонком клиенте.");
#КонецЕсли

Однако помните, что инструкция #Если ВебКлиент вернет Ложь, если пользователь запустил Тонкий клиент через веб-сервер. Поэтому для полноценной диагностики этот метод нужно сочетать с анализом строки соединения.

Метод 3. Проверка типа клиентского приложения

Платформа 1С предоставляет системное перечисление ТипКлиентскогоПриложения. Мы можем программно проверить, в какой среде выполняется код. Это особенно полезно в модуле управляемого приложения или при запуске системы.

Рассмотрим следующий программный код:


ТипКлиента = ТипЗнч(ПриложениеСистемы()); // Не совсем верно, используем СвойстваГлобальногоКонтекста

// Правильный подход:
Если ТипПлатформы() = ТипПлатформы.WebClient Тогда
    // Это всегда работа через веб-сервер
КонецЕсли;

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

Метод 4. Использование навигационных ссылок

Еще один интересный способ — проанализировать навигационную ссылку информационной базы. Метод ПолучитьНавигационнуюСсылкуИнформационнойБазы() возвращает полный путь к базе. Если база опубликована, ссылка будет содержать протоколы http:// или https://.

Выясним причину, почему это удобно: этот метод работает стабильно как на стороне клиента, так и на стороне сервера (в контексте сеанса). Мы можем проанализировать наличие характерных признаков URL-адреса в возвращаемом значении.

Зачем это нужно на практике?

Проанализируем основные сценарии, в которых знание о типе подключения жизненно необходимо разработчику:

  1. Оптимизация передачи данных. При работе через веб-сервер накладные расходы на HTTP-заголовки велики. Мы можем программно уменьшить количество колонок в динамических списках или отключить «тяжелые» декоративные элементы формы для ускорения отрисовки.
  2. Работа с файловой системой. Веб-клиент имеет жесткие ограничения на работу с локальными файлами (требуется установка расширения работы с файлами). Если мы определили веб-клиент, мы можем заранее предложить пользователю установить расширение или использовать альтернативные методы загрузки файлов.
  3. Интеграция с внешним оборудованием. Торговое оборудование (сканеры штрихкодов, ККТ) гораздо проще подключать в Тонком клиенте. Определив запуск через веб-сервер, мы можем выдать пользователю предупреждение о возможной несовместимости драйверов.
  4. Безопасность. Мы можем запрещать определенные действия (например, выгрузку отчетов в Excel), если пользователь зашел в систему из внешней сети через веб-публикацию.

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

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

Например, проанализируем структуру параметров клиента, которая заполняется при старте:


// В БСП параметры часто доступны через:
ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыЗапускаПрограммы();
// Или использование специализированных функций:
Если ОбщегоНазначенияКлиент.ЭтоВебКлиент() Тогда
    // ...
КонецЕсли;

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

Резюме

Мы разобрали основные способы детекции запуска 1С через веб-сервер. Подведем итог: самый простой и надежный способ для любого типа клиента — это проверка СтрокаСоединения() на наличие префикса ws=. Для более тонкой настройки интерфейса в браузерах используйте препроцессор #Если ВебКлиент. Сочетание этих методов позволит вам создавать гибкие и производительные решения, адаптированные под любые условия подключения.

← На главную