Поиск по блогу

среда, 8 июня 2016 г.

Правильно определяем контекст

Используя инструкции препроцессора можно определить контекст. Важно правильно определить последовательность выполнения инструкций для более точного определения контекста.

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

Cтоит отметить, что инструкции препроцессору поддерживают вложенность, так что ими можно крутить как угодно.

Программный код функции определения контекста:
Функция ОпределитьКонтекст() Экспорт

#Если ВнешнееСоединение Тогда
Возврат "Внешнее соединение";
#КонецЕсли

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

#Если Сервер Тогда
#Если МобильноеПриложениеСервер Тогда
Возврат "Мобильное приложение (сервер)";
#КонецЕсли
// Так как 1С:Предприятие поддерживает два варианта работы (файловый и клиент-серверный),
// то отработаем каждый из вариантов.
Если Лев(СтрокаСоединенияИнформационнойБазы(), 4) = "File" Тогда
// Виртуальный сервер используется в файловом варианте.
Возврат "Виртуальный сервер"
Иначе
// Реальный сервер используется в клиент-серверном варианте.
Возврат "Реальный сервер";
КонецЕсли;
#КонецЕсли

КонецФункции


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

При отладке контекст выполнения отображается на панели инструментов в предмете отладки. На какой строчке остановлено выполнение кода, контекст выполнения этой строчки кода и отображается (см. рисунок 2)
Рисунок 2. Отображение контекста выполнения в режиме отладки

1 комментарий: