К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить IP-адрес в 1С

Как получить IP-адрес компьютера или сервера в 1С: через COM-объекты, WMI, веб-сервисы и командную строку. Готовые примеры кода, ограничения, ошибки и FAQ.

Задача получить IP-адрес в 1С возникает в нескольких типовых сценариях: идентификация рабочего места кассира или менеджера, журналирование подключений, привязка печати к конкретному принтеру, контроль доступа по подсети. Встроенной функции «ПолучитьIPАдрес()» во встроенном языке 1С нет, поэтому адрес получают обходными путями — через возможности операционной системы или внешние сервисы.

Выбор способа зависит от того, чей адрес нужен: локальный адрес клиентского компьютера, адрес сервера 1С или внешний (публичный) адрес, под которым сеть видна в интернете. Также важно, где выполняется код — на тонком клиенте, толстом клиенте или сервере, и есть ли доступ к COM-объектам и интернету.

Ниже разобраны рабочие варианты с примерами кода, их ограничения и способы проверки результата. Примеры ориентированы на платформу 1С:Предприятие 8.3 в среде Windows — наиболее распространённую комбинацию.

Что именно нужно получить: локальный или внешний адрес

Прежде чем писать код, определите, какой адрес требуется. Локальный (внутренний) IP — это адрес компьютера в локальной сети, например 192.168.1.50. Он нужен для идентификации рабочих мест, маршрутизации печати, привязки лицензий сторонних компонент. Внешний (публичный) IP — адрес, который видят серверы в интернете; он обычно принадлежит роутеру или провайдеру и одинаков для всех компьютеров офиса.

Частая ошибка — пытаться получить внешний адрес локальными средствами. WMI и ipconfig покажут только адреса сетевых адаптеров, то есть внутренние. Для внешнего адреса без HTTP-запроса к внешнему сервису не обойтись.

Маршрут решения

Как выбрать способ

Нужен локальный адрес клиента на WindowsИспользуйте WMI-запрос или разбор вывода ipconfig
Нужен внешний адрес для обмена с веб-сервисамиВыполните HTTP-запрос к сервису определения IP
Код работает на сервере 1С, а нужен адрес клиентаПолучайте адрес на клиенте и передавайте на сервер параметром
Работаете в веб-клиенте или на LinuxИспользуйте серверный вызов ОС или внешнюю компоненту

Способ 1: получение локального IP через WMI

Наиболее надёжный способ для Windows — запрос к WMI (Windows Management Instrumentation) через COM-объект. Класс Win32_NetworkAdapterConfiguration содержит параметры всех сетевых адаптеров, включая их IP-адреса. Запрос с фильтром IPEnabled = TRUE отбирает только активные адаптеры с включённым TCP/IP.

bsl
Функция ПолучитьЛокальныйIP()
	Локатор = Новый COMОбъект("WbemScripting.SWbemLocator");
	Сервис = Локатор.ConnectServer(".", "root\cimv2");
	Выборка = Сервис.ExecQuery("SELECT IPAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE");
	Для Каждого Адаптер Из Выборка Цикл
		Если Адаптер.IPAddress <> Неопределено Тогда
			Для Каждого Адрес Из Адаптер.IPAddress Цикл
				Если СтрНайти(Адрес, ".") > 0 Тогда
					Возврат Адрес; // первый IPv4-адрес
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	Возврат "";
КонецФункции

Обратите внимание на нюансы. У компьютера может быть несколько адаптеров: Ethernet, Wi-Fi, виртуальные адаптеры VPN и гипервизоров. Пример выше возвращает первый найденный IPv4-адрес, что не всегда совпадает с «основным» адресом. Если нужен адрес конкретного адаптера, добавьте в запрос условие по Description или отфильтруйте адреса по диапазону вашей подсети.

Ограничение способа: COM-объекты доступны только на толстом и тонком клиенте под Windows. В веб-клиенте и на Linux-клиенте код не выполнится. Если процедура вызывается на сервере 1С, она вернёт адрес самого сервера, а не клиентского компьютера — это частая причина «неправильных» данных в журналах.

