Ограничение количества запущенных процессов 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 , появится исполняемый файл.

См. также

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

Пользовался ранее https://infostart.ru/1c/articles/1120161/#, но она устарела, т.к. службы запускаются через systemctl, да и сами службы слегка изменились. Возможно, где-то на ИТС уже есть нужная инструкция, но мне не попалась.

15.11.2024    301    Baser    2    

1

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

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

12.11.2024    830    Tantor    19    

14

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

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

29.10.2024    3148    Tantor    38    

34

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

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

08.10.2024    734    AlexSvoykin    1    

7

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

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

19.09.2024    4349    Xershi    10    

17

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

Бэкап в Postgres состоит из набора граблей, которые нужно обойти для успешного восстановления. Они заложены в самых неожиданных местах от предмета резервного копирования (база или кластер) до структуры каталогов. Один неверный шаг и восстановление будет невозможным. Почему нельзя было сделать проще, как в MS SQL или Oracle? Почему бэкап в Postgres оставляет впечатление чьей-то лабораторной работы? Статья адресована прежде всего специалистам 1С, избалованным комфортом в MS SQL, в суровых буднях импортозамещения на Postgres.

13.08.2024    2972    1CUnlimited    9    

4
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Torin 826 28.01.22 15:12 Сейчас в теме
и в зависимости от этого количества принимает решение запускать 1С или нет
- кто определяет количество ? и кто принимает решение? - можно чуть поподробнее..
3. KOTzilla 22 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 826 28.01.22 23:49 Сейчас в теме
(3)Спасибо за подробности ! +
2. bulpi 217 28.01.22 17:04 Сейчас в теме
Все это можно сделать прямо на 1с
4. KOTzilla 22 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 22 31.01.22 13:25 Сейчас в теме
(6)
Задумка прикольная, оценил, даже не знал, что 1С может так работать с процессами. В данном случае это больше не подойдет чем подойдет, опять же тут скорее особенности именно моего частного случая. Раздумывая над архитектурой, которая может быть написана по принципу этого кода, вот что меня насторожило:
1) Отсутствие гибкости метода, хотелось бы - "поставил и забыл". Такой код в фоновое задание не засунуть, ведь он должен обрабатываться в начале старта работы системы. Получается его надо распихивать по всем базам и держать в актуальном состоянии, появился новый клиент, прислал свою базу, накатил на него расширение. Дописал/исправил/обновил расширение, полез по всем базам обновлять на новую версию. А теперь представьте что у вас таких баз под сотню и треть из этого числа динамически меняется.
2) Скорость работы. Мое ИМХО опять же, что такие вещи должны обрабатываться на этапе вызова процесса, а не после того как пользователь выбрал базу, написал логин/пароль а тут на тебе, "сюрприз", вход запрещен. (и вот вам крест, есть пользователи, которые ну очень медленно пишут и это в эпоху-то всеобщей информатизации).
Оставьте свое сообщение