Разработка и Конфигурация · 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-запроса к внешнему сервису не обойтись.
Как выбрать способ
Способ 1: получение локального IP через WMI
Наиболее надёжный способ для Windows — запрос к WMI (Windows Management Instrumentation) через COM-объект. Класс Win32_NetworkAdapterConfiguration содержит параметры всех сетевых адаптеров, включая их IP-адреса. Запрос с фильтром IPEnabled = TRUE отбирает только активные адаптеры с включённым TCP/IP.
Функция ПолучитьЛокальный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 недоступен или ограничен политиками безопасности.
Процедура ПолучитьIPЧерезIpconfig()
ФайлВывода = ПолучитьИмяВременногоФайла("txt");
СтрокаКоманды = "cmd /c ipconfig > """ + ФайлВывода + """";
ЗапуститьПриложение(СтрокаКоманды, , Истина);
Текст = Новый ЧтениеТекста(ФайлВывода, КодировкаТекста.OEM);
Содержимое = Текст.Прочитать();
Текст.Закрыть();
// далее — поиск строки с IPv4-адресом в переменной Содержимое
КонецПроцедурыПри разборе учитывайте локализацию Windows: в русской версии строка называется «IPv4-адрес», в английской — «IPv4 Address». Надёжнее искать по шаблону самого адреса (четыре группы цифр через точку), а не по названию параметра. Также помните, что запуск внешних приложений может блокироваться антивирусом или настройками безопасности 1С (режим защиты от опасных действий).
Способ 3: получение внешнего IP через HTTP-запрос
Для внешнего адреса используется HTTP-запрос к публичному сервису, который возвращает адрес клиента в виде простого текста. В 1С это делается через объект HTTPСоединение.
Функция ПолучитьВнешний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» и сверьте с тем, что вернула функция.
Как проверить результат
Адрес из 1С присутствует в списке адаптеров
Адрес из другой подсети — взят не тот адаптер (VPN, виртуальный)
В клиент-серверном режиме адрес совпадает с машиной пользователя
Всегда один и тот же адрес сервера 1С — код выполняется на сервере
Адрес корректен после перезапуска сеанса
Пустая строка или ошибка при недоступности сети — нет обработки исключений
Альтернативы и смежные задачи
Если конечная цель — идентификация рабочего места, рассмотрите встроенные средства платформы: функция ИмяКомпьютера() возвращает сетевое имя машины без всяких 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 того же класса).