gifts2017

Торговое оборудование. Доработка функции ПолучитьИмяКомпьютераТО() в типовых конфигурациях 1С 8.2

Опубликовал Денис (Вурдалак) в раздел Программирование - Практика программирования

Много раз замечал, что в типовых решениях не доработана функция определения имени клиентского компьютера, особенно когда работа с торговым оборудованием идет через RDP. В публикации представлен метод, решающий эту проблему. Представленная функция взята из типовой конфигурации "1С: Комплексная автоматизация, ред 1.1"

На уникальность статьи не претендую, но, возможно, представленный метод кому-нибудь поможет.

Мною было замечено, что при работе с типовыми конфигурациями типа УТ 10.3 и Розница для платформы 8.2 возникают проблемы с торговым оборудованием при работе через RDP. В конфигурации КА 1.1 данная проблема решена, возможно, ее нет и в УПП.

Проблема следующая: когда нужно настроить работу торгового оборудования через RDP на нескольких рабочих местах, без доработки это сделать не удастся, т.к. 1С будет получать неправильное имя компьютера, для которого нужно получить сохраненные настройки. Т.е. 1С получает не имя клиентского компьютера, а имя сервера, где запускается 1С. Отсюда и проблемы.

Вся суть кроется в функции ПолучитьИмяКомпьютераТО() в модуле обработки СерверТО. В типовых УТ 10.3 и Розница она выглядит так:

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

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

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

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

Данную функцию нужно заменить на следующую:

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

	Если мИмяКомпьютера = Неопределено Тогда
	    WSS = Новый COMОбъект("WScript.Shell");
	    WSSE = WSS.Environment("Process");

	    мИмяКомпьютера = ВРег(WSSE.Item("ClientName"));
	
		Если ПустаяСтрока(мИмяКомпьютера) Тогда
			мИмяКомпьютера = Неопределено;
		КонецЕсли;
	КонецЕсли;	
	
	Если мИмяКомпьютера = Неопределено ИЛИ ВРег(СокрЛП(мИмяКомпьютера)) = "CONSOLE" Тогда
		мИмяКомпьютера = ВРег(ИмяКомпьютера());
	КонецЕсли;

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

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

Вот и все. Всем удачи и спасибо за внимание!

См. также

Подписаться Добавить вознаграждение

Комментарии

1. deadman66 (deadman66) 28.08.15 13:54
Да, метод рабочий. Использую уже года два такое решение. Вот только не проверял при админском запрете выполнения скриптов на RDP (в исключение вывалиться или нет).
2. Денис (Вурдалак) 28.08.15 18:45
(1) deadman66, ну этот метод типовой. вроде пока работает, правда у нас запрета вроде не стоит. надо у Админа уточнить
3. Виктор Череватенко (buddha667) 02.09.15 10:24
Я функцию модифицировал минимально:

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

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

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

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


А сам алгоритм вынес отдельно в глобальный модуль, ибо помнится, где-то еще пришлось заменить ИмяКомпьютера()

Функция ИмяКомпьютераПолное() Экспорт
	
	ИмяКомпьютера = "";
	Попытка
		WshShell = Новый COMОбъект("WScript.Shell");
		WshSysEnv = WshShell.Environment("Process");
		ИмяКомпьютера = WshSysEnv.Item("CLIENTNAME");
	Исключение
	КонецПопытки;
	
	Если НЕ ЗначениеЗаполнено(ИмяКомпьютера) ИЛИ ВРег(СокрЛП(ИмяКомпьютера)) = "CONSOLE" Тогда
		ИмяКомпьютера = ИмяКомпьютера();
	КонецЕсли;
	
	Возврат ИмяКомпьютера;
	
КонецФункции
...Показать Скрыть


ЗЫ: Воспользовался вашим советом, добавил ...
ИЛИ ВРег(СокрЛП(ИмяКомпьютера)) = "CONSOLE"
...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа