Разработка и Конфигурация · 11 мин
Как получить IP-адрес в 1С: рабочие способы и примеры кода
Как получить IP-адрес в 1С: через COM-объект WMI, PowerShell, внешние компоненты и веб-сервисы. Готовые примеры кода, ограничения и типичные ошибки.
Задача получить IP-адрес компьютера или сервера из кода 1С встречается чаще, чем кажется: идентификация рабочего места в логах, привязка лицензий самописных подсистем, проверка сетевого окружения перед обменом данными, диагностика подключения к базе. При этом встроенного оператора вроде «ПолучитьIPАдрес()» во встроенном языке 1С нет — платформа такой функции не предоставляет.
Поэтому адрес получают обходными путями: через COM-объекты Windows, вызов командной строки или PowerShell, обращение к внешним веб-сервисам либо через сторонние компоненты. У каждого способа есть ограничения: часть работает только на клиенте под Windows, часть требует прав на выполнение внешних приложений, а внешние сервисы возвращают не локальный, а публичный адрес.
Ниже разобраны основные варианты с готовым кодом, указано, где каждый из них работает (тонкий и толстый клиент, сервер 1С, Linux), и какие ошибки встречаются чаще всего.
Почему в 1С нет штатной функции получения IP
Платформа 1С:Предприятие абстрагирует разработчика от операционной системы: один и тот же код должен работать на Windows и Linux, на клиенте и на сервере. Сетевые интерфейсы, их имена и способы опроса в разных ОС устроены по-разному, поэтому прямой доступ к сетевым настройкам во встроенный язык не включён.
Дополнительно действует модель безопасности: тонкий и веб-клиент работают в ограниченной среде, где запуск внешних приложений и COM-объектов либо запрещён, либо требует явного разрешения пользователя. Это значит, что универсального кода «на все случаи» не существует — способ нужно выбирать под контекст исполнения.
Ещё один нюанс: у компьютера обычно несколько сетевых интерфейсов (Ethernet, Wi-Fi, VPN, виртуальные адаптеры гипервизоров). Запрос «дай мне IP-адрес» без уточнения, какого именно интерфейса, может вернуть не тот адрес, который ожидался.
Способ 1. Получить локальный IP через WMI (COM-объект)
Самый распространённый вариант для толстого клиента и сервера 1С под Windows — запрос к WMI через COM-объект WbemScripting.SWbemLocator. WMI возвращает структурированные данные по всем сетевым адаптерам, и можно отфильтровать только активные интерфейсы с включённым IP.
Пример кода:
Функция ПолучитьЛокальныеIP()
Результат = Новый Массив;
Локатор = Новый COMОбъект("WbemScripting.SWbemLocator");
Сервис = Локатор.ConnectServer(".", "root\cimv2");
Запрос = "SELECT IPAddress, Description FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True";
Адаптеры = Сервис.ExecQuery(Запрос);
Для Каждого Адаптер Из Адаптеры Цикл
Если Адаптер.IPAddress <> Null Тогда
Для Каждого Адрес Из Адаптер.IPAddress Цикл
Результат.Добавить(Адрес);
КонецЦикла;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Обратите внимание: функция возвращает массив, а не одну строку, потому что адаптеров с включённым IP может быть несколько. Если нужен «основной» адрес, обычно берут первый IPv4-адрес (формат с точками, без двоеточий) или фильтруют по имени адаптера.
Локатор = Новый COMОбъект("WbemScripting.SWbemLocator");
Сервис = Локатор.ConnectServer(".", "root\cimv2");
Адаптеры = Сервис.ExecQuery("SELECT IPAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True");Ограничения способа: работает только под Windows; в тонком клиенте COM-объекты недоступны; на сервере 1С код выполняется в контексте учётной записи службы агента сервера, у которой должны быть права на запросы WMI (обычно они есть, но при ужесточённых политиках безопасности запрос может быть заблокирован).
Способ 2. Через командную строку: ipconfig и PowerShell
Если COM по какой-то причине недоступен, можно запустить системную утилиту и разобрать её вывод. В Windows это ipconfig, в Linux — hostname -I или ip addr. В 1С для этого используется объект WScript.Shell (опять же Windows) либо команда ЗапуститьПриложение / НачатьЗапускПриложения с перенаправлением вывода в файл.
Пример с чтением вывода через временный файл:
Процедура ПолучитьIPЧерезIpconfig()
ИмяФайла = ПолучитьИмяВременногоФайла("txt");
СтрокаКоманды = "cmd /c ipconfig > """ + ИмяФайла + """";
ЗапуститьПриложение(СтрокаКоманды, , Истина);
Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.OEM);
Вывод = Текст.Прочитать();
Текст.Закрыть();
// далее разбор строки по шаблону "IPv4-адрес" или "IPv4 Address"
КонецПроцедуры
Разбор текстового вывода — слабое место метода: формат зависит от языка системы (в русской Windows строка называется «IPv4-адрес», в английской — «IPv4 Address»), а в Linux вывод ip addr требует аккуратного парсинга. Для Linux надёжнее команда hostname -I, которая выводит адреса через пробел без лишнего текста.
PowerShell даёт более предсказуемый результат: команда (Get-NetIPAddress -AddressFamily IPv4).IPAddress выводит только адреса, по одному на строку. Минус — на старых системах PowerShell может отсутствовать или запускаться заметно дольше, чем чистый COM-запрос.
Способ 3. Узнать внешний IP через HTTP-запрос
Если нужен адрес, под которым компьютер виден в интернете (например, для настройки доступа к веб-сервисам или проверки VPN), локальные методы не помогут — они вернут внутренний адрес за NAT. Внешний IP получают HTTP-запросом к публичному сервису, который возвращает адрес клиента.
Функция ПолучитьВнешнийIP()
Соединение = Новый HTTPСоединение("api.ipify.org", 443, , , , 10,
Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Возврат СокрЛП(Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Возврат "";
КонецФункции
Таких сервисов несколько (api.ipify.org, ifconfig.me и аналогичные), интерфейс у всех простой: GET-запрос возвращает адрес текстом. Этот способ работает и на клиенте, и на сервере, и под Linux — единственное требование: доступ в интернет с той стороны, где выполняется код.
Учитывайте зависимость от стороннего сервиса: он может быть недоступен, изменить адрес или ограничить частоту запросов. Для промышленного использования стоит предусмотреть таймаут, обработку ошибок и, при критичности, резервный адрес сервиса.
Как выбрать способ под вашу ситуацию
Выбор зависит от трёх факторов: где выполняется код (клиент или сервер), какая операционная система и какой адрес нужен — локальный или внешний. Сводная логика выбора приведена ниже.
Как выбрать действие
| Способ | Клиент Windows | Сервер Windows | Сервер Linux | Тип адреса |
|---|---|---|---|---|
| WMI (COM) | Толстый клиент | Да | Нет | Локальный |
| ipconfig / PowerShell | Толстый клиент | Да | Нет | Локальный |
| hostname -I / ip addr | Нет | Нет | Да | Локальный |
| HTTP к внешнему сервису | Да | Да | Да | Внешний |
На практике чаще всего адрес нужен для серверной логики (логирование, лицензирование, обмены), поэтому код размещают в серверном общем модуле, а клиент при необходимости получает результат вызовом сервера. Это же решает проблему ограничений тонкого клиента.
Проверка результата и типичные ошибки
После внедрения кода обязательно проверьте, что адрес получен именно тот, который ожидался, и что код не падает в штатных и нештатных ситуациях.
Как проверить результат
Адреса совпадают
1С вернула адрес другого интерфейса (VPN, виртуальный адаптер)
Функция возвращает пустое значение или понятное сообщение
Необработанное исключение и аварийное завершение
Значения совпадают
Разные адреса — вероятно, запрос из 1С идёт через прокси
Отдельно стоит упомянуть прокси-серверы: если в компании выход в интернет идёт через прокси, HTTP-запрос из 1С может вернуть адрес прокси, а не реального рабочего места, либо вовсе не пройти без настройки объекта ИнтернетПрокси в HTTPСоединение.
Альтернативы: внешние компоненты и расширения
Если задача регулярная и требует надёжности (например, лицензирование по сетевому окружению), иногда применяют внешние компоненты по технологии Native API или COM, которые возвращают сетевые параметры в удобном виде. Это убирает зависимость от разбора текста и работает быстрее, но добавляет компонент, который нужно распространять и поддерживать под каждую платформу.
Для клиент-серверных внедрений часто проще вообще не опрашивать сеть из 1С, а брать адрес из контекста сеанса: например, при работе через веб-сервер публикации адрес клиента доступен в заголовках HTTP-запроса на стороне веб-сервиса 1С. Это надёжнее, чем опрос интерфейсов на клиенте.
Что важно запомнить
Штатной функции получения IP в 1С нет. Локальный адрес берут через WMI (Windows) или системные команды (Linux), внешний — HTTP-запросом к публичному сервису. Учитывайте несколько интерфейсов, различие IPv4/IPv6, ограничения тонкого клиента и обязательно обрабатывайте ошибки и таймауты.
Частые вопросы
Можно ли получить IP-адрес в тонком клиенте 1С?
Напрямую — практически нет: COM-объекты недоступны, запуск приложений требует разрешения пользователя. Правильный подход — выполнить получение адреса в серверном вызове и вернуть результат клиенту. Если нужен именно адрес клиентской машины, а не сервера, задачу решают на уровне веб-сервера или терминальной инфраструктуры.
Как получить IP-адрес сервера 1С, а не клиента?
Разместите функцию в общем модуле с признаком «Сервер» и вызовите её с клиента. Код выполнится на сервере 1С и вернёт адреса его сетевых интерфейсов. Учтите, что у сервера их обычно несколько — уточните, какой интерфейс вам нужен.
Почему WMI возвращает несколько адресов и какой брать?
Запрос возвращает адреса всех активных адаптеров: Ethernet, Wi-Fi, VPN, виртуальные сети гипервизоров. Однозначного «главного» адреса нет — обычно фильтруют по имени адаптера, берут первый IPv4-адрес или адрес из нужной подсети (например, начинающийся с 192.168.).
Как получить внешний IP без доступа в интернет?
Никак: внешний адрес назначает провайдер, и узнать его можно только обратившись к узлу за пределами вашей сети. В изолированном контуре понятие внешнего адреса обычно неприменимо — используйте локальные адреса.
Работает ли код с WMI в файловой базе на Linux-клиенте?
Нет, WMI — технология Windows. Под Linux используйте вызов hostname -I или чтение вывода ip addr через запуск приложения с перенаправлением вывода в файл.
Можно ли определить IP клиента, подключённого через веб-публикацию?
Да, но не опросом его компьютера, а через заголовки HTTP-запроса на стороне веб-сервиса 1С (например, X-Forwarded-For при работе за обратным прокси). Это надёжнее и не требует прав на клиенте.