Уникальность и борьба с висящими сеансами БД 1С

29.07.14

База данных - Инструменты администратора БД

Если возникла ситуация, что произошел несанкционированный сбой в сети и после перезагрузки остается на  висеть сеанс (хотя на самом деле пользователь
не подключен и сеанс неактивен), то появится диалоговое окно с запросом отключить или нет предыдущий сеанс.
//!!! Для обычного приложения версии 8.2
//Размещать код следует в начало Процедуры ПриНачалеРаботыСистемы модуля обычного приложения.
//Принцип работы - Если возникла ситуация, что произошел несанкционированный сбой в сети и после перезагрузки остается на //сервере висеть сеанс (хотя на самом деле пользователь
//не подключен и сеанс неактивен), то появится диалоговое окно с запросом отключить или нет предыдущий сеанс.
//ПО ПРОСЬБЕ вставлю фрагмент, кот-ый автоматически определит Имя БД, ИмяСервера //********** СтрокаСоединения = СтрокаСоединенияИнформационнойБазы(); Если СтрЧислоВхождений(ВРег(СтрокаСоединения), "FILE=") Тогда Возврат; КонецЕсли; СтрДлина = СтрДлина(СтрокаСоединения); // Ищем имя сервера СтрокаСервера = ВыделитьПодстрокуСтрокиЗапуска(СтрокаСоединения, "Srvr="); ИмяБД = ВыделитьПодстрокуСтрокиЗапуска(СтрокаСоединения, "Ref="); // Если в имени сервера присутствует имя порта, то выделяем его РазделительПорта = Найти(СтрокаСервера, ":"); Если РазделительПорта > 0 Тогда ИмяСервера = Сред(СтрокаСервера, 1, (РазделительПорта - 1)); НомерПортаКластера = Сред(СтрокаСервера, (РазделительПорта + 1)); Иначе ИмяСервера = СтрокаСервера; ком = Новый COMОбъект("v81.COMConnector"); НомерПортаКластера = ком.RMngrPortDefault; КонецЕсли; //*******
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
ПризнакСеанса = 0;
//для обеспечения невозможности повторного входа пользователя, который уже присутствует в БД
//что делается:
ТекущийНомерСоединения=НомерСоединенияИнформационнойБазы();
УникальныйИдентификаторПользователя=ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
ТекущееСоединениеИмяКомпьютера = ИмяКомпьютера();
ServerName = ИмяСервера; //Имя Вашего сервера 1С
connector = новый comОбъект("V82.COMConnector");
AgentConnection = Connector.ConnectAgent(ServerName);
МассивКластеров = AgentConnection.GetClusters();
//определяем кластёр как описание типов
Для каждого Кластер ИЗ МассивКластеров Цикл
Если (Кластер.HostName = ИмяСервера) и (Кластер.SyncPort=НомерПортаКластера) тогда КластерТекущейБД = Кластер; //Думаю, что имя сервера будет совпадать с именем компа :)
   // Сообщить(Кластер.HostName);
КонецЕсли;
Прервать;
КонецЦикла;
//Доступ на просмотр сеансов
AgentConnection.Authenticate(КластерТекущейБД,"Администратор","Пароль");
//Для получения ВСЕХ тек.сеансов для данной БД - для инфо.. потом закомм и заодно БД как описание типов
МассивСеансов = AgentConnection.GetSessions(КластерТекущейБД);    
Для каждого Сеанс ИЗ МассивСеансов Цикл
Если (Сеанс.Infobase.Name = ИмяБД) и (Сеанс.UserName = ПользователиИнформационнойБазы.ТекущийПользователь().Имя) тогда
     ОписаниеБД = Сеанс.Infobase;
КонецЕсли;
КонецЦикла;
// Для случаев с висящими сеансами
МассивВсехСессийБД = AgentConnection.GetInfoBaseSessions(КластерТекущейБД,ОписаниеБД);   
Для каждого СессияБД ИЗ МассивВсехСессийБД Цикл
Если //(СессияБД.Host = ТекущееСоединениеИмяКомпьютера) И //ЭТО ЕСЛИ НАДО ИНИЦИАЛИЗАЦИЯ ПО КОМПУ
     (СессияБД.UserName = ПользователиИнформационнойБазы.ТекущийПользователь().Имя) И
     (СессияБД.Connection.Application = "1CV8")
тогда
       Если СессияБД.Connection.ConnID <> ТекущийНомерСоединения
       тогда
Режим = РежимДиалогаВопрос.ДаНет;
           Текст = "Сеанс данного пользователя активен! " + СессияБД.UserName +
                    "| Закрыть предыдущий сеанс? При сбое в сети нажмите <<Да>>";
           Ответ = Вопрос(Текст,Режим,0);
            Если Ответ = КодВозвратаДиалога.Да тогда
                AgentConnection.TerminateSession(КластерТекущейБД,СессияБД);
           КонецЕсли;
           Если Ответ = КодВозвратаДиалога.Нет тогда
         ПризнакСеанса = 1;
    Предупреждение("Внимание! Активно несколько сеансов для одного пользователя");
   КонецЕсли;
      КонецЕсли;
    //если просто висяк,тада безоговорочно закроет на серваке висячий сеанс. проверить
  Сообщить("НомерСоединения: " + СессияБД.Connection.ConnID + " Номер сеанса: " + СессияБД.SessionID);//Сеансы
КонецЕсли;
КонецЦикла;
//а если с другого компа под этим ползуном, ЗАКРЫВАТЬ БУДЕТ ГОСТЯ
//Этот фрагмент кода можно не включать, если Вам нужно просто закрыть висящий сеанс.
МассивСоединений=ПолучитьСоединенияИнформационнойБазы();
Для Каждого ТекСоединение Из МассивСоединений Цикл
Сообщить(ТекСоединение.НомерСоединения);
Если (ТекСоединение.ИмяПриложения="1CV8")                
и(НЕ ТекСоединение.НомерСоединения=ТекущийНомерСоединения)
и(НЕ ТекСоединение.Пользователь=неопределено)        
и(ТекСоединение.Пользователь.УникальныйИдентификатор=УникальныйИдентификаторПользователя)
и(ПризнакСеанса = 0)
//и(НЕ СессияБД.Host = ТекущееСоединениеИмяКомпьютера)
//и(ТекСоединение.Пользователь.ИмяКомпьютера = ТекущееСоединениеИмяКомпьютера)
тогда
   Предупреждение("Пользователь с таким именем уже выполнил вход ! Имя ПК >> " + СессияБД.Host);
        ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;   
КонецЦикла;       
По просьбе - И еще добавить в Модуль новую функцию
// Функция выделяет необходимые части из строки запуска 
// 
Функция ВыделитьПодстрокуСтрокиЗапуска(СтрокаЗапуска, КлючПодстроки) Экспорт 
НомерПервогоСимвола = Найти(ВРег(СтрокаЗапуска), ВРег(КлючПодстроки)) + СтрДлина(КлючПодстроки); 
Для Счетчик = НомерПервогоСимвола По СтрДлина(СтрокаЗапуска) Цикл 
   Если Сред(СтрокаЗапуска, Счетчик, 1) = ";" Тогда 
       НомерПоследнегоСимвола = Счетчик - 1; 
       Прервать; 
   КонецЕсли; 
КонецЦикла; 
// Получаем искомую подстроку 
ИскомаяПодстрока = Сред(СтрокаЗапуска, НомерПервогоСимвола, (НомерПоследнегоСимвола - НомерПервогоСимвола + 1)); 
Если Сред(ИскомаяПодстрока, 1, 1) = """" Тогда 
// Если подстрока в кавычках, то выделяем их 
ИскомаяПодстрока = Сред(ИскомаяПодстрока, 2, (СтрДлина(ИскомаяПодстрока) - 2)); 
КонецЕсли; 
Возврат ИскомаяПодстрока;

КонецФункции // ВыделитьПодстроку()



очистка сеанс

См. также

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    14439    109    46    

108

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

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

15000 руб.

10.11.2023    11927    45    27    

67

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 18.09.2024, версия 1.2

18000 руб.

06.12.2023    10712    47    8    

78

SALE! %

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

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

4800 3840 руб.

14.01.2013    191307    1153    0    

920

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтер Пользователь Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    33853    108    152    

75

Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

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

3600 руб.

06.02.2017    32663    145    18    

51

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Данная разработка позволит решить вопрос с резервным копированием Ваших баз в автоматическом режиме, расположенных на сервере 1С. Система умеет ставить блокировки на вход, блокировать фоновые задания, принудительно отключать сеансы пользователей. И все это система делает в автоматически при создании бэкапа (или через команду). Выгрузка происходит в родной формат 1С - .dt. Так же система умеет архивировать данные выгрузки с установкой пароля. Умеет менять расширение файла zip или dt на любое указанное вами, что позволит сохранить выгрузки от шифровальщика. Может удалять старые копии выгрузок, оставляя указанное количество резервных копий, начиная с самой поздней. Только для WINDOWS!

6000 руб.

06.11.2012    73759    629    45    

88

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

Многие сталкиваются с проблемой когда изображения, находящиеся в базе разные по объему и размерам. Менеджеры могут добавить файлы в очень высоком разрешении, объемом свыше 20 Мегабайт. База данных становится слишком большой, выгрузка на сайт идёт медленно и требуется много место на хостинге. Как сжать картинки и уменьшить размер базы 1С? Это можно сделать с помощью данной обработки. Существует возможность выбрать различные варианты для того чтобы уменьшить картинки: в разы, в процентах от первоначального объема, а также сделать картинки одинаковой ширины. В результате размер базы 1С значительно сократится (в зависимости от количества и размера картинок), а изображения станут небольшого объема, равными по ширине, почти без потери качества. Работает на управляемых формах для УТ 11, КА, ERP.

3000 руб.

21.07.2022    10170    10    4    

18
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Гость 11.07.14 15:33
отформатируйте текст статьи
6. mack198109 55 17.07.14 22:39 Сейчас в теме
(1) вася, более-менее навел красоту :)
2. g26516 16.07.14 08:22 Сейчас в теме
11. MadDAD 136 06.08.14 10:31 Сейчас в теме
(2) g26516, пиарнусь немного. Для 7.7 и для 8.x подойдет мое детище - http://infostart.ru/public/248792/.
12. mack198109 55 06.08.14 12:35 Сейчас в теме
(11) MadDAD, возьмем на заметку :)
3. qvvert 157 16.07.14 08:58 Сейчас в теме
Получается код вырубает не именно зависший сеанс, а все другие сеансы текущего пользователя
Есть какая то возможность определить простой соединения? Как я видел в консоли - в зависшем соединении - однофигово дата последней активности довольно актуальная ( : Скажем пользователь подвис 1 час назад последняя активность соединения минуту назад
4. mack198109 55 16.07.14 22:48 Сейчас в теме
Пока только так и получается, что надо зайти еще раз пользователю, чтобы убить пред. сеанс. Вариант есть, если использовать Регламентное задание, которое бы через какой-либо интервал проверяло активность пользователей.
5. soda 16.07.14 23:02 Сейчас в теме
А как проверить активность пользователей, если в системе есть что-то связанное с обработкой ожидания. например напоминалка, соотщалка...
7. igo1 270 29.07.14 13:58 Сейчас в теме
Спасибо, но еще неплохо бы добавить след код, ну прописать полученные данные где надо

СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
	Если СтрЧислоВхождений(ВРег(СтрокаСоединения), "FILE=") Тогда
		Возврат;
	КонецЕсли;
		
	СтрДлина = СтрДлина(СтрокаСоединения);
	
	// Ищем имя сервера
	СтрокаСервера = ВыделитьПодстрокуСтрокиЗапуска(СтрокаСоединения, "Srvr=");
	// Если в имени сервера присутствует имя порта, то выделяем его
	РазделительПорта = Найти(СтрокаСервера, ":");
	Если РазделительПорта > 0 Тогда
		ИмяСервера = Сред(СтрокаСервера, 1, (РазделительПорта - 1));
		НомерПортаКластера = Сред(СтрокаСервера, (РазделительПорта + 1));
	Иначе
		ИмяСервера = СтрокаСервера;
		ком = Новый COMОбъект("v81.COMConnector");
		НомерПортаКластера = ком.RMngrPortDefault;
	КонецЕсли; 





// Функция выделяет необходимые части из строки запуска
//
Функция ВыделитьПодстрокуСтрокиЗапуска(СтрокаЗапуска, КлючПодстроки) Экспорт 

	НомерПервогоСимвола = Найти(ВРег(СтрокаЗапуска), ВРег(КлючПодстроки)) + СтрДлина(КлючПодстроки);
	Для Счетчик = НомерПервогоСимвола По СтрДлина(СтрокаЗапуска) Цикл
		Если Сред(СтрокаЗапуска, Счетчик, 1) = ";" Тогда
			НомерПоследнегоСимвола = Счетчик - 1;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	// Получаем искомую подстроку
	ИскомаяПодстрока = Сред(СтрокаЗапуска, НомерПервогоСимвола, (НомерПоследнегоСимвола - НомерПервогоСимвола + 1));
	Если Сред(ИскомаяПодстрока, 1, 1) = """" Тогда
		// Если подстрока в кавычках, то выделяем их
		ИскомаяПодстрока = Сред(ИскомаяПодстрока, 2, (СтрДлина(ИскомаяПодстрока) - 2));
	КонецЕсли;
	
	Возврат ИскомаяПодстрока;

КонецФункции // ВыделитьПодстроку()
Показать
8. mack198109 55 29.07.14 22:40 Сейчас в теме
(7) igo1, И вам спасибо, я добавил. Но, правда, хотел чтобы код менялся в одном месте. Ну и ладно... Я считаю, что обработка строки - это довольно-таки серьезная штука и полезная. А вообще, Может быть и так, что наш с Вами получившийся код можно оптимизировать. Но в этом виде, думаю, пока подойдет для нетиповых конфиг.
9. JusteRU 30.07.14 02:46 Сейчас в теме
Супер! А нет ли возможности реализации подобного функционала без использования com-объекта, чтобы на linux-сервере использовать по регламентному заданию, например?
Хотя в толстом клиенте запущенном с винды это должно отрабатывать и так, надо попробовать.
10. mack198109 55 30.07.14 12:09 Сейчас в теме
JusteRU(9), к сожалению, только чуть менее 2х лет в 1С... Как регламентное задание можно сделать. Пробовал на 2003м серваке. Не подошло, потому-что в фоновом режиме иногда выскакивало не в тему сообщение о наличии пользователя в сети. Надо еще немножко переработать для "фона". А насчет Линукса - Ведь ком объект я вызываю чтобы использовать агент-коннектор. Как в обход коннектора все "прокрутить" будет время-разберусь. Счас работу ищу :(
13. mack198109 55 10.10.15 08:44 Сейчас в теме
хаха. А через Delphi такоя имтерестно реализовано...
Оставьте свое сообщение