Привязать рабочее место к имени компьютера

Во всех типовых конфигурациях рабочее место привязывается к идентификатору клиента. Он хранится в файле, который периодически может меняться. Если база файловая, часто после ее лечения через chkdbfl идентификатор меняется.

В итоге создается новое рабочее место, приходится перепрописывать оборудование. Это создает лишний ненужный объем поддержки.

В итоге проще заранее озаботиться тем, чтобы рабочее место было привязано к имени компьютера. А если используется RDP, можно доработать чтобы помимо имени компьютера использовалось еще и имя пользователя сеанса (в этой статье не рассмотрено).

Я реализовал этот подход на старой отраслевой конфигурации, но и в современных конфигурациях на БСП все работает так же.

Перед началом работы системы нужно записать имя компьютера клиента в добавленный параметр сеанса _ИмяКомпьютераПользователя:

Процедура ПередНачаломРаботыСистемы()
	
	//В начале процедуры
	_Сервер.УстановитьИмяКомпьютераПользователя(ИмяКомпьютера()); 
	...
КонецПроцедуры

Функция УстановитьИмяКомпьютераПользователя(ИмяКомпьютера) Экспорт
	УстановитьПривилегированныйРежим(Истина);
	ПараметрыСеанса._ИмяКомпьютераПользователя = ИмяКомпьютера;
КонецФункции

Функция ПолучитьИмяКомпьютераПользователя() Экспорт
	УстановитьПривилегированныйРежим(Истина);
	Возврат ПараметрыСеанса._ИмяКомпьютераПользователя;
КонецФункции

Системная информация содержит много информации, но почему-то не содержит имя компьютера клиента, приходится сохранять самим.

Далее пишем функцию, которая получает рабочее место по имени компьютера:

Функция ПолучитьРабочееМестоПоИмениКомпьютера(ИмяКомпьютера) Экспорт
	УстановитьПривилегированныйРежим(Истина);
	З = Новый Запрос(
	"ВЫБРАТЬ
	|	РабочиеМеста.Ссылка
	|ИЗ
	|	Справочник.РабочиеМеста КАК РабочиеМеста
	|ГДЕ
	|	РабочиеМеста.ИмяКомпьютера = &ИмяКомпьютера
	|	И НЕ РабочиеМеста.ПометкаУдаления");
	З.УстановитьПараметр("ИмяКомпьютера", ИмяКомпьютера);
	Выборка = З.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат Выборка.Ссылка;
	КонецЕсли;
КонецФункции


Лишние рабочие места нужно пометить на удаление, чтобы по имени компьютера выдавалось только одно рабочее место.

В модуле МенеджерОборудованияВызовСервера подменяем определение текущего рабочего места:

// Процедура устанавливает значения параметров сеанса, относящихся к подключаемому оборудованию.
//
Процедура УстановитьПараметрыСеансаПодключаемогоОборудования(ИмяПараметра, УстановленныеПараметры) Экспорт

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

В справочнике рабочие места делаем возможным редактирование имени компьютера и идентификатора рабочего места, а также убираем странный код по установке имени компьютера при открытии:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	...
	#Если Не ВебКлиент Тогда
	//Осипов 25.10.22 - чтобы имя компьютера не менялось
	//Объект.ИмяКомпьютера = ИмяКомпьютера();
	#КонецЕсли
	
	//Осипов 25.10.22
	Элементы.Основные.Видимость = истина; //Видимость группы, в которой размещено имя компьютера
	Элементы.Код.ТолькоПросмотр = ложь;
	...

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

После этого рабочее место всегда привязано к имени компьютера.

Как-то я разрабатывал расширение для Розницы 2.3 (современной конфигурации на БСП), которое работает аналогичным образом. Выложу его описание чуть позже.

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

комментария 4

  1. rzd:

    1. Параметр сеанса инициализируется неправильно
    2. Выборка в запросе не гарантирует устойчивый результат

    • 1. а как правильно, если работает?
      2. что подразумевается под устойчивым результатом в этом контексте?

  2. Петуч:

    Это демонстрация доработок трёхлетней давности?

    • да, этому решению много лет. 😉
      недавно актуализировалось, делал у клиента, решил написать статейку.

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

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