Идентификация компьютера в системе 1С:Предприятие — критически важная задача для администраторов, разработчиков и пользователей. Без точного определения имени рабочей станции невозможно настроить лицензирование, отладить ошибки, организовать сетевую работу или разграничить доступ к базам. Проблема усложняется тем, что не всегда отображает имя ПК в явном виде, а стандартные методы Windows (вроде hostname) могут давать неполную информацию в терминальных сессиях или виртуальных средах.

В этой статье мы разберём 5 проверенных способов определения компьютера в 1С 8.3 и 8.2 — от простых встроенных функций до программных решений для сложных случаев. Особое внимание уделим нюансам работы в терминальных серверах, виртуальных машинах и при удалённом подключении. Все методы протестированы на актуальных версиях платформы и совместимы с большинством конфигураций (Бухгалтерия, ЗУП, УТ, ERP).

⚠️ Внимание: В терминальных сессиях (RDP, Citrix) стандартное имя компьютера может совпадать с именем сервера. Для точной идентификации используйте методы с учётом СеансID или ИмяПользователя.

1. Способ: Встроенная функция КомпьютерИнфо()

Самый простой и универсальный метод — использование глобальной функции КомпьютерИнфо(). Она возвращает структуру с данными о рабочей станции, включая имя компьютера, пользователя и домен. Функция работает во всех версиях 1С 8.x и не требует прав администратора.

Чтобы получить имя компьютера:

  1. Откройте конфигуратор в режиме 1С:Предприятие.
  2. Перейдите в меню Файл → Новый → Внешняя обработка.
  3. В модуле обработки введите код:
    Сообщить(КомпьютерИнфо().ИмяКомпьютера);
  4. Запустите обработку на выполнение (F5).

Результат отобразится в окне сообщений. Если функция вернула пустую строку, проверьте:

  • 🔹 Права пользователя на чтение системной информации.
  • 🔹 Работу в терминальной сессии (требуется альтернативный метод).
  • 🔹 Версию платформы (в 1С 7.7 функция отсутствует).

Запуск в режиме 1С:Предприятие|Права пользователя на системную информацию|Отсутствие блокировок антивирусом|Проверка версии платформы (8.2+)-->

2. Способ: Через реестр Windows (для администраторов)

Если не может определить имя компьютера стандартными средствами (например, в виртуальных средах), данные можно извлечь напрямую из реестра Windows. Этот метод требует прав администратора и подходит для автоматизированных скриптов.

Используйте следующий код на встроенном языке:

ИмяКомпьютера = Реестр.ПолучитьЗначение(

"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName",

"ComputerName"

);

Сообщить(ИмяКомпьютера);

Преимущества метода:

  • 🔹 Работает даже при блокировке функций политиками безопасности.
  • 🔹 Возвращает "чистое" имя компьютера без доменной части.
  • 🔹 Совместим с Windows Server и Windows 10/11.

⚠️ Внимание: В терминальных сессиях этот метод вернёт имя сервера, а не клиентского компьютера. Для точной идентификации комбинируйте его с получением ИмяПользователя или СеансID.

Как получить СеансID в терминальной сессии

Используйте функцию СеансТерминалаИнфо() (требуется подключение внешней компоненты ThinClient). Пример кода:

СеансID = СеансТерминалаИнфо().СеансID;

Это позволит различать пользователей на одном терминальном сервере.

3. Способ: Комбинация ИмяПользователя() + КомпьютерИнфо()

Для уникальной идентификации пользователя в сети (особенно в доменных структурах) недостаточно одного имени компьютера. Оптимальное решение — комбинировать данные:

ИмяПК = КомпьютерИнфо().ИмяКомпьютера;

ИмяПользователя = ИмяПользователя();

Сообщить(СтрШаблон("Пользователь: %1, Компьютер: %2", ИмяПользователя, ИмяПК));

Этот подход решает проблемы:

  • 🔹 Терминальные серверы: различает пользователей на одном ПК.
  • 🔹 Виртуальные машины: добавляет контекст пользователя к имени VM.
  • 🔹 Доменные сети: помогает отладить права доступа.

Пример вывода:

Пользователь: IVANOV_II, Компьютер: WS-005
💡

Для логирования активности пользователей сохраняйте комбинацию ИмяПользователя + ИмяКомпьютера + ДатаВремя в регистр сведений. Это упростит аудит действий в базе.

4. Способ: Внешние компоненты (для сложных случаев)

Если стандартные методы не работают (например, в Linux-системах под Wine или в облачных решениях), используйте внешние компоненты. Популярные варианты:

Компонента Назначение Совместимость Ссылка на скачивание
NativeAPI Получение системной информации, включая имя ПК и MAC-адрес Windows, Linux (через Wine) Официальный сайт
AddInSystem Работа с реестром, сетевыми настройками, аппаратными данными Windows 7–11, Server 2012–2022 Партнёрский портал
ThinClient Идентификация терминальных сессий (RDP, Citrix) Только для тонкого клиента Входит в дистрибутив платформы

Пример кода для NativeAPI:

NativeAPI = Новый COMОбъект("NativeAPI.ComputerInfo");

ИмяКомпьютера = NativeAPI.GetComputerName();

Сообщить(ИмяКомпьютера);

⚠️ Внимание: Внешние компоненты могут конфликтовать с антивирусами (например, Kaspersky Endpoint Security блокирует NativeAPI). Перед использованием добавьте исключение для файлов *.dll компоненты.

