Определяем контекст сеанса 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    16084    13    18    

13

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

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

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

5040 руб.

04.05.2021    18171    10    15    

16

Автоматическая загрузка файлов (например, прайс-листов) из электронной почты, FTP, HTTP, их обработка и выгрузка на FTP (на сайт) и для других целей

Прайсы WEB-интеграция Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Автомобили, автосервисы Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Программа с заданным интервалом времени (или по ручной команде) скачивает файлы (например, прайс-листы поставщиков) из различных источников: письма электронной почты, FTP или HTTP-адреса, и сохраняет их в каталог упорядоченной структуры. При этом извлекает файлы из архивов, может переименовывать файлы и менять их формат (csv, xls, txt). Можно настроить выгрузку обработанных файлов на сайт (через FTP-подключение). Программа будет полезна компаниям, у которых есть большое количество поставщиков и/или прайс-листы поставщиков обновляются часто (необязательно прайс-листы, файлы могут быть любого назначения). Собранные таким образом актуальные версии прайс-листов можно выгрузить с помощью программы себе на сайт (или на любой FTP-сервер) или выполнить другие необходимые задачи.

25200 руб.

28.05.2015    85391    26    51    

50

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    12996    33    8    

12

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

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

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

12000 руб.

02.02.2021    16622    43    49    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. kuzev 47 08.11.17 15:06 Сейчас в теме
Исправьте: НомерСоеденения, ПолучитьИмяПриложенияТекущегоСоеденения.
2. azubar 46 08.11.17 15:14 Сейчас в теме
3. guy_septimiy 10.11.17 12:02 Сейчас в теме
Кажется, что предложенное решение тоже не до конца справляется.
Например для толстого клиента оно так и не ответит на вопрос - где же я нахожусь. На сервере толстого клиента, или на клиенте.
Но с оговорками да.. вполне себе вариант.
4. azubar 46 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. 🅵🅾️🆇 524 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 46 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) Походу потому что запрос идет с контекста &НаСервере
Оставьте свое сообщение