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

08.11.17

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

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

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

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

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

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

 

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

 #КонецЕсли

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

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

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

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

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

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

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

 

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

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

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

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

36000 руб.

03.08.2020    15910    14    18    

12

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17845    6    15    

13

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25854    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

Обмен с ГосИС 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

2400 руб.

28.04.2016    88877    162    216    

318

Интеграция с сервисом vetmanager

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

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16464    42    49    

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

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


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

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

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


ну или просто сразу обращаться к ПолучитьТекущийСеансИнформационнойБазы().ИмяПриложения без дополнительных функций
Sиlьver; cleaner_it; Agrozentr; atdonya; tanat74; swenzik; triviumfan; azubar; +8 Ответить
7. 🅵🅾️🆇 522 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 45 25.11.17 06:45 Сейчас в теме
(8) Нормально, только Сообщить("Контекст"); выводит строку "Контекст", надо так: Сообщить(Контекст);
10. AlexeyT1978 205 30.10.19 19:01 Сейчас в теме
Сейчас на 8.3.15 попроще можно сделать:
ПолучитьТекущийСеансИнформационнойБазы().ИмяПриложения
11. 028 03.11.22 19:37 Сейчас в теме
как определить веб режим т.к. эти варианты не подходят
Прикрепленные файлы:
12. пользователь 02.06.23 10:53
Сообщение было скрыто модератором.
...
13. Student1C 57 26.02.24 15:55 Сейчас в теме
Почему может не выводиться сообщение? Запрос идет с управляемой формы в толстом клиенте (обычное приложение).
#Если Клиент Или ТолстыйКлиентОбычноеПриложение Тогда
	Сообщить(СтрокаСообщенияПользователю);
#КонецЕсли
14. Student1C 57 26.02.24 15:59 Сейчас в теме
(13) Походу потому что запрос идет с контекста &НаСервере
Оставьте свое сообщение