Настройка торгового оборудования в конфигурации "Управление торговлей" ред. 10.3 при работе в терминальном режиме

Оборудование - Сканер штрих-кода

У пользователей 1С:Управление торговлей, использующих терминальный доступ для работы в программе, могут возникнуть проблемы при подключении торгового оборудования. Эти проблемы связаны с тем, что в конфигурации УТ 10.3 настройки торгового оборудования хранятся с привязкой к имени компьютера, а работа в режиме терминального доступа означает, что у всех работающих с программой будет одно и тоже имя компьютера. В статье рассмотрим способы решения данной проблемы.

Настройки торгового оборудования в конфигурации "Управление торговлей" ред. 10.3 хранятся в регистре сведений "Торговое оборудование":

Каждое оборудование привязывается к имени компьютера. Соответственно, если мы работаем в терминальном режиме, имя компьютера у нас получается одно и то же у каждого пользователя. Поэтому оборудования добавленное для одного пользователя получится подключенным к каждому сотруднику, работающему с программой. Это очень часто приводит к ошибкам, таким, как невозможность подключения любого оборудования с одним com портом на разных компьютерах, также если у одного из пользователей будет подключено оборудование (например, com-портовый сканер штрих кодов), то у всех остальных пользователей, работающих с программой, будет выскакивать ошибка, что это устройство у них не подключено.

Решение проблемы становится очевидным, это добавление к имени компьютера информации о пользователе. Это решит проблему и позволит делать независимую настройку торгового оборудования для каждого пользователя. Имя компьютера 1С получает в обработке "ТОСервер", в функции ПолучитьИмяКомпьютераТО. Вот текст этой функции:





// Функция возвращает строку c именем компьютера для нужд торгового оборудования.
//
// Возвращаемое значение:
//  Строка - имя компьютера для торгового оборудования.
//
Функция ПолучитьИмяКомпьютераТО() Экспорт

	Если мИмяКомпьютера = Неопределено Тогда
		мИмяКомпьютера = ВРег(ИмяКомпьютера());
	КонецЕсли;

	Возврат мИмяКомпьютера;

КонецФункции // ПолучитьИмяКомпьютераТО()

Штатными средствами 1С получить имя пользователя windows в терминальном сеансе мы не сможем. Поэтому если решать проблему штатными средствами 1С, то можно только получить имя пользователя в программе и прибавить его к имени компьютера, выглядеть это будет так:





// Функция возвращает строку c именем компьютера для нужд торгового оборудования.
//
// Возвращаемое значение:
//  Строка - имя компьютера для торгового оборудования.
//
Функция ПолучитьИмяКомпьютераТО() Экспорт

	Если мИмяКомпьютера = Неопределено Тогда
		мИмяКомпьютера = ВРег(ИмяКомпьютера()+ИмяПользователя());
	КонецЕсли;

	Возврат мИмяКомпьютера;

КонецФункции // ПолучитьИмяКомпьютераТО()

В таком случае, для пользователя с именем "Администратор" и сервером терминалов с именем "Server" данная процедура вернет имя компьютера равное "SERVERАДМИНИСТРАТОР". Это, конечно, решит нашу проблему, но в некоторых случаяюх это будет не совсем удобно. Например если у пользователя нет доступа к настройке торгового оборудования, а ему нужно, например, подключить сканер штрих кодов. В таком случае придется добавлять указанному пользователю права, заходить под ним в программу, настраивать ему необходимое оборудование и заново ограничить права. Поэтому рассмотрим еще один вариант решения данной проблемы.

Получить имя пользователя операционной системы в терминальном сеансе мы можем средствами Windows Script Host.  WSH позволит получить имя пользователя в терминале, которое можно также сложить с именем компьютера и получить уникальное значение для каждого пользователя в терминальной сессии. Выглядеть это будет так:





// Функция возвращает строку c именем компьютера для нужд торгового оборудования.
//
// Возвращаемое значение:
//  Строка - имя компьютера для торгового оборудования.
//
Функция ПолучитьИмяКомпьютераТО() Экспорт

	Если мИмяКомпьютера = Неопределено Тогда
		WSHNetwork = Новый ComОбъект("WScript.Network");
		ИмяПользователяWindows = WSHNetwork.UserName;
		мИмяКомпьютера = ВРег(ИмяКомпьютера()+ИмяПользователяWindows);
	КонецЕсли;

	Возврат мИмяКомпьютера;

КонецФункции // ПолучитьИмяКомпьютераТО()

При данной настройке, можно зайти в терминальной сессии пользователя в  программу 1С под правами администратора, настроить нужое пользователю оборудование, и у него все будет работать, когда он зайдет под собой в программу.

Вот два простых способа, позволяющих настраивать торговое оборудование иднивидуально под каждого пользователя. Данная проблема актуальна не только для УТ 10.3, но также и Рознице ред 1.0 и БП 2.0 - вобщем всем программным продуктам 1С на "не управляемых формах". В конфигурациях УТ 11, Розница 2.0, УНФ и прочих программных продуктах на управляемых формах работа с торговым оборудованием переделана и использует все новые преимущества БСП, поэтому данная проблема при использовании этих программ не возникает.

См. также

Комментарии
1. Николай Байдаков (Titan-nic@hotmail.ru) 12.04.17 17:45 Сейчас в теме
2. @Lexandr Zubov (@lexandr) 121 12.04.17 23:32 Сейчас в теме
3. Евгений Фербер (omut) 12.04.17 23:52 Сейчас в теме
УТ 10.3 в терминалке? 2017 год? Новая статья? Автор, вы гений. Пишите еще.
4. @Lexandr Zubov (@lexandr) 121 15.04.17 00:16 Сейчас в теме
(3)Есть клиенты которые еще на 7.5 работают (именно на 7.5, а не на 7.7 версии программы) и да год 2017, но нечего мешать если все работает.
WellMaster; Yury1001; Fejerverk; +3 Ответить
5. Евгений Фербер (omut) 15.04.17 11:21 Сейчас в теме
(4) я не про технологии, а про очередное переиздание вами много лет как широко известных решений.
6. Вадим . (ice-net) 17.04.17 09:19 Сейчас в теме
(5) А какая разница переиздание или нет? Вам от этого лучше/хуже? Не пригодилось - проходите мимо, пригодилось - отлично! Кому-то, возможно, поможет, а вот ваш негатив точно никому не поможет =)
Cat-Ek; madmos; +2 Ответить
10. Юрий Зайцев (Yury1001) 1439 19.04.17 11:02 Сейчас в теме
(4) да, да у меня такой есть, конфигурация Торговля 8. 1999 года с конвертирована с 7.5. Понятное дело что от оригинала там ничего не осталось тысячи часов доработок от десятка программистов и слезть с неё стоит 1 миллион рублей - вариантов нет.
7. Makc Saipl (Saipl) 6 17.04.17 19:05 Сейчас в теме
Мы решили эту проблему назначением каждому рабочему месту уникального СОМ - порта, 20 рабочих станций 20 СОМ -портов.
8. Роман Ложкин (webester) 24 18.04.17 10:35 Сейчас в теме
(0)Пара мелких замечаний: Навряд ли доставаемый вами параметр будет меняться при открытии каждой формы. Имеет смысл кэшировать. Выполнять один раз при старте системы и запоминать результат. Второе, если уж вы не против использования скриптов, результат работы которых иногда бывает непредсказуемым, то скриптом можно получить имя машины клиента подключенного к терминальному серверу. В таком случае 1С будет получать имя машины как будто она подключена без сервера терминалов. И да согласен с коллегами, вопрос, этот обжеван вроде как уже сотню другую раз. Вы скопировали уже существующее решение или не смогли осилить поиск? Не как предъява, просто интересно.
9. Дмитрий (Zombi) 3 19.04.17 08:15 Сейчас в теме
Я эту проблему решил добавлением прав, например "СканерДоступен" и проверяю в той же процедуре доступность этого права. Если пользователь не работал со сканером и он ему вдруг понадобился, я просто ставлю галку на нужной роли.
11. Павел Васянин (Designer1C) 158 03.05.17 14:44 Сейчас в теме
Спасибо за тему !
У себя сделал с привязкой к имени клиентского компьютера, если он определяется через терминальную сессию
В моём случае получилось более универсально, так как драйверы на ТО ставятся на определённый компьютер.
С одного компьютера могут работать разные пользователи.

Функция ПолучитьИмяКомпьютераТО() Экспорт

	Если мИмяКомпьютера = Неопределено Тогда
		мИмяКомпьютера = ВРег(ИмяКомпьютера()); // Стандартная функция определения текущего компьютера. Это может быть имя и терминального сервера, в том числе.
		// Если пользователь зашёл через RDP на сервер, то следует определить имя клиентского компьютера, а не имя сервера.
		WSS = Новый COMОбъект("WScript.Shell");
		WSSE = WSS.Environment("Process");
		мИмяКомпьютераКлиента = ВРег(WSSE.Item("ClientName"));
		Если ЗначениеЗаполнено(мИмяКомпьютераКлиента) Тогда
			мИмяКомпьютера = мИмяКомпьютераКлиента;
		КонецЕсли;
	КонецЕсли;
	Возврат мИмяКомпьютера;

КонецФункции // ПолучитьИмяКомпьютераТО()
Показать
madmos; UniversaLL; Mixei; @lexandr; +4 Ответить
Оставьте свое сообщение