Описание проблемы:
Консалтинговая фирма, много пользователей и много баз, как файловых так и серверных. Каждый пользователь запускает по несколько баз одновременно (абсолютный призер запускал 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С.
Сам скрипт запускается через ярлык и его настройку, меняем стандартный путь, на путь до нашего скрипта
Описание решения:
Особенности PIP install для Python 3 на Windows
Порядок действий:
- Скачивается с интернета инсталляционный скрипт get-pip.py. Скрипт можно сохранять в любую папку на усмотрение пользователя. Пусть это будет, к примеру, папка «Загрузки».
- Открывается командная строка и осуществляется переход к каталогу командой cd, куда скачан файл get-pip.py (в нашем случае это папка «Загрузки»).
- Выполняем команду: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
Запускается конвертация и в той же папке с конвертатором, но уже в подпапке \output , появится исполняемый файл.