Определяем контекст сеанса 1С программно (Тонкий/Толстый клиенты/HTTP-Сервис/Фоновое задание и т.д.)

08.11.17

Интеграция - WEB-интеграция

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

Конфигуратор в режиме отладки позволяет выбрать предмет отладки (Тонкий/Толстый клиенты/HTTP-Сервис/Фоновое задание и т.д.), консоль кластера также отображает тип подключения сеанса (колонка "приложение"), ну и наконец стандартная обработка "Активные пользователи" также умеет это делать.

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

Для простоты и удобства пример функции, которая получает контекст сеанса:

//Функция ПолучитьИмяПриложенияСеанса(НомерСоединения, Представление = Ложь)
//НомерСоединения (Число) номер соединения по которому необходимо получить контекст сеанса
//Представление (Булево) - если Истина то функция вернет представления контекста сеанса (удобочитаемое) 
//Пример ИмяПриложения: "WebServerExtension" Представление:"Модуль расширения веб-сервера"
//Возвращает (Строка) - имя приложения (Контекст сеанса) или представление имени приложения
//
Функция ПолучитьИмяПриложенияСеанса(НомерСоединения, Представление = Ложь) Экспорт
    ИмяПриложения = "";  
	  
    СеансыИБ         = ПолучитьСеансыИнформационнойБазы();        
    Для Каждого Сеанс Из СеансыИБ Цикл         
        Если Сеанс.НомерСоединения = НомерСоединения Тогда
            Если Представление Тогда
				ИмяПриложения = ПредставлениеПриложения(Сеанс.ИмяПриложения); 
			Иначе
				ИмяПриложения = Сеанс.ИмяПриложения;
			КонецЕсли; 
        КонецЕсли;   
    КонецЦикла;
	
    Возврат ИмяПриложения;
    
КонецФункции

 

Вызвать функцию можно так:

НомерСоединения  = НомерСоединенияИнформационнойБазы();
ИмяПриложения	 = ПолучитьИмяПриложенияТекущегоСоединения(НомерСоединения);

 

Реализация, найденная в интернете и не решающая задачу:

Функция ОпределитьКонтекст() Экспорт
    
    
 #Если ВнешнееСоединение Тогда

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

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

  #Если ВебКлиент Тогда

   Возврат "Веб-клиент"; 
  #КонецЕсли

  #Если ТонкийКлиент Тогда

   Возврат "Тонкий клиент";
  #КонецЕсли

  #Если ТолстыйКлиентУправляемоеПриложение Тогда

   Возврат "Толстый клиент (управляемоеПриложение)";
  #КонецЕсли

  #Если ТолстыйКлиентОбычноеПриложение Тогда

   Возврат "Толстый клиент (обычноеПриложение)";
  #КонецЕсли

 #КонецЕсли

#Если Сервер Тогда 
  #Если МобильноеПриложениеСервер Тогда 
   Возврат "Мобильное приложение (сервер)";
  #КонецЕсли

  // Так как 1С:Предприятие поддерживает два варианта работы (файловый и клиент-серверный),

  // то отработаем каждый из вариантов.

  Если Лев(СтрокаСоединенияИнформационнойБазы(), 4) = "File" Тогда
  // Виртуальный сервер используется в файловом варианте.

   Возврат "Виртуальный сервер"
  Иначе
  // Реальный сервер используется в клиент-серверном варианте.

   Возврат "Реальный сервер";
  КонецЕсли;
 #КонецЕсли

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

 

контекст режим запуска HTTP-Сервисы

См. также

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL(ИТИЛ), 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    3255    5    0    

11

WEB-интеграция Анализ продаж Системный администратор Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Модуль "Подсистема интеграции AmoCRM с 1С" позволяет обеспечить единое информационное пространство, в котором пользователи могут эффективно управлять клиентской базой, следить за статусами сделок и поддерживать актуальность данных как в AmoCRM, так и в 1С.

60000 руб.

07.05.2019    35405    70    45    

30

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

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

57600 руб.

26.11.2024    2967    2    3    

5

WEB-интеграция Программист Руководитель проекта Платформа 1С v8.3 1C:Бухгалтерия 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    5002    5    2    

6

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    19406    24    22    

20

WEB-интеграция Программист Бизнес-аналитик Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    1185    7    2    

9

Обмен с ГосИС WEB-интеграция Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

3000 руб.

28.04.2016    93646    96    217    

