среда, 28 марта 2012 г.

1С 8.2 УПП, ошибка 10048, драйвер Atol (Атол), Mobilelogistics 4.x

Поставили в работу терминал сбора данных Pidion-6000, при повторном подключении 1С вываливает ошибку типа "ошибка подключения 10048 и тд порт занят". ТСД использует для подключения порт 6000.
Под катом много буков и секса:

Копание привелу к Гилёву, в котором написано:

Как устраняется проблема
Открыть Process Explorer, найти все процессы 1С (в том числе серверный) и убить их.
(Вариант так себе, когда на сервере терминалов висят 40+ человек)
вариант от Александр Шарафан:
1. Динамически увеличить диапазон портов. По умолчанию их 5000, можно установить до 65536.
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort
2. Можно уменьшить время нахождения соединения в состоянии фиксации с 4 минут до 30 секунд.
HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\TCPTimedWaitDelay
3. Удалить софт (антивирус, файрволл и тп.) занимающие порты 1С

Дальнейшее гугление привело сюда.
TcpTimedWaitDelay
Этот параметр определяет интервал времени, в течение которого подключение находится в состоянии ожидания, прежде чем будет закрыто. Пока подключение находится в состоянии ожидания, пара сокетов не может быть использована повторно.
В Windows Server 2008r2 это значение равно 4 минутам и такого пункта в реестре нет, нужно создать "Параметр DWORD (32 бит)" с именем TcpTimedWaitDelay и десятичным значением 30-60, параметр в секундах.

и второй параметр это MaxUserPort создал равным 60000. Максимальное количество портов, разрешенных для использования.

Затем нашел статейку Tuning Windows for TCP/IP performance.
Так же отключил автотюнинг командой:
netsh int tcp set global autotuninglevel=disabled

Запись из реестра получилась следующей:
tcpip.reg
REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters]
"TCPTimedWaitDelay"=dword:0000001e
"MaxUserPort"=dword:0000ea60


В консоли набираю netstat -n и вижу, что TIME_WAIT соединения закрываются быстро, остаются только ESTABLISHED, текущие подключения.

В итоге ХУЙ, всё тоже самое.


- Далее нарыл форум, будем пробовать.
Инфа оттуда:
Главная проблема подключения торг.оборудования к 1С, запускаемой в терминальном режиме, заключается в том, что фирма 1С напрочь игнорирует наличие этого самого терминального режима. И заключается это в том, что в регистр сведений, хранящем сведения о подключенном оборудовании, записывается имя компьютера, к которому подключено оборудование, с помощью метода - ИмяКомпьютера().
В терминальном режиме этот метод вернёт имя сервера. И, при последующих запусках, под любым пользователем в терминале 1С будет пытаться подключить это торговое оборудование.
Но так как оборудование подключено только к одному клиенту, то только у него не будет возникать ошибка подключения, у всех остальных ошибка возникнет.
Проблема решается очень просто. Надо при запуске программы сообщать ей не имя компьютера, а имя компьютера клиента.
На примере УТ 10.3:

Функция ПолучитьИмяКомпьютераТО() Экспорт
//Изменения Billi
//Было:
//Если мИмяКомпьютера = Неопределено Тогда
// мИмяКомпьютера = ВРег(ИмяКомпьютера());
//КонецЕсли;
//Стало:
objScript = Новый COMObject("WScript.Shell");
objEnvironment = objScript.Environment("PROCESS");
ИмяКлиента=ВРег(objEnvironment.item("CLIENTNAME")) ;
Если ИмяКлиента="CONSOLE" Тогда
мИмяКомпьютера = ВРег(ИмяКомпьютера());
Иначе
мИмяКомпьютера = ИмяКлиента;
КонецЕсли;
//Конец изменений
Возврат мИмяКомпьютера;
КонецФункции // ПолучитьИмяКомпьютераТО()

Комментариев нет:

Отправить комментарий