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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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