347
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. kuzev 48 08.11.17 15:06 Сейчас в теме
Исправьте: НомерСоеденения, ПолучитьИмяПриложенияТекущегоСоеденения.
2. azubar 50 08.11.17 15:14 Сейчас в теме
3. guy_septimiy 10.11.17 12:02 Сейчас в теме
Кажется, что предложенное решение тоже не до конца справляется.
Например для толстого клиента оно так и не ответит на вопрос - где же я нахожусь. На сервере толстого клиента, или на клиенте.
Но с оговорками да.. вполне себе вариант.
4. azubar 50 10.11.17 14:49 Сейчас в теме
(3) тут уже надо комбинировать с решением приведенным ниже:
#Если Сервер Тогда
#КонецЕсли
5. Darklight 34 13.11.17 13:57 Сейчас в теме
(3)Почему не скажет? Скажет. Проблема только с файловой базой и толстым клиентом. Но.... в этом случае "Серверного контекста" НЕ СУЩЕСТВУЕТ - все вызовы идут только под контекстом "Толстого клиента" (под обычным или управляемым приложением), даже, если в указан переход в контекст сервера (например через общи модуль с вызовом сервера) - контекст останется "Толстый клиент". А зачем Вам иное - ведь - реально контекст именно и будет "Толстый клиент" - никакого серверного контекста ВООБЩЕ не будет - будет доступно всё то, что доступно толстому клиенту - т.е. ВСЁ! В отладчике контекст будет "Толстый клиент". Более того, в толстом клиенте игнорируется не только директива "Вызов сервера", но и директива "Сервер" - т.е. будут доступны и функции чисто серверных модулей - прямо с клиента. Так устроена платформа. Вот, для тонкого клиента в файловой базе - контексты уже будут разделены.
А для толстого клиента остаётся только проверить, что он толстый клиент и это файловая база. Это можно проверить ещё и так

#Если Клиент и Сервер Тогда
    возврат "Файловый толстый клиент";
#КонецЕсли;


Аналогично толстому клиенту, в файловой базе, ведёт себя и внешнее соединение (только вместо директивы "Клиент" отрабатывает директива "ВнешнееСоединение ", а директива "Сервер" по-прежнему отрабатывает, вернее игнорируется - серверный контекст полностью доступен в контексте внешнего соединения без "вызова сервера"). Разве что интерфейсные вызовы не доступны (доступно всё то, что доступно для внешнего соединения).

#Если ВнешнееСоединение и Сервер Тогда
    возврат "Файловое внешнее соединение";
#КонецЕсли;
6. Darklight 34 13.11.17 14:11 Сейчас в теме
А ещё, для получения текущего сеанса и его приложения с релиза платформы 8.3.7 можно использовать функцию ПолучитьТекущийСеансИнформационнойБазы()

Функция ПолучитьИмяПриложенияСеанса(Представление = Ложь)
    Если Представление Тогда
	 ИмяПриложения = ПредставлениеПриложения(ПолучитьТекущийСеансИнформационнойБазы().ИмяПриложения); 
    Иначе
	 ИмяПриложения = ПолучитьТекущийСеансИнформационнойБазы().ИмяПриложения;
   КонецЕсли
КонецФункции


ну или просто сразу обращаться к ПолучитьТекущийСеансИнформационнойБазы().ИмяПриложения без дополнительных функций
Sиlьver; cleaner_it; Agrozentr; atdonya; tanat74; swenzik; triviumfan; azubar; +8 Ответить
7. 🅵🅾️🆇 526 14.11.17 13:44 Сейчас в теме
Предлагаю добавить в цикл при удовлетворении условию: "Прервать;".
После комментариев - пробелы.

Да и можно заменить:
Если Представление Тогда
	ИмяПриложения = ПредставлениеПриложения(Сеанс.ИмяПриложения); 
Иначе
	ИмяПриложения = Сеанс.ИмяПриложения;
КонецЕсли;

на это:
 Возврат ?(Представление, ПредставлениеПриложения(Сеанс.ИмяПриложения), Сеанс.ИмяПриложения);

Тогда и "Прервать;" не нужно)))

Комментарии перед функцией лучше оформить следующим образом (тогда при вводе будут подсказки о параметрах):
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
//						Yandex speller 
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
// Проверка орфографии средствами Yandex speller через HTTP GET
// https://tech.yandex.ru/speller/doc/dg/concepts/speller-overview-docpage/
//
// Функция возвращает структуру со следующими парами Ключ-Значение:
//	БезОшибок, КоличествоОшибок, ИсходныйТекст, ИсправленныйТекст, ШаблонТекста, Ошибки
//	БезОшибок (булево)			- Текст не содержит/содержит ошибки.
//	КоличествоОшибок (число)	- Количество ошибок в тексте
//	ИсходныйТекст (строка)		- Текст переданый в функцию
//	ИсправленныйТекст (строка)	- Текст с исправленными ошибками (ошибки заменены на первую подсказку)
//	ШаблонТекста				- Текст в котором места ошибок обрамлены в "ИндексОшибки" 
//	Ошибки (массив структур)	- Состоит из КодОшибки (число), 
//									ОписаниеОшибки (строка), ПозицияСлова (число), НомерСтроки (число), 
//									НомерСтолбца (число), ДлинаСлова (число), Подсказки (массив строк) 
// В случае неудачи функция возвращает "Неопределено" и выводит сообщение об ошибке.
//
// Параметры:
//	Текст						- [обязательный](строка)
//								параметром передается текст на проверку
//	Язык						- [необязательный](строка)
//								Языки проверки (перечисляются через запятую).
//								Возможные значения:
//									ru – русский;
//									uk – украинский;
//									en – английский.
//								По умолчанию: "ru,en".
//	Опции						- [необязательный](число)
//								Опции Яндекс.Спеллера.
//								Значением параметра является сумма значений требуемых опций,
//								см. https://tech.yandex.ru/speller/doc/dg/reference/speller-options-docpage/
//								Например, Опции = 5 - это сумма опций IGNORE_UPPERCASE и IGNORE_URLS.
//								По умолчанию Опции = 31 (IGNORE_UPPERCASE, IGNORE_DIGITS, IGNORE_URLS, FIND_REPEAT_WORDS, IGNORE_LATIN).								
//	Формат						- [необязательный](строка)
//								Формат проверяемого текста.
//								Возможные значения:
//									plain - текст без разметки (значение по умолчанию)
//								    html - HTML-текст.
//	ИсправлятьИсходныйТекст		- [необязательный](булево) 
//								если Истина, то исходный текст исправляется
//								может быть полезно, если использовать как процедуру и возвращать первый параметр "Текст".
//								По умолчанию Ложь.
//	СообщатьОбОшибках			- [необязательный](булево) 
//								если Истина (значение по умолчанию), то будут выводиться сообщения об ошибках
//	Словарь						- [необязательный](строка) 
//								если заданы метаданные словаря (вида: "Справочник.Словарь"), 
//								то будут исключаться из ошибочных слова содержащиеся в наименованиях справочника "Словарь".
//								Если передана строка с разделителями ";", 
//								то вместо справочника словаря будет использоваться она.
//								По умолчанию пустая строка.
//	МинДлинаСлова				- [необязательный](число) 
//								минимальная длина слова подлежащего проверке
//								По умолчанию 0 (проверять все слова).
Показать



Идеалистических побуждений, а не критики ради :3
HomeInc; azubar; +2 Ответить
8. yur4ik9408 34 24.11.17 15:02 Сейчас в теме
как программа отреагирует на такую конструкцию:
Контекст = "";
Выполнить("Контекст = ОпределитьКонтекст();");
Сообщить("Контекст");
9. azubar 50 25.11.17 06:45 Сейчас в теме
(8) Нормально, только Сообщить("Контекст"); выводит строку "Контекст", надо так: Сообщить(Контекст);
10. AlexeyT1978 236 30.10.19 19:01 Сейчас в теме
Сейчас на 8.3.15 попроще можно сделать:
ПолучитьТекущийСеансИнформационнойБазы().ИмяПриложения
11. 028 03.11.22 19:37 Сейчас в теме
как определить веб режим т.к. эти варианты не подходят
Прикрепленные файлы:
12. пользователь 02.06.23 10:53
Сообщение было скрыто модератором.
...
13. Student1C 59 26.02.24 15:55 Сейчас в теме
Почему может не выводиться сообщение? Запрос идет с управляемой формы в толстом клиенте (обычное приложение).
#Если Клиент Или ТолстыйКлиентОбычноеПриложение Тогда
	Сообщить(СтрокаСообщенияПользователю);
#КонецЕсли
14. Student1C 59 26.02.24 15:59 Сейчас в теме
(13) Походу потому что запрос идет с контекста &НаСервере
Оставьте свое сообщение