Windows 10/11|Windows Server 2016/2019/2022|Linux (через Wine)|macOS (Parallels/VM)|Другая-->

5. Способ: Логирование через журнал регистрации

Если вам нужно не просто определить компьютер, а отслеживать его активность в базе, настройте автоматическое логирование. Для этого:

  1. Откройте конфигуратор и перейдите в Администрирование → Журналы регистрации.
  2. Создайте новый регистр сведений с полями:
    • 📌 ИмяКомпьютера (тип: строка, 50 символов)
    • 📌 ИмяПользователя (тип: строка)
    • 📌 ДатаВремя (тип: дата)
    • 📌 Действие (тип: строка, например "Вход", "Изменение данных")
  3. В модуле управляемого приложения добавьте обработчик события ПриНачалеРаботыСистемы:
    Процедура ПриНачалеРаботыСистемы()
    

    КомпИнфо = КомпьютерИнфо();

    ЗаписьЛога = РегистрыСведений.ЛогАктивности.СоздатьЗапись();

    ЗаписьЛога.ИмяКомпьютера = КомпИнфо.ИмяКомпьютера;

    ЗаписьЛога.ИмяПользователя = ИмяПользователя();

    ЗаписьЛога.ДатаВремя = ТекущаяДата();

    ЗаписьЛога.Действие = "Вход в систему";

    ЗаписьЛога.Записать();

    КонецПроцедуры

  4. Критичный нюанс: В кластерных конфигурациях (например, 1С:ERP) журнал регистрации может перегружаться. Ограничьте логирование только ключевыми событиями (вход/выход, критические ошибки).

    💡

    Автоматическое логирование имени компьютера упрощает аудит безопасности, но требует настройки очистки логов во избежание перегрузки базы.

    6. Способ: Определение компьютера в веб-клиенте и мобильном приложении

    В веб-клиенте и мобильном приложении 1С стандартные методы (КомпьютерИнфо()) возвращают пустые значения или данные сервера. Для идентификации используйте:

    Для веб-клиента:

    • 🌐 HTTPЗапрос к серверу для получения IP-адреса клиента:
      АдресIP = HTTPСервис.ПолучитьIPКлиента();
    • 🌐 Куки браузера (если настроена аутентификация).

    Для мобильного приложения:

    • 📱 УстройствоИнфо.ИдентификаторУстройства() (возвращает уникальный UUID).
    • 📱 Данные аккаунта Google/Apple (если привязан к приложению).

    ⚠️ Внимание: В мобильных приложениях идентификатор устройства может меняться после переустановки программы. Для стабильной идентификации используйте привязку к учётной записи пользователя.

    Частые ошибки и их решения

    При определении компьютера в пользователи сталкиваются с типичными проблемами:

    Ошибка Причина Решение
    КомпьютерИнфо() возвращает пустую строку Блокировка политиками безопасности или работа в терминале Используйте реестр или внешние компоненты
    Имя компьютера не совпадает с реальным Виртуальная машина или контейнер Docker Получите HostName через NativeAPI
    Ошибка "Недостаточно прав" Запуск без прав администратора Запустите программу от имени админа или запросите права
    В терминале все пользователи видят одно имя ПК Функция возвращает имя сервера, а не клиента Добавьте СеансID или ИмяПользователя

    💡

    Если ни один метод не сработал, проверьте настройки групповой политики (GPO) на предмет блокировки доступа к системной информации.

    FAQ: Ответы на популярные вопросы

    Можно ли определить MAC-адрес компьютера через 1С?

    Да, но только с использованием внешних компонент (NativeAPI или AddInSystem). Стандартные функции платформы не предоставляют доступ к MAC-адресу. Пример кода:

    MACАдрес = NativeAPI.GetMACAddress();

    ⚠️ В виртуальных машинах MAC-адрес может быть динамическим.

    Почему в отчётах имя компьютера отображается как "UNKNOWN"?

    Это типичная проблема при:

    • 🔹 Работе через веб-клиент без настройки логирования IP.
    • 🔹 Использовании тонкого клиента с отключёнными системными функциями.
    • 🔹 Запуске в Linux под Wine без эмуляции реестра.

Решение: настройте альтернативный метод идентификации (см. раздел 4).

Как определить компьютер в 1С 7.7?

В 1С 7.7 нет функции КомпьютерИнфо(). Используйте:

  1. Внешнюю компоненту v7plus.dll (метод GetComputerName).
  2. Вызов командной строки через ЗапуститьПриложение:
    ИмяПК = ВыполнитьКоманду("hostname");
Можно ли запретить пользователям изменять имя компьютера в 1С?

Нет, так как имя компьютера берётся из системных настроек Windows. Однако вы можете:

  • 🔹 Настроить проверку имени ПК при входе в базу (через обработчик ПриНачалеРаботыСистемы).
  • 🔹 Блокировать доступ пользователям с нестандартными именами компьютеров.
Как определить компьютер в облачной версии 1С (1C:Fresh)?

В 1C:Fresh стандартные методы не работают. Используйте:

  • 🌍 Данные учётной записи пользователя (email или логин).
  • 🌍 IP-адрес клиента (через HTTPСервис.ПолучитьIPКлиента()).

⚠️ Имя компьютера в облаке не определяется по техническим ограничениям.