Чей это компьютер: где 1С 8.3 хранит имя машины пользователя и как его получить
Содержание
Определить компьютер в 1С проще всего функцией ИмяКомпьютера(), вызванной в клиентском коде (&НаКлиенте): она вернёт сетевое имя машины пользователя, например BUH-03. Если код выполняется на сервере, имя компьютера клиента даёт ПолучитьТекущийСеансИнформационнойБазы().ИмяКомпьютера. Без программирования то же самое видно в списке активных пользователей и в журнале регистрации — колонка «Компьютер».
Способ выбирают по задаче. Узнать, кто сейчас в базе и с какой машины, — хватит активных пользователей. Разобрать, кто вчера провёл документ, — журнал регистрации. Привязать настройки или права к рабочему месту — код с ИмяКомпьютера() или ИдентификаторКлиента. Нужна жёсткая идентификация «железа» (MAC-адрес, серийный номер) — WMI или внешняя компонента.
Откуда 1С берёт имя компьютера и почему результат зависит от места вызова
Платформа 1С 8.3 не придумывает имя сама. Она берёт его у операционной системы того процесса, где выполняется код. Отсюда главная ловушка: одна и та же функция в разных контекстах возвращает разные машины.
- 🖥️ Клиентский код (
&НаКлиенте) в тонком или толстом клиенте — компьютер пользователя. - 🗄️ Серверный код (
&НаСервере, общие модули с флагом «Сервер») в клиент-серверной базе — сервер 1С, на котором работает рабочий процесс. - 📂 Файловая база — клиент и «сервер» живут в одном процессе, поэтому везде будет машина пользователя.
- 🌐 Веб-клиент — браузер имя ПК не сообщает, в сеансе обычно оказывается имя веб-сервера.
В платформе нет функции КомпьютерИнфо(), которая иногда встречается в статьях и на форумах. Её роль выполняют две вещи: функция глобального контекста ИмяКомпьютера() и объект СистемнаяИнформация.
Сводка способов:
| Способ | Что даёт | Где работает | Нужно ли программировать |
|---|---|---|---|
| Активные пользователи | Компьютер каждого сеанса сейчас | Все режимы | Нет |
| Журнал регистрации | Компьютер для каждого события в прошлом | Все режимы | Нет |
ИмяКомпьютера() на клиенте | Имя ПК пользователя | Тонкий, толстый клиент | Да, одна строка |
| Сеанс на сервере | Имя ПК клиента из серверного кода | Клиент-серверная и файловая база | Да |
ИдентификаторКлиента | Уникальный UUID рабочего места | Все клиенты | Да |
| Реестр, WScript, WMI | Имя ПК, пользователь Windows, MAC, серийник | Только Windows | Да, через COM |
| Внешняя компонента | Аппаратные идентификаторы, любые ОС | Зависит от компоненты | Да |
Функция ИмяКомпьютера() и объект СистемнаяИнформация
ИмяКомпьютера() возвращает строку с сетевым (NetBIOS) именем машины. Регистр букв — как в Windows, обычно заглавные. Для проверки создайте внешнюю обработку
: в Конфигураторе Файл → Новый → Внешняя обработка, добавьте форму, команду и обработчик:
&НаКлиенте
Процедура ПоказатьКомпьютер(Команда)
СисИнфо = Новый СистемнаяИнформация;
Сообщить("Имя компьютера: " + ИмяКомпьютера());
Сообщить("ОС: " + СисИнфо.ВерсияОС);
Сообщить("Тип платформы: " + Строка(СисИнфо.ТипПлатформы));
Сообщить("Версия 1С: " + СисИнфо.ВерсияПриложения);
Сообщить("Оперативная память, МБ: " + Формат(СисИнфо.ОперативнаяПамять, "ЧГ=0"));
Сообщить("Идентификатор клиента: " + Строка(СисИнфо.ИдентификаторКлиента));
КонецПроцедуры
Сохраните обработку и откройте её в пользовательском режиме через Файл → Открыть (в интерфейсе «Такси» — главное меню ☰ → Файл → Открыть).
Что важно знать про ИдентификаторКлиента
Имя компьютера можно сменить за минуту, и тогда все привязки к нему слетят. ИдентификаторКлиента надёжнее для привязки настроек к рабочему месту:
- Это UUID, который платформа генерирует один раз и хранит в профиле пользователя Windows на этой машине.
- Он не меняется при переименовании компьютера.
- Он сменится, если очистить профиль пользователя или войти под другой учётной записью Windows.
Если нужна связка «рабочее место ↔ касса или принтер», храните в справочнике и имя компьютера, и ИдентификаторКлиента. Имя читается человеком, UUID ловит подмену.
Компьютер пользователя на сервере: сеанс и связка с именем пользователя
В клиент-серверной базе большая часть логики работает на сервере. Вызов ИмяКомпьютера() там вернёт SRV-1C, а не машину бухгалтера. Правильный путь — спросить текущий сеанс:
&НаСервереБезКонтекста
Функция КомпьютерТекущегоСеанса()
ТекущийСеанс = ПолучитьТекущийСеансИнформационнойБазы();
Возврат ТекущийСеанс.ИмяКомпьютера;
КонецФункции
Объект сеанса содержит ещё несколько полезных свойств: ИмяПриложения (тонкий клиент, конфигуратор, фоновое задание), НачалоСеанса, НомерСеанса, Пользователь.
Пара «пользователь + компьютер»
Имя пользователя 1С без компьютера мало что говорит: один логин Бухгалтер может работать с трёх машин одновременно. Соберите обе части в одну строку:
&НаСервереБезКонтекста
Функция ПользовательИКомпьютер()
Сеанс = ПолучитьТекущийСеансИнформационнойБазы();
Возврат СтрШаблон("%1 (%2) на %3",
ИмяПользователя(),
ПолноеИмяПользователя(),
Сеанс.ИмяКомпьютера);
КонецФункции
ИмяПользователя() возвращает логин, ПолноеИмяПользователя() — полное имя из списка пользователей информационной базы.
Все сеансы базы с компьютерами
Чтобы получить список всех подключений, используйте ПолучитьСеансыИнформационнойБазы(). Для вызова нужны административные права.
&НаСервере
Процедура ВывестиСеансы()
Для Каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл
Логин = ?(Сеанс.Пользователь = Неопределено, "<без пользователя>", Сеанс.Пользователь.Имя);
Сообщить(СтрШаблон("№%1: %2 — %3 — %4",
Формат(Сеанс.НомерСеанса, "ЧГ=0"),
Логин,
Сеанс.ИмяКомпьютера,
Сеанс.ИмяПриложения));
КонецЦикла;
КонецПроцедуры
Не вносите такой код прямо в типовую конфигурацию: это снимет её с полной поддержки и усложнит обновления. Используйте внешнюю обработку или расширение конфигурации.
Имя компьютера через реестр и Windows: способ для администраторов
Иногда нужно не только NetBIOS-имя, но и пользователь Windows, домен или DNS-имя. Всё это есть в системе, и на клиенте под Windows 1С может прочитать данные через COM-объекты.
Где имя лежит в реестре
| Ключ реестра | Параметр | Что хранит |
|---|---|---|
HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName | ComputerName | Имя, которое будет после перезагрузки |
HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName | ComputerName | Имя, с которым система работает сейчас |
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters | Hostname | DNS-имя хоста |
Если значения в первых двух ключах различаются, компьютер переименовали, но не перезагрузили. Клиент 1С в таком случае покажет старое имя.
Проверить без 1С можно в командной строке:
hostname
echo %COMPUTERNAME%
reg query "HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName" /v ComputerName
Чтение из 1С через WScript
&НаКлиенте
Функция ДанныеWindows()
Сеть = Новый COMОбъект("WScript.Network");
Оболочка = Новый COMОбъект("WScript.Shell");
Результат = Новый Структура;
Результат.Вставить("Компьютер", Сеть.ComputerName);
Результат.Вставить("ПользовательWindows", Сеть.UserName);
Результат.Вставить("Домен", Сеть.UserDomain);
Результат.Вставить("ИмяИзРеестра", Оболочка.RegRead(
"HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName\ComputerName"));
Результат.Вставить("КлиентRDP", Оболочка.ExpandEnvironmentStrings("%CLIENTNAME%"));
Возврат Результат;
КонецФункции
Пользователь Windows и домен пригодятся, если в базе включена аутентификация операционной системы: так видно, под какой доменной учётной записью человек вошёл. Про КлиентRDP — в разделе о терминальном сервере ниже.
Код с COMОбъект работает только в клиенте под Windows. На Linux и macOS конструктор упадёт с ошибкой, поэтому оборачивайте вызов в Попытка … Исключение … КонецПопытки и проверяйте СисИнфо.ТипПлатформы.
Точная идентификация «железа»: WMI и внешние компоненты
Имя компьютера и UUID клиента легко изменить. Для учёта техники, контроля лицензий на рабочие места или привязки кассы к конкретному системному блоку нужны аппаратные данные.
MAC-адрес и серийный номер через WMI
В Windows их отдаёт служба WMI. Из 1С к ней обращаются через ПолучитьCOMОбъект:
&НаКлиенте
Процедура АппаратныеДанные()
WMI = ПолучитьCOMОбъект("winmgmts:\\.\root\cimv2");
Адаптеры = WMI.ExecQuery(
"SELECT MACAddress, Description FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True");
Для Каждого Адаптер Из Адаптеры Цикл
Сообщить("MAC: " + Адаптер.MACAddress + " — " + Адаптер.Description);
КонецЦикла;
Для Каждого Биос Из WMI.ExecQuery("SELECT SerialNumber FROM Win32_BIOS") Цикл
Сообщить("Серийный номер: " + Биос.SerialNumber);
КонецЦикла;
Для Каждого Система Из WMI.ExecQuery("SELECT Name, Domain, Model FROM Win32_ComputerSystem") Цикл
Сообщить("Имя: " + Система.Name + ", домен: " + Система.Domain + ", модель: " + Система.Model);
КонецЦикла;
КонецПроцедуры
Учитывайте особенности:
- 🔌 У ноутбука с Wi-Fi и проводной сетью будет два MAC-адреса, а при подключённом VPN — три.
- 🧩 У самосборных ПК и виртуальных машин серийный номер BIOS часто пустой или вида
To be filled by O.E.M.. - 🔁 MAC-адрес меняется при замене сетевой карты и программно подменяется в свойствах адаптера.
Когда нужна внешняя компонента
COM доступен только на Windows. Если клиенты работают на Linux, или нужен идентификатор, который трудно подделать, используют внешнюю компоненту по технологии Native API. Её подключают в клиентском коде через НачатьУстановкуВнешнейКомпоненты и ПодключитьВнешнююКомпоненту, после чего вызывают методы компоненты как у обычного объекта.
Готовые компоненты такого рода есть у разработчиков торгового оборудования и систем защиты. Перед установкой проверьте источник: компонента выполняется с правами пользователя и видит всё, что видит он.
ИмяКомпьютера() плюс СистемнаяИнформация.ИдентификаторКлиента.CLIENTNAME — имя ПК, с которого открыт RDP-сеанс.Журнал регистрации и активные пользователи: кто с какого компьютера работал
Для расследований писать код не нужно. Платформа сама записывает имя компьютера в каждое событие журнала регистрации.
Просмотр в пользовательском режиме
- В БП 3.0, ЗУП 3.1 и УТ 11 откройте
Администрирование → Обслуживание → Журнал регистрации. - Нажмите
Установить отбори укажите период. - В поле «Компьютер» выберите нужную машину или задайте отбор по пользователю и событию.
- Колонка «Компьютер» в списке покажет имя машины для каждой записи.
В Конфигураторе журнал открывается через Администрирование → Журнал регистрации. Там же есть Администрирование → Активные пользователи — список текущих сеансов с колонками «Пользователь», «Компьютер», «Приложение» и временем начала работы.
Консоль кластера и rac
В клиент-серверной базе администратор видит то же в консоли администрирования серверов 1С: ветка информационной базы → «Сеансы», колонка «Компьютер». Из командной строки список выводит rac session list --cluster=<id_кластера>, имя машины лежит в поле host. Идентификатор кластера даёт команда rac cluster list.
Своя запись в журнал при входе
Если нужен отдельный лог входов с компьютерами, добавьте в расширение конфигурации обработчик начала работы и запишите событие:
ЗаписьЖурналаРегистрации("РабочиеМеста.Вход",
УровеньЖурналаРегистрации.Информация, , ,
СтрШаблон("Вход %1 с компьютера %2", ИмяПользователя(), ИмяКомпьютера()));
Своё имя события удобно фильтровать: в отборе журнала оно появится отдельной строкой.
Журнал регистрации хранится ограниченное время — срок задаётся в настройках журнала. Если для расследований нужны данные за год, проверьте настройку заранее, а не после инцидента.
Определение компьютера в веб-клиенте, мобильном приложении и на терминальном сервере
Здесь классические методы дают неожиданные ответы, поэтому каждый случай разберём отдельно.
Веб-клиент
Браузер по соображениям безопасности не сообщает сайту имя компьютера. Сеанс веб-клиента в 1С поэтому обычно показывает имя веб-сервера, через который идёт публикация, а не машины пользователя. COM-объекты в браузере недоступны.
Что остаётся:
- 🆔
СистемнаяИнформация.ИдентификаторКлиента— различает браузеры на разных рабочих местах. - 🌍
СистемнаяИнформация.ИнформацияПрограммыПросмотра— строка User-Agent: браузер и операционная система. - 📜 IP-адрес клиента — в логах веб-сервера (IIS или Apache), если нужно сопоставить сеанс с машиной.
Мобильное приложение
На мобильной платформе понятия «имя компьютера» в привычном смысле нет. Для идентификации устройства используют ИдентификаторКлиента и тип платформы из СистемнаяИнформация. Привязывать учёт к имени устройства не стоит: пользователь меняет его в настройках телефона.
Терминальный сервер (RDP)
Все пользователи терминального сервера для 1С работают «с одного компьютера» — ИмяКомпьютера() у всех вернёт имя терминального сервера. Имя реального ПК, с которого открыт RDP-сеанс, Windows хранит в переменной среды CLIENTNAME. Её читает функция ДанныеWindows() из раздела про реестр.
Если сеанс открыт не через RDP, ExpandEnvironmentStrings вернёт строку %CLIENTNAME% без изменений. Проверяйте это условие в коде и подставляйте в таком случае обычное ИмяКомпьютера().
Частые ошибки при определении компьютера
ИмяКомпьютера() вызвана в серверном коде. Перенесите вызов в &НаКлиенте или используйте ПолучитьТекущийСеансИнформационнойБазы().ИмяКомпьютера.CLIENTNAME, для веб-клиента — ИдентификаторКлиента и логи веб-сервера.ТипПлатформы.Hostname в реестре или из Win32_ComputerSystem.ИдентификаторКлиента: пересоздан профиль Windows или человек вошёл под другой учётной записью. Перепривяжите место в справочнике.Частые вопросы
Нужны ли права администратора, чтобы узнать имя своего компьютера в 1С?
ИмяКомпьютера() и текущий сеанс доступны любому пользователю. Права администратора нужны только для списка всех сеансов базы.Можно ли узнать IP-адрес компьютера средствами 1С?
IPAddress класса Win32_NetworkAdapterConfiguration), в веб-клиенте — по логам веб-сервера.Как ограничить вход в базу с чужих компьютеров?
ИмяКомпьютера() и ИдентификаторКлиента со списком разрешённых и завершайте работу при несовпадении. Делайте это в расширении, а не в типовой конфигурации.