Ситуация, когда после обновления программного обеспечения или изменения настроек сети служба сервера 1С:Предприятие перестает запускаться, встречается довольно часто. Основная причина кроется в конфликте сетевых портов, которые 1С пытается занять по умолчанию. Рассмотрим подробно, как продиагностировать эту проблему и какие пути решения существуют.
Первым делом проанализируем поведение системы. Обычно служба 1С пытается стартовать, статус меняется на «Выполняется», но через несколько секунд она останавливается. В технологическом журнале 1С при этом фиксируется характерная ошибка EXCP с описанием failed to create call listener server. Выясним причину, изучив текст исключения:
07:54.639001-0,EXCP,1,level=WARNING,process=rmngr,OSThread=11004,Exception=f6f167a0-dcc9-49ad-8f8e-2c9d9904e4fe,
Descr='src\rserver\src\RHostImpl.cpp(856): f6f167a0-dcc9-49ad-8f8e-2c9d9904e4fe:
failed to create call listener server, init params: MainPort=1541;Range="1560:1591"
81029657-3fe6-4cd6-80c0-36de78fe6657: Обычно разрешается только одно использование адреса сокета
(протокол/сетевой адрес/порт)'
Текст ошибки «Обычно разрешается только одно использование адреса сокета» (код ошибки Windows сокетов — 10048) однозначно указывает на то, что порты 1540, 1541 или диапазон 1560–1591 уже заняты другим процессом или зарезервированы операционной системой.
Разберем, как определить, какое именно приложение «захватило» наши порты. Для этого воспользуемся командной строкой с правами администратора. Выполним команду netstat с ключами, которые покажут владельца порта:
netstat -a -n -o | findstr :1540
netstat -a -n -o | findstr :1541
В выводе мы получим идентификатор процесса (PID) в последней колонке. Чтобы понять, что это за программа, сопоставим PID с именем службы:
tasklist /svc /fi "pid eq [ВАШ_PID]"
Как показывает практика, часто порты 1540 и выше оказываются заняты следующими службами:
Если мы обнаружили, что порты заняты системными процессами «случайным» образом, проанализируем настройки исключений. В современных версиях Windows порты могут быть зарезервированы для нужд Hyper-V. Посмотрим список зарезервированных диапазонов:
netsh int ipv4 show excludedportrange protocol=tcp
Если порты 1540–1591 попадают в эти интервалы, нам необходимо принудительно зарезервировать их за 1С. Выполним следующую команду для защиты диапазона от захвата другими службами:
netsh int ipv4 add excludedportrange tcp startport=1540 numberofports=60 store=persistent
Важно: для выполнения этой команды может потребоваться временная остановка службы winnat или даже временное отключение Hyper-V, если система не дает создать исключение.
Если освободить порты не удается или это вызывает сбои в работе другого критически важного ПО (например, защиты Рарус), рассмотрим вариант смены портов самой 1С. Это наиболее надежный «костыль», который позволяет запустить систему немедленно.
Разберем процесс смены портов:
1C:Enterprise 8.3 Server Agent.-port 2540-regport 2541-range 2560:2591Пример строки запуска в реестре будет выглядеть так:
"C:\Program Files\1cv8\8.3.25.1445\bin\ragent.exe" -srvc -agent -regport 2541 -port 2540 -range 2560:2591 -d "C:\Program Files\1cv8\srvinfo"
Основной минус использования нестандартных портов — необходимость прописывать их у каждого пользователя в строке подключения (например, ServerName:2541). Чтобы не обходить каждое рабочее место, используем механизм общих списков баз.
Создадим файл с расширением .v8i, где укажем настройки подключения:
[ИмяВашейБазы]
Connect=Srvr="ИмяСервера:2541";Ref="ИмяБазыНаСервере";
ID=...
OrderInList=1
Folder=/
External=0
ClientConnectionSpeed=Normal
App=Auto
DefaultVersion=8.3
Положим этот файл на сетевой ресурс, доступный всем пользователям, и подключим его в окне запуска 1С через «Настройки» -> «Адреса интернет-сервисов и списки общих информационных баз». Теперь при изменении порта на сервере вам достаточно будет поправить один файл в сети.
Посмотрим на ситуацию с защитой Рарус. Если конфликт вызван LicServer.exe, выясним, можно ли его настроить. В папке установки защиты Рарус обычно присутствует файл конфигурации (например, settings.xml), где можно жестко задать используемый порт.
Также проанализируем зависимости служб. Если мы хотим, чтобы 1С всегда успевала занять свои порты первой, настроим зависимость «проблемных» служб от 1С. Это гарантирует, что LicServer или другие приложения запустятся только после того, как сервер 1С успешно инициализирует свои сокеты.
Для настройки зависимостей в командной строке используйте:
sc config [Имя_Службы_Рарус] depend= "1C:Enterprise 8.3 Server Agent"
Таким образом, мы рассмотрели комплексный подход к решению проблемы: от глубокой диагностики владельцев портов до настройки обходных путей с использованием конфигурационных файлов 1С.