Ограничение количества запущенных процессов 1С в разрезе пользователей

01.06.22

База данных - Администрирование СУБД

Целью данной статьи является описание решения для ограничения количества, запускаемых пользователем, процессов 1С, чтобы снизить нагрузку на сервер. Может пригодиться как программистам, так и системным администраторам. ОСТОРОЖНО! под катом Python=)

Описание проблемы:

Консалтинговая фирма, много пользователей и много баз, как файловых так и серверных. Каждый пользователь запускает по несколько баз одновременно (абсолютный призер запускал 15 баз). Нетрудно догадаться, что все это дело сказывается на производительности работы самого сервера и тот, в свою очередь, люто, бешено тормозит.

Решение: 

Перелопатив все эти ваши интернеты подходящее решение не нашел, из интересного был найден один вариант на ассемблере, но моя смелая попытка на ходу вникнуть в этот язык низкоуровневого программирования увенчалась крахом.

И как настоящий "тыж программист" взял на вооружение Python. Сам скрипт формирует список активных процессов текущего пользователя, в список пишется пара (процесс - пользователь), далее скрипт считает количество таких пар в списке

CountList1cv8c = List1cv8c.count("1cv8c.exe") 

CountList1cv8c - переменная содержит количество совпадений в списке "List1cv8c" по имени процесса "1cv8c.exe", это процесс собственно самой 1С.

CountList1cestart = List1cestart.count("1cv8s.exe") 

CountList1cestart - переменная содержит количество совпадений в списке "List1cestart" по имени процесса "1cv8s.exe", это процесс 1С стартера (окно в котором выбирается запускаемая база). Ограничение по количеству стартеров, сделано для того, чтобы пользователь, не могу запустить сначала большое количество окон стартера и затем открыть столько же 1С, т.к. скрипт отрабатывает только во время запуска ярлыка.

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

if CountList1cv8c < Num: 
    os.startfile(r'C:\Program Files (x86)\1cv8\common\1cestart.exe')

Num - это переменная содержит число, обозначающее максимальное количество запускаемых баз пользователем. Передается через вызов функции "OpenCount1C(Num)"

В листинге кода указаны частные примеры.

elif USERNAME == 'Бухгалтер1':
    OpenCount1C(8)

Например для пользователя с учетной записью Windows "Бухгалтер1", будет стоять ограничение в 8 запускаемых баз 1С.

Сам скрипт запускается через ярлык и его настройку, меняем стандартный путь, на путь до нашего скрипта

 
 Ярлык 1С
 
 Код скрипта

 

Описание решения:

Особенности PIP install для Python 3 на Windows

Порядок действий:

  1. Скачивается с интернета инсталляционный скрипт get-pip.py. Скрипт можно сохранять в любую папку на усмотрение пользователя. Пусть это будет, к примеру, папка «Загрузки».
  2. Открывается командная строка и осуществляется переход к каталогу командой cd, куда скачан файл get-pip.py (в нашем случае это папка «Загрузки»).
  3. Выполняем команду:python get-pip.py

Основная библиотека

Основная используемая библиотека в скрипте psutil ставится командой (если вы установили PIP install из описания выше)

py -m pip install psutil

на 28.01.2022 работала с версией Питона 3.7, а не с актуалом. Как установить сам Питон версии 3.7 расписывать не буду ибо этого добра в интернете хватает.

Почему psutil, а не например wmi? Сам по себе Питон не шибко быстрый язык, на сервере в 1000 фоновых процессов скрипт с psutil отрабатывает 10 секунд, на wmi подобный скрипт работает 38 секунд.

Особенности кода

Так же обратите внимание на строку:

if p.info['name'] == "1cv8c.exe" and p.info['username'] is not None:

p.info['username'] is not None - проверка имени пользователя происходит не по заполненной переменной с именем этого пользователя, а по значению NULL (если приводить аналог с  1С терминами), дело в том, что psutil показывает владельца процесса только у текущего пользователя, для остальных это NULL, поэтому гораздо проще отсечь пустые значения.

 
 Пример получаемых данных по имени процесса

Конвертация в исполняемый файл

 Для запуска 1С через ярлык, необходимо конвертировать наш скрипт в исполняемый файл. Поможет нам в этом конвертатор под названием auto-py-to-exe или любой другой. Ставится командой.

py -m pip install auto-py-to-exe

Далее переходим в папку где лежит конвертатор и запускаем auto-py-to-exe

 
 C:\Users\ВашПользователь\AppData\Local\Programs\Python\Python37\Scripts\
 
  Очередность нажатия кнопок, фото стырено откуда-то из интернета=)

Запускается конвертация и в той же папке с конвертатором, но уже в подпапке \output , появится исполняемый файл.

См. также

HighLoad оптимизация Администрирование СУБД Программист Платформа 1С v8.3 Бесплатно (free)

В рамках мастер-класса мы запустим нагрузочный тест на 3К пользователей и посмотрим, как будет вести себя PostgreSQL при такой нагрузке.

11.12.2024    1434    Tantor    1    

6

Администрирование СУБД Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Бесплатно (free)

Много вариантов определения номера собственного процесса самого 1С8. В ходе поиска, опираясь на общедоступную информацию, дополнил алгоритм, но с учетом определения ИД запущенного приложения.

09.12.2024    679    artly2000    6    

4

Администрирование СУБД Системный администратор Программист

В крупных компаниях, где много типовых и сильно доработанных баз с режимом работы 24/7, переход с MS SQL на PostgreSQL затягивается. Получается гетерогенная структура – когда прод уже на PostgreSQL, а разработка и тестирование – пока на MS SQL. О том, какие варианты помогут постепенно перевести прод с несколькими базами MS SQL на PostgreSQL, не сломав среду тестирования и разработки, пойдет речь в статье.

21.11.2024    3757    a.doroshkevich    8    

16

HighLoad оптимизация Администрирование СУБД Системный администратор Программист Платформа 1С v8.3 Россия Бесплатно (free)

Мы исследуем проблему долгого выполнения запросов PostgreSQL при использовании конструкции VALUES: когда она возникает, как на нее можно повлиять, а главное, почему ее продуманная отработка важна для более быстрого функционирования решений на базе 1С

12.11.2024    1456    Tantor    20    

18

HighLoad оптимизация Администрирование СУБД Механизмы платформы 1С Программист Платформа 1С v8.3 ИТ-компания Россия Бесплатно (free)

В данной статье мы рассмотрим, как работает механизм временных таблиц на postgres на платформе 8.3.23 и что изменилось в нем при добавлении новых возможностей в платформе 8.3.25. А также на примере покажу, как понимание работы платформы позволяет оптимизировать СУБД для работы с 1С.

29.10.2024    4744    Tantor    38    

37

Администрирование СУБД Системный администратор Программист Бесплатно (free)

CDC - очень мощный механизм, который можно использовать во многих сценариях, возможность развернуть его в Docker показывает простоту и лёгкость данной технологии.

08.10.2024    1473    AlexSvoykin    2    

7

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

Анализ и решение ошибок СУБД. Во время реиндексации базы Ошибка СУБД: Microsoft SQL Server Native Client 11.0: Не удалось найти объект "ИмяБазы.dbo._RefSInf21806", так как он не существует, или отсутствуют разрешения. Во время проверки целостности Ошибка СУБД: Microsoft SQL Server Native Client 11.0: Недопустимое имя объекта "dbo._RefSInf21806".

19.09.2024    6164    Xershi    10    

19
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Torin 836 28.01.22 15:12 Сейчас в теме
и в зависимости от этого количества принимает решение запускать 1С или нет
- кто определяет количество ? и кто принимает решение? - можно чуть поподробнее..
3. KOTzilla 23 28.01.22 22:31 Сейчас в теме
(1) Количество разрешенных процессов, определяется в процедуре OpenCount1C(Num)

Если вам не нужно ранжирование по конкретным пользователям, можете заменить этот кусок кода
#Настраиваем ограничения по пользователям
USERNAME = os.environ.get( "USERNAME" )
if USERNAME == 'Собственник': #для Собственника вообще не будет отрабатывать ограничение
    os.startfile(r'C:\Program Files (x86)\1cv8\common\1cestart.exe')
elif USERNAME == 'Бухгалтер1': #для Бухгалтер1 это будет 8 баз
    OpenCount1C(8)
elif USERNAME == 'Бухгалтер2': #для Бухгалтер2 это будет 12 баз
    OpenCount1C(12) 
else:
    OpenCount1C(4) # для всех остальных 4 базы
Показать

на прямой вызов процедуры

 OpenCount1C(НужноеВамКоличество) 


Переделать скрипт под себя, как мне кажется, не составит труда.
5. Torin 836 28.01.22 23:49 Сейчас в теме
(3)Спасибо за подробности ! +
2. bulpi 217 28.01.22 17:04 Сейчас в теме
Все это можно сделать прямо на 1с
4. KOTzilla 23 28.01.22 22:49 Сейчас в теме
(2) Не совсем понимаю как это возможно.
Если я не ошибаюсь, то каждая база может работать только со своим списком сессий. Т.е. я могу отработать из 1С дубликаты подключения к одной базе в виде сеансов пользователя.
В моем же случае все базы разные. И даже если пользователь не сможет запустить одну и ту же базу повторно, что запретит ему открыть 15 разных. Получится 15 одиночных сеансов на 15-ти разных базах под одним пользователем.
6. bulpi 217 29.01.22 13:08 Сейчас в теме
(4)
ИМХО, можно проанализировать подключения к разным базам, используя объект :

Коннектор = Новый COMОбъект("v83.COMConnector");
	Агент = Коннектор.ConnectAgent(ИмяСервера);
	Кластеры = Агент.GetClusters();
	Для каждого Кластер из Кластеры Цикл
		Агент.Authenticate(Кластер, "Имя", "Пароль");
		Процессы = Агент.GetWorkingProcesses(Кластер);
		Для каждого Процесс из Процессы Цикл
			Порт = Процесс.MainPort;
			Если Строка(Порт)="0" Тогда
				Продолжить;
			КонецЕсли;	
			// теперь есть адрес и порт для подключения к рабочему процессу
			РабПроц = Коннектор.ConnectWorkingProcess(ИмяСервера + ":" + СтрЗаменить(Порт, Символы.НПП, ""));
			РабПроц.AddAuthentication("Имя", "Пароль");
			
			ИнформационнаяБаза = "";
			
			Базы = Агент.GetInfoBases(Кластер);
			Для каждого База из Базы Цикл
Показать

И т.д.
Apo; KOTzilla; +2 Ответить
7. KOTzilla 23 31.01.22 13:25 Сейчас в теме
(6)
Задумка прикольная, оценил, даже не знал, что 1С может так работать с процессами. В данном случае это больше не подойдет чем подойдет, опять же тут скорее особенности именно моего частного случая. Раздумывая над архитектурой, которая может быть написана по принципу этого кода, вот что меня насторожило:
1) Отсутствие гибкости метода, хотелось бы - "поставил и забыл". Такой код в фоновое задание не засунуть, ведь он должен обрабатываться в начале старта работы системы. Получается его надо распихивать по всем базам и держать в актуальном состоянии, появился новый клиент, прислал свою базу, накатил на него расширение. Дописал/исправил/обновил расширение, полез по всем базам обновлять на новую версию. А теперь представьте что у вас таких баз под сотню и треть из этого числа динамически меняется.
2) Скорость работы. Мое ИМХО опять же, что такие вещи должны обрабатываться на этапе вызова процесса, а не после того как пользователь выбрал базу, написал логин/пароль а тут на тебе, "сюрприз", вход запрещен. (и вот вам крест, есть пользователи, которые ну очень медленно пишут и это в эпоху-то всеобщей информатизации).
Оставьте свое сообщение