Привязать рабочее место к имени компьютера
Во всех типовых конфигурациях рабочее место привязывается к идентификатору клиента. Он хранится в файле, который периодически может меняться. Если база файловая, часто после ее лечения через chkdbfl идентификатор меняется.
В итоге создается новое рабочее место, приходится перепрописывать оборудование. Это создает лишний ненужный объем поддержки.
В итоге проще заранее озаботиться тем, чтобы рабочее место было привязано к имени компьютера. А если используется RDP, можно доработать чтобы помимо имени компьютера использовалось еще и имя пользователя сеанса (в этой статье не рассмотрено).
Я реализовал этот подход на старой отраслевой конфигурации, но и в современных конфигурациях на БСП все работает так же.
Перед началом работы системы нужно записать имя компьютера клиента в добавленный параметр сеанса _ИмяКомпьютераПользователя:
Процедура ПередНачаломРаботыСистемы() //В начале процедуры _Сервер.УстановитьИмяКомпьютераПользователя(ИмяКомпьютера()); ... КонецПроцедуры Функция УстановитьИмяКомпьютераПользователя(ИмяКомпьютера) Экспорт УстановитьПривилегированныйРежим(Истина); ПараметрыСеанса._ИмяКомпьютераПользователя = ИмяКомпьютера; КонецФункции Функция ПолучитьИмяКомпьютераПользователя() Экспорт УстановитьПривилегированныйРежим(Истина); Возврат ПараметрыСеанса._ИмяКомпьютераПользователя; КонецФункции
Системная информация содержит много информации, но почему-то не содержит имя компьютера клиента, приходится сохранять самим.
Далее пишем функцию, которая получает рабочее место по имени компьютера:
Функция ПолучитьРабочееМестоПоИмениКомпьютера(ИмяКомпьютера) Экспорт УстановитьПривилегированныйРежим(Истина); З = Новый Запрос( "ВЫБРАТЬ | РабочиеМеста.Ссылка |ИЗ | Справочник.РабочиеМеста КАК РабочиеМеста |ГДЕ | РабочиеМеста.ИмяКомпьютера = &ИмяКомпьютера | И НЕ РабочиеМеста.ПометкаУдаления"); З.УстановитьПараметр("ИмяКомпьютера", ИмяКомпьютера); Выборка = З.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Возврат Выборка.Ссылка; КонецЕсли; КонецФункции
Лишние рабочие места нужно пометить на удаление, чтобы по имени компьютера выдавалось только одно рабочее место.
В модуле МенеджерОборудованияВызовСервера подменяем определение текущего рабочего места:
// Процедура устанавливает значения параметров сеанса, относящихся к подключаемому оборудованию. // Процедура УстановитьПараметрыСеансаПодключаемогоОборудования(ИмяПараметра, УстановленныеПараметры) Экспорт Если ИмяПараметра = "РабочееМестоКлиента" Тогда // Если с идентификатором клиента текущего сеанса связано одно рабочее место, // то его сразу и запишем в параметры сеанса. ТекущееРМ = Справочники.РабочиеМеста.ПустаяСсылка(); СистемнаяИнформация = Новый СистемнаяИнформация(); СписокРМ = НайтиРабочиеМестаПоИД(ВРег(СистемнаяИнформация.ИдентификаторКлиента)); Если СписокРМ.Количество() = 0 Тогда // Будет создано с клиента. Иначе ТекущееРМ = СписокРМ[0]; КонецЕсли; //Осипов 25.10.22 подмена рабочего места компьютера ИмяКомпьютера = _Сервер.ПолучитьИмяКомпьютераПользователя(); РабочееМестоПоИмениКомпьютера = _Сервер.ПолучитьРабочееМестоПоИмениКомпьютера(ИмяКомпьютера); Если ЗначениеЗаполнено(РабочееМестоПоИмениКомпьютера) Тогда ТекущееРМ = РабочееМестоПоИмениКомпьютера; КонецЕсли; УстановитьРабочееМестоКлиента(ТекущееРМ); Если ТипЗнч(УстановленныеПараметры) = Тип("Структура") Тогда УстановленныеПараметры.Вставить("РабочееМестоКлиента"); Иначе УстановленныеПараметры.Добавить("РабочееМестоКлиента"); КонецЕсли; КонецЕсли; КонецПроцедуры
В справочнике рабочие места делаем возможным редактирование имени компьютера и идентификатора рабочего места, а также убираем странный код по установке имени компьютера при открытии:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ... #Если Не ВебКлиент Тогда //Осипов 25.10.22 - чтобы имя компьютера не менялось //Объект.ИмяКомпьютера = ИмяКомпьютера(); #КонецЕсли //Осипов 25.10.22 Элементы.Основные.Видимость = истина; //Видимость группы, в которой размещено имя компьютера Элементы.Код.ТолькоПросмотр = ложь; ... КонецПроцедуры
После этого рабочее место всегда привязано к имени компьютера.
Как-то я разрабатывал расширение для Розницы 2.3 (современной конфигурации на БСП), которое работает аналогичным образом. Выложу его описание чуть позже.




1. Параметр сеанса инициализируется неправильно
2. Выборка в запросе не гарантирует устойчивый результат
1. а как правильно, если работает?
2. что подразумевается под устойчивым результатом в этом контексте?
Это демонстрация доработок трёхлетней давности?
да, этому решению много лет. 😉
недавно актуализировалось, делал у клиента, решил написать статейку.