Способ 2: разбор вывода команды ipconfig

Альтернатива без COM — запустить утилиту ipconfig и разобрать её текстовый вывод. Способ грубее, но работает там, где WMI недоступен или ограничен политиками безопасности.

bsl
Процедура ПолучитьIPЧерезIpconfig()
	ФайлВывода = ПолучитьИмяВременногоФайла("txt");
	СтрокаКоманды = "cmd /c ipconfig > """ + ФайлВывода + """";
	ЗапуститьПриложение(СтрокаКоманды, , Истина);
	Текст = Новый ЧтениеТекста(ФайлВывода, КодировкаТекста.OEM);
	Содержимое = Текст.Прочитать();
	Текст.Закрыть();
	// далее — поиск строки с IPv4-адресом в переменной Содержимое
КонецПроцедуры

При разборе учитывайте локализацию Windows: в русской версии строка называется «IPv4-адрес», в английской — «IPv4 Address». Надёжнее искать по шаблону самого адреса (четыре группы цифр через точку), а не по названию параметра. Также помните, что запуск внешних приложений может блокироваться антивирусом или настройками безопасности 1С (режим защиты от опасных действий).

Способ 3: получение внешнего IP через HTTP-запрос

Для внешнего адреса используется HTTP-запрос к публичному сервису, который возвращает адрес клиента в виде простого текста. В 1С это делается через объект HTTPСоединение.

bsl
Функция ПолучитьВнешнийIP()
	Попытка
		Соединение = Новый HTTPСоединение("api.ipify.org", 443, , , , 10, Новый ЗащищенноеСоединениеOpenSSL());
		Запрос = Новый HTTPЗапрос("/");
		Ответ = Соединение.Получить(Запрос);
		Если Ответ.КодСостояния = 200 Тогда
			Возврат СокрЛП(Ответ.ПолучитьТелоКакСтроку());
		КонецЕсли;
	Исключение
		Возврат "";
	КонецПопытки;
	Возврат "";
КонецФункции

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

Особенности клиент-серверного режима и веб-клиента

В файловом варианте код клиента и «сервера» выполняется на одной машине, поэтому адрес получается однозначно. В клиент-серверном варианте директива компиляции определяет, чей адрес вы получите: код &НаСервере вернёт адрес сервера 1С, код &НаКлиенте — адрес рабочего места пользователя.

Типовой сценарий журналирования подключений выглядит так: в клиентской процедуре получают локальный IP (WMI или ipconfig), затем передают его параметром в серверную процедуру, которая записывает данные в регистр сведений вместе с именем пользователя и временем. Передавать нужно именно строкой — никаких COM-объектов между клиентом и сервером передавать нельзя.

В веб-клиенте COM и запуск приложений недоступны в принципе. Варианты обхода: получить внешний IP через HTTP-запрос с сервера, использовать расширение браузера или внешнюю компоненту, либо определять адрес на стороне веб-сервера, публикующего базу (его видит 1С как адрес клиентского подключения в кластере). Информацию о сеансах с адресами также можно получить через консоль кластера или программно — через COM-соединитель V83.COMConnector и объект IWorkingProcessConnection, но это уже инструментарий администратора.

Для задачи «печатать чеки на принтере конкретной кассы» вместо IP часто надёжнее использовать имя компьютера (ИмяКомпьютера()) или привязку к пользователю — адреса в сетях с DHCP могут меняться после перезагрузки, и привязка по IP внезапно перестаёт работать.
ПЗ
Практическое замечание

Проверка результата и типичные ошибки

После внедрения проверьте полученный адрес независимым способом: выполните ipconfig в командной строке того же компьютера и сравните значения. Для внешнего адреса откройте в браузере любой сервис «мой IP» и сверьте с тем, что вернула функция.

Контрольные точки

Как проверить результат

Совпадение с ipconfig
Норма

Адрес из 1С присутствует в списке адаптеров

Тревожный признак

Адрес из другой подсети — взят не тот адаптер (VPN, виртуальный)

Чей адрес получен
Норма

В клиент-серверном режиме адрес совпадает с машиной пользователя

Тревожный признак

Всегда один и тот же адрес сервера 1С — код выполняется на сервере

Стабильность
Норма

Адрес корректен после перезапуска сеанса

Тревожный признак

Пустая строка или ошибка при недоступности сети — нет обработки исключений

Типичные ошибки
01
Получение адреса на сервере вместо клиента — в журнал записывается адрес сервера 1С у всех пользователей
02
Отсутствие фильтра по адаптерам — функция возвращает адрес VPN или виртуального адаптера Hyper-V вместо основного
03
Нет обработки исключений при HTTP-запросе — при недоступности сервиса пользователь получает окно с ошибкой
04
Привязка логики к IP в сети с DHCP — после смены адреса настройки перестают находиться
05
Игнорирование IPv6 — при наличии только IPv6-адреса фильтр по точкам возвращает пустую строку

Альтернативы и смежные задачи

Если конечная цель — идентификация рабочего места, рассмотрите встроенные средства платформы: функция ИмяКомпьютера() возвращает сетевое имя машины без всяких COM-объектов и работает везде. Для журналирования подключений в клиент-серверном режиме есть технологический журнал и данные кластера, где адреса клиентских сеансов фиксируются штатно.

Для обмена данными между базами внутри одной сети внешний IP обычно не нужен вовсе — достаточно внутренних адресов или DNS-имён. А если внешний адрес нужен для настройки доступа к базе извне (например, проброса портов или VPN), его проще узнать один раз административными средствами, чем встраивать определение в прикладной код.

Итог

Что важно запомнить

Штатной функции получения IP в 1С нет: локальный адрес берут через WMI или ipconfig, внешний — через HTTP-запрос к внешнему сервису. В клиент-серверном режиме критично, где выполняется код; в веб-клиенте COM недоступен. Всегда обрабатывайте ошибки и помните, что при DHCP адрес может меняться.

Частые вопросы

Можно ли получить IP-адрес без COM-объектов и запуска программ?

Да, но с оговорками. Для внешнего адреса достаточно HTTP-запроса к сервису определения IP. Для локального без COM и ipconfig штатных средств практически нет — ближайшая альтернатива: чтение данных сеанса из кластера серверов 1С или использование внешней компоненты.

Почему функция возвращает адрес 192.168.x.x, а нужен «настоящий» IP?

Это локальный адрес внутри вашей сети — именно его имеет сетевой адаптер компьютера. «Настоящий» (публичный) адрес принадлежит роутеру, и компьютер о нём не знает. Получить его можно только запросом к внешнему сервису, который увидит адрес вашего подключения.

Как получить IP-адрес конкретного пользователя в клиент-серверной базе?

Два пути: на клиенте при старте сеанса получить локальный адрес и записать его в регистр сведений с привязкой к пользователю, либо административно — через консоль кластера серверов 1С, где в списке сеансов видны адреса клиентских подключений.

Работает ли WMI-способ на сервере 1С под Linux?

Нет, WMI — технология Windows. На Linux аналогичную информацию получают вызовом системных утилит (например, hostname -I или ip addr) с разбором вывода, либо чтением данных из /proc и /sys. Учтите, что запуск внешних команд требует соответствующих прав и может блокироваться режимом защиты.

Что делать, если код работает, но возвращает пустую строку?

Проверьте по порядку: не выполняется ли код в веб-клиенте или под Linux, где COM недоступен; не блокирует ли антивирус или режим защиты создание COM-объекта; есть ли у компьютера активный адаптер с IPv4. Добавьте в функцию запись исключений в журнал регистрации — это покажет реальную причину вместо молчаливого пустого результата.

Можно ли использовать IP-адрес для привязки лицензий или настроек рабочего места?

Технически можно, но ненадёжно: в сетях с DHCP адрес выдаётся динамически и может измениться. Устойчивее привязываться к имени компьютера (ИмяКомпьютера()), к имени пользователя или к MAC-адресу, который тоже можно получить через WMI (поле MACAddress того же класса).