Как реализовать отключение пользователей в случае простоя — для экономии количества задействованных лицензий (1С: Программисту)

Конфигурации 1С, предоставляемые партнерами фирмы 1С, обычно защищены лицензиями.

Расход лицензий при этом осуществляется «покомпьютерно». Т.е. если на одном компьютере запустить несколько экземпляров 1С:Предприятия, то на все будет затрачена одна лицензия.

Чтобы не покупать лишние лицензии, а также чтобы пользователи не запускали 1С и не уходили «гулять», заняв при этом лицензию, можно реализовать следующее ограничение.

Как оно работает: каждые полчаса на каждом клиентском месте осуществляется проверка задействованных лицензий. В том случае, когда общее количество израсходованных лицензий на всех компютерах больше заданного (например, больше девяти), пользователю предлагается подтвердить работу в системе (достаточно нажать на кнопку «Enter»). Если пользователь этого не сделал, то это означает, что его нет на месте и лицензию можно освободить.

При этом срабатывают следующие ограничения:

  • если у пользователя открыто какое-то окно в модальном режиме (например, окно проверки версии конфигурации), то вопрос задан не будет («особо умные пользователи» могут перед уходом открывать модальное окно и их не выкинет из базы)
  • если у пользователя открыта модифицированная форма (окно со звездочкой), то выход не будет осуществлен, пока он не сохранит форму.

Рассмотрим на примере конфигурации логистики «Акселот».
В процедуре ПриНачалеРаботыСистемы() модуля приложения вставляем строки кода:

	//отключение бездействующих пользователей
	Если НЕ ИмяПользователя() = "ТСД"  Тогда
		ПодключитьОбработчикОжидания("ПроверитьПростойПользователя", 1800);  // 1800с - 30 минут
	КонецЕсли;

Сама процедура, вызываемая обработчиком ожидания:

Процедура ПроверитьПростойПользователя() Экспорт
	мсСоединений = ПолучитьСоединенияИнформационнойБазы();
	мсУчтенныхКомпьютеров = Новый Массив;

	Для Каждого ТекСписок Из мсСоединений Цикл
		Если ТекСписок.ИмяПриложения = "1CV8" и ТекСписок.Пользователь <> "ТСД" И мсУчтенныхКомпьютеров.Найти(ТекСписок.ИмяКомпьютера) = Неопределено Тогда
			мсУчтенныхКомпьютеров.Добавить(ТекСписок.ИмяКомпьютера); // один компьютер - одна лицензия
		КонецЕсли;
	КонецЦикла;

	Если мсУчтенныхКомпьютеров.Количество() > 9 И НЕ ИмяПользователя() = "Имя_Разработчика" Тогда // Начинаем принимать меры, если израсходовано больше 9 лицензий (к примеру), при этом пощадим (не будем выкидывать) сами себя ;) 

		Ответ = Вопрос("Подтвердите работу в системе",РежимДиалогаВопрос.ОК,120, ,"Нужна лицензия!");

		Если Ответ = КодВозвратаДиалога.Таймаут Тогда
			ЗавершитьРаботуСистемы(Истина);
			// осуществим запись в журнал регистрации (чтобы видеть, кого выкидывало из базы)
			ЗаписьЖурналаРегистрации("Завершение работы при длительном простое", УровеньЖурналаРегистрации.Информация,,Справочники.ахПользователи.НайтиПоКоду(ПользователиИнформационнойБазы.ТекущийПользователь()));
		КонецЕсли;

	КонецЕсли;

	мсУчтенныхКомпьютеров.Очистить();

КонецПроцедуры

3 thoughts on “Как реализовать отключение пользователей в случае простоя — для экономии количества задействованных лицензий (1С: Программисту)

  1. Не совсем мне это понятно.

    Стоит в сети сервак на винде-7, заделан под термсервер, стоит ключ на 5 сетевых пользователей. Стоит на нем 1с 8.2.

    Заходят одновременно 5 пользователей под своими учетками удаленно через терминальный режим. Заходит 6й, и тоже входит в базу, и спокойно работает!

    Как такое может быть?

    • Artem, ключ на 5 + каждая программа 1с сама по себе дает одно пользовательское место

    • значит либо дополнительные лицензии есть, либо применена таблетка от жадности

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *