Имя: Пароль:
1C
 
Зависают сеансы пользователей на сервере 1С
0 AlexYurg
 
02.11.18
15:50
Зависают сеансы ушедших пользователей на сервере 1С.
Платформа 1С - 8.3.12.1567
Сервер 1С - x64
Сервер БД - PostgreSQL 9.1.9-1.1C(x64)
Настройки кластера: http://joxi.ru/J2bxe5WUXW80gr
Проблема появилась после какого-то очередного обновления версии 1С.
Поиск решения не дал вразумительных результатов.
Прошу совета!
1 sergey198
 
02.11.18
15:52
(0)та же проблема на 8.3.12
2 AlexYurg
 
02.11.18
15:59
(1) И что? Победили? Если да, то как, если нет, то почему?
3 shuhard
 
02.11.18
16:03
(2)[если нет, то почему?]
пятнично
жши ещё
4 spiller26
 
02.11.18
16:05
(0) Я выкидываю в полночь каждый день всех самописным фоновым заданием.
5 AlexYurg
 
02.11.18
16:10
(4) Значит, у вас та же проблема?
Всегда была или тоже возникла с переходом на 8.3.12?
6 spiller26
 
02.11.18
16:16
(5) В 8.3.10.2252 появилась, пол года боролся, потом решил написать фоновое.
7 spiller26
 
02.11.18
16:17
(5) У нас сервак на Линуксе + Posgres + web-сервер на апаче.
8 Вафель
 
02.11.18
16:18
параметр "интервал перезапуска" не рекомндуют заполнять.
лучше скрипт запускай по расписанию
9 spiller26
 
02.11.18
16:23
(5) вот код моего регламентного.

Процедура УдалениеСеансовВНазначенноеВремя() Экспорт
    
    Успех = Истина;
    пИмяАдминистратораКластера = "";
    пПарольАдминистратораКластера = "";
    пИмяАдминистратораИнформационнойБазы = "";
    пПарольАдминистратораИнформационнойБазы = "";
    
    //параметры
    Попытка
        ВремяУдаленияСеансов = Константы.abtВремяУдаленияСеансов.Получить();
        ДатаУбийства = Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),День(ТекущаяДата()), Час(ВремяУдаленияСеансов), Минута(ВремяУдаленияСеансов), Секунда(ВремяУдаленияСеансов));
        
        пАдресСервераАдминистрирования = "";
        пИмяИнформационнойБазыВКластере = "";
        //Порт Сервера Администрирования
        пПортСервераАдминистрирования = СокрЛП(Константы.abtПортСервераАдминистрирования.Получить()); //"1545"
        пПортСервераАдминистрирования = ?(пПортСервераАдминистрирования = "", "1545", пПортСервераАдминистрирования);
        //Порт Кластера
        пПортКластера = СокрЛП(Константы.abtПортКластера.Получить()); //"1541";
        пПортКластера = ?(пПортКластера = "", "1541", пПортКластера);
        //Имя Администратора Кластера
        пИмяАдминистратораКластера = СокрЛП(Константы.abtИмяАдминистратораКластера.Получить());
        //Пароль Администратора Кластера
        пПарольАдминистратораКластера = СокрЛП(Константы.abtПарольАдминистратораКластера.Получить());
        //Имя Администратора Информационной Базы
        ПользовательИнформационнойБазыРегламентныхЗаданий = Константы.abtПользовательИнформационнойБазыРегламентныхЗаданий.Получить();
        Если НЕ ПользовательИнформационнойБазыРегламентныхЗаданий = Справочники.Пользователи.ПустаяСсылка() Тогда
            ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ПользовательИнформационнойБазыРегламентныхЗаданий.ИдентификаторПользователяИБ);
            пИмяАдминистратораИнформационнойБазы = ?(ПользовательИБ = Неопределено, "", СокрЛП(ПользовательИБ.Имя));
        КонецЕсли;    
        //Пароль Администратора Информационной Базы
        пПарольАдминистратораИнформационнойБазы = СокрЛП(Константы.abtПарольПользователяИнформационнойБазыРегламентныхЗаданий.Получить());
    Исключение
        Успех = Ложь;
    КонецПопытки;    
    
    //Дополнительная проверка параметров для соединения к кластеру администрирования
    Если Успех Тогда
        Если пИмяАдминистратораКластера = "" Тогда
            Успех = Ложь;
        КонецЕсли;
        Если пПарольАдминистратораКластера = "" Тогда
            Успех = Ложь;
        КонецЕсли;
        Если пИмяАдминистратораИнформационнойБазы = "" Тогда
            Успех = Ложь;
        КонецЕсли;
        Если пПарольАдминистратораИнформационнойБазы = "" Тогда
            Успех = Ложь;
        КонецЕсли;
    КонецЕсли;    
    
    Если Успех Тогда
        СтрокаСоединенияИБ = СтрокаСоединенияИнформационнойБазы(); //"File="/home/юзер/1cBases/Конфа";"  или "Srvr="1c.Сервак.ru";Ref="Конфа";"
        ЭтоСервернаяБаза = Истина;
        Если СтрНайти(СтрокаСоединенияИБ, "File=") > 0 Тогда
            ЭтоСервернаяБаза = Ложь; //ФайловаяБаза
        Иначе
            МассивПараметровСоединенияИБ = РазложитьСтрокуНаПодстроки(СтрокаСоединенияИБ, ";");
            //СерверИБ =
            //пАдресСервераАдминистрирования =
            Для Каждого СтрМассиваСоединенияИБ Из МассивПараметровСоединенияИБ Цикл
                Если СтрНайти(СтрМассиваСоединенияИБ, "Srvr=") > 0 Тогда
                    пАдресСервераАдминистрирования = СтрЗаменить(СтрМассиваСоединенияИБ, "Srvr=", "");
                    пАдресСервераАдминистрирования = СтрЗаменить(пАдресСервераАдминистрирования, """", "");
                ИначеЕсли СтрНайти(СтрМассиваСоединенияИБ, "Ref=") > 0 Тогда
                    пИмяИнформационнойБазыВКластере = СтрЗаменить(СтрМассиваСоединенияИБ, "Ref=", "");
                    пИмяИнформационнойБазыВКластере = СтрЗаменить(пИмяИнформационнойБазыВКластере, """", "");
                КонецЕсли;    
            КонецЦикла;    
        КонецЕсли;    

        Если ЭтоСервернаяБаза Тогда
            
            //массив запущенных клиентов по которым будем отключать
            КлиентскиеПриложения = Новый Массив;
            КлиентскиеПриложения.Добавить(ВРег("1CV8")); //толстый клиент
            КлиентскиеПриложения.Добавить(ВРег("1CV8C")); //тонкий клиент
            КлиентскиеПриложения.Добавить(ВРег("WebClient")); //web-клиент
            КлиентскиеПриложения.Добавить(ВРег("COMConnection")); //внешнее соединение 1С:Предприятия через COM
            КлиентскиеПриложения.Добавить(ВРег("WSConnection")); //web-сервис
            //КлиентскиеПриложения.Добавить(ВРег("BackgroundJob")); //обработк заданий
            //КлиентскиеПриложения.Добавить(ВРег("SrvrConsole")); //консоль кластера
            //КлиентскиеПриложения.Добавить(ВРег("COMConsole")); //администрирование сессии внешнего соединения
            //КлиентскиеПриложения.Добавить(ВРег("JobScheduler")); //планировщик заданий
            //КлиентскиеПриложения.Добавить(ВРег("Designer")); //конфигуратор / отладка
            
            СеансыИнформационнойБазы = ПолучитьСеансыИнформационнойБазы();
            НомераСеансов = Новый Массив;
            стСписокКРасстрелу = "";
            Для Каждого СеансИБ Из СеансыИнформационнойБазы Цикл
                Если КлиентскиеПриложения.Найти(ВРег(СеансИБ.ИмяПриложения)) <> Неопределено Тогда
                    Если СеансИБ.НачалоСеанса < ДатаУбийства Тогда
                        Если СеансИБ.Пользователь.Имя <> пИмяАдминистратораИнформационнойБазы Тогда
                            НомераСеансов.Добавить(СеансИБ.НомерСеанса);
                            стСписокКРасстрелу = стСписокКРасстрелу + Строка(СеансИБ.Пользователь.Имя) + " ";
                        КонецЕсли;    
                    КонецЕсли;    
                КонецЕсли;    
            КонецЦикла;    
            
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(стСписокКРасстрелу); //сообщение пользователю
            
            Если НомераСеансов.Количество() > 0 Тогда
                
                //Для COM
                //ПараметрыАдминистрирования = Новый Структура();
                //ПараметрыАдминистрирования.Вставить("ТипПодключения", "COM"); // "COM" или "RAS"
                //ПараметрыАдминистрирования.АдресАгентаСервера = "ххх.ххх.ххх.ххх";
                //ПараметрыАдминистрирования.ПортАгентаСервера = 1540; //по умолчанию в 1С используется 1540
                //ПараметрыАдминистрирования.ПортКластера = 1541; //по умолчанию в 1С используется 1541
                //Для RAS
                ПараметрыАдминистрирования = Новый Структура();
                ПараметрыАдминистрирования.Вставить("ТипПодключения", "RAS"); // "COM" или "RAS"
                ПараметрыАдминистрирования.Вставить("АдресСервераАдминистрирования", пАдресСервераАдминистрирования);
                ПараметрыАдминистрирования.Вставить("ПортСервераАдминистрирования", Число(пПортСервераАдминистрирования));
                //общее
                ПараметрыАдминистрирования.Вставить("ПортКластера", Число(пПортКластера)); //по умолчанию в 1С используется 1541
                ПараметрыАдминистрирования.Вставить("ИмяАдминистратораКластера", пИмяАдминистратораКластера); //Если нет в кластере "Администратора", то нужно создать
                ПараметрыАдминистрирования.Вставить("ПарольАдминистратораКластера", пПарольАдминистратораКластера);
                
                
                ПараметрыАдминистрированияИБ = АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера();
                ПараметрыАдминистрированияИБ.ИмяВКластере = пИмяИнформационнойБазыВКластере;
                ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы = пИмяАдминистратораИнформационнойБазы;
                ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы = пПарольАдминистратораИнформационнойБазы;
                
                СтруктураСеанса = Новый Структура;
                СтруктураСеанса.Вставить("Свойство", "Номер");
                СтруктураСеанса.Вставить("ВидСравнения", ВидСравнения.ВСписке);
                СтруктураСеанса.Вставить("Значение", НомераСеансов);
                Фильтр = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СтруктураСеанса);
                
                АдминистрированиеКластераКлиентСервер.УдалитьСеансыИнформационнойБазы(ПараметрыАдминистрирования, ПараметрыАдминистрированияИБ, Фильтр);
                //АдминистрированиеКластераRASКлиентСервер.УдалитьСеансыИнформационнойБазы(ПараметрыАдминистрирования, ПараметрыАдминистрированияИБ, Фильтр); //для Linux
                
                ЗаписьЖурналаРегистрации("УдалениеПользователейВНочи", УровеньЖурналаРегистрации.Информация, , , "Список пользователей к отключению: " + стСписокКРасстрелу);
                
            КонецЕсли;    
        КонецЕсли;    
    КонецЕсли;    
    
КонецПроцедуры
10 AlexYurg
 
02.11.18
16:40
(8) Насчет "интервала перезапуска" есть разные мнения. Это борьба с утечкой памяти.
11 AlexYurg
 
02.11.18
16:40
(9) Спасибо!
12 Winnie Buh
 
02.11.18
17:23
(0) RDP нет?
13 Вафель
 
02.11.18
17:30
(10) не рекомендуют, потому что не понятно в какое время будет этот перезапуск.
Если он придется на время работы юзеров, то никому не понравится
14 AlexYurg
 
02.11.18
17:42
(12) Нет
(13) Согласен, но на обсуждаемую проблему это никак не влияет.
2 + 2 = 3.9999999999999999999999999999999...