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

См. также

Устранение ошибки выполнения скрипта "Создать сервис RAGENT" в ЦКК

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

В статье показано, как устранить ошибку выполнения скрипта "Создать сервис RAGENT" в системах 1С:Центр контроля качества или в 1С:Центр автоматизации. Будет полезна администраторам ЦКК и ЦА, которые только начали знакомство с этими системами.

вчера в 17:30    117    artemusII    0    

1

Долгая реструктуризация, замеры времени и очистка Ветис. Розница 2.3

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

При подготовке к обновлению возникли проблемы на стадии тестирования и исправления базы данных, также при создании файлов РИБ для магазинов.

16.04.2024    241    xKaskadx    4    

0

Установка и получение лицензии на базовую конфигурацию 1С на Mac OS

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

Установить купленную базовую конфигурацию 1С и получить лицензию на MAC OS не так просто, как кажется на первый взгляд и как хотелось бы. Официально в системных требованиях на базовую конфигурации 1С пишет всякие виндовсы и пару-тройку линуксов. МакОс там нет. В статье расскажу, как все-таки поставить на Мак базовую конфигурацию 1С.

11.04.2024    340    pahmutov    0    

2

Установка тонкого клиента 1С на Rasbian (Raspberry Pi 5)

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

После приобретения Raspberry Pi 5 решил проверить, есть ли возможность использования устройства для организации тонкого клиента. В результате столкнулся с особенностью установки 1С: Предприятие 8.3.23 на Raspbian, решением которой я хочу поделиться с сообществом.

07.04.2024    595    Bessome    3    

5

Порционный шринк базы

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

Скрипт позволяет высвобождать место в операционную систему, занятое файлом базы MS SQL в итерациях с заданным количеством мегабайт

28.03.2024    1269    Garilia    3    

15

Создаем сценарии обслуживания SQL в Центре Контроля Качества 1С (Центр Администрирования)

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

Данная статья научит вас, как создавать скрипты обслуживания MS SQL для Центра Контроля Качества (ЦКК) или Центра Администрирования (ЦА).

20.03.2024    737    Silenser    0    

5

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    5897    dsdred    53    

83

Инструкция по установке Postgres для OLTP приложений и 1С. Часть 1. Базовая конфигурация

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

В Postgres достаточно подробная документация, и, видимо, поэтому при инсталляции Postgres для 1С большинство параметров приходится выставлять самим. Параметров в Postgres много, а составить эффективную комбинацию не так просто. Все упрощается, если рассмотреть профиль нагрузки, например, 1С это прежде всего профиль OLTP нагрузки – так устроены его метаданные (объекты). Если сосредоточиться на оптимизации профиля OLTP, понимание Postgres сразу упростится.

15.02.2024    2537    1CUnlimited    14    

28
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Torin 747 28.01.22 15:12 Сейчас в теме
и в зависимости от этого количества принимает решение запускать 1С или нет
- кто определяет количество ? и кто принимает решение? - можно чуть поподробнее..
+
3. KOTzilla 16 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(НужноеВамКоличество) 


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

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

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