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

Сегодня мы проведем обзор изменений, касающихся работы с высоконагруженными системами 1С. Новый релиз предлагает не просто несколько точечных исправлений, а целый арсенал специализированных функций, призванных существенно ускорить выполнение типичных для 1С операций, снизить нагрузку на инфраструктуру и упростить администрирование. Спектр улучшений распространился на многие ключевые узлы производительности от оптимизации работы с временными таблицами и сложными запросами RLS (row-level security) до ускорения критически важных процессов наподобие «Закрытия месяца». Обо всем этом и пойдет речь в статье.

22.07.2025    1011    Tantor    2    

7

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

Расскажем об опыте внедрения технологии CoW (Copy-On-Write). Вы узнаете, как CoW помогает экономить терабайты дискового пространства с минимальными накладными расходами, а также как интегрировать ее в рабочие процессы разработки и тестирования. Автор кратко объяснит суть CoW, поделится выбором файловой системы (xfs или btrfs?), расскажет, как его команда управляет подтомами прямо из 1С и почему они выбрали MS SQL для Linux. Отдельно он разберет влияние CoW на CI-процессы: как это помогает анализировать длительные регрессы и ускоряет развертывание баз.

22.07.2025    408    Golovanoff    4    

6

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

В современных Windows 10 и 11 можно использовать WSL (Windows Subsystem for Linux) для запуска Linux окружения. Возникает соблазнительная мысль: может, PostgreSQL и сервер 1С запустить в WSL. Или даже хуже: в Docker на WSL. Знал бы, что будет сложно - даже не начинал :) Сложность кроется в том, что WSL это не полноценные виртуалки, а легковестные контейнеры Hyper-V с особенностями сети и GUI. Из плюсов, наверно, только размер и скорость запуска.

21.07.2025    674    FSerg    2    

4

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

В статье подробно разберем, как в компании организован процесс миграции на PostgreSQL, начиная с подготовки команды, предварительного анализа 1С-систем (с использованием специальных чек-листов и инструментов для аудита) и заканчивая тонкой настройкой PostgreSQL. Расскажем о системе автоматизированного тестирования, которая позволяет сравнивать производительность на MS SQL и PostgreSQL без трудоемких ручных проверок. Особое внимание уделим проблемам, которые возникли при миграции систем объемом 20+ ТБ, и способам их решения. А также поразмышляем о том, что нужно было бы сделать по-другому, если бы этот проект пришлось начинать заново.

10.07.2025    926    leongl    0    

8

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

В финальной статье по докладу «Дамп – не приговор, а повод задуматься», с которым выступили на осенней конференции INFOSTART TECH EVENT 2024, рассказываем, чем может быть полезна информация, полученная из дампа.

27.05.2025    1815    it-expertise    0    

12

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

Клиент-серверная архитектура 1С Предприятия 8.3 подразумевает работу в связке с так называемой системой управления базами данных (СУБД). Одной из самых распространённых и популярных до сих пор остается MS SQL Server.

19.05.2025    3579    Kostin1978    6    

4

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

Рассмотрим, почему при обновлении итогов регистров накопления СУБД может выбирать неоптимальный план запроса, и как это исправить.

28.04.2025    2884    Tantor    7    

26

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

Во второй статье по докладу «Дамп – не приговор, а повод задуматься», с которым выступили на конференции INFOSTART TECH EVENT 2024, рассмотрим, какую информацию содержат файлы дампа, чем она полезна и как ее анализировать.

14.04.2025    1715    it-expertise    7    

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