Пользователи информационной базы 1С из кода: методы, примеры, подводные камни

· 9 мин

Содержание

Программно получить список пользователей базы 1С 8.3 проще всего одной строкой на сервере: ПользователиИнформационнойБазы.ПолучитьПользователей(). Метод возвращает массив объектов ПользовательИнформационнойБазы с именем, полным именем, ролями и способами входа. Вызывать его нужно в серверном контексте и с административными правами.

Если нужен список «снаружи» — из скрипта, другой базы или внешней системы — подойдут COM-соединение, собственный HTTP-сервис или утилита rac (она покажет, кто сейчас работает в базе). Тема общая для платформы: код одинаково работает в Бухгалтерии, ЗУП, УТ и самописных конфигурациях.

Где платформа хранит пользователей: два разных списка

Первое, что путает разработчиков: в типовой конфигурации пользователей два набора, и они живут в разных местах.

ЧтоГде хранитсяКак получить
Пользователи информационной базыСлужебная таблица платформы, вне объектов конфигурацииПользователиИнформационнойБазы
Элементы справочника «Пользователи»Обычная таблица справочникаЗапрос к Справочник.Пользователи

Первый список — это те, кто может войти в базу. Его видно в Конфигураторе через Администрирование → Пользователи. Там логин, пароль (точнее, его хеш), роли, аутентификация ОС, OpenID и прочие настройки входа.

Второй список ведёт Библиотека стандартных подсистем (БСП). Справочник «Пользователи» нужен прикладной логике: ответственный в документах, настройки, группы доступа. Элемент справочника связан с пользователем ИБ через реквизит ИдентификаторПользователяИБ — это уникальный идентификатор учётной записи платформы.

📌 Несколько практических следствий:

  • 🔹 В справочнике бывают элементы без учётной записи — например, сотрудники, которым вход не нужен.
  • 🔹 В списке ИБ бывают учётные записи без элемента справочника — их создали в Конфигураторе в обход программы.
  • 🔹 Если в базе нет ни одного пользователя ИБ, вход идёт без авторизации, а ПолучитьПользователей() вернёт пустой массив.

Если задача — «кто может войти», берите список ИБ. Если «кто числится в программе и в каких группах доступа» — справочник. Для сверки нужны оба, связанные по идентификатору.

Получение списка пользователей встроенным языком

Менеджер ПользователиИнформационнойБазы доступен на сервере, в толстом клиенте и во внешнем соединении. В тонком клиенте и веб-клиенте его нет, поэтому код размещают в серверной процедуре или общем модуле с флагом «Сервер».

Базовый пример: собираем таблицу с ключевыми полями.

&НаСервереБезКонтекста
Функция СписокПользователейИБ()

    Результат = Новый Массив;
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();

    Для Каждого Пользователь Из Пользователи Цикл
        Данные = Новый Структура;
        Данные.Вставить("Имя", Пользователь.Имя);
        Данные.Вставить("ПолноеИмя", Пользователь.ПолноеИмя);
        Данные.Вставить("Идентификатор", Строка(Пользователь.УникальныйИдентификатор));
        Данные.Вставить("ВходПоПаролю", Пользователь.АутентификацияСтандартная);
        Данные.Вставить("ВходОС", Пользователь.АутентификацияОС);
        Данные.Вставить("ПользовательОС", Пользователь.ПользовательОС);
        Данные.Вставить("ПолныеПрава", Пользователь.Роли.Содержит(Метаданные.Роли.ПолныеПрава));
        Результат.Добавить(Данные);
    КонецЦикла;

    Возврат Результат;

КонецФункции

Почему функция возвращает структуры, а не сами объекты? ПользовательИнформационнойБазы нельзя передать на клиент. Попытка вернуть массив таких объектов в клиентскую процедуру закончится ошибкой о недопустимом типе. Структуры из строк и булевых значений передаются без проблем.

Полезные свойства пользователя ИБ

СвойствоЧто содержит
ИмяЛогин, который вводят в окне входа
ПолноеИмяПредставление в списке выбора
УникальныйИдентификаторКлюч для связи со справочником
АутентификацияСтандартнаяРазрешён вход по логину и паролю
АутентификацияОС / ПользовательОСВход через Windows и учётная запись домена
ПоказыватьВСпискеВыбораВиден ли в выпадающем списке при входе
ПарольУстановленЗадан ли пароль (сам пароль прочитать нельзя)
РолиКоллекция назначенных ролей

Поиск одного пользователя без перебора

Если нужен не весь список, а конкретная учётная запись, перебор не нужен:

  • 🔎 ПользователиИнформационнойБазы.НайтиПоИмени("Бухгалтер") — по логину;
  • 🔎 ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Идентификатор) — по идентификатору из справочника;
  • 🔎 ПользователиИнформационнойБазы.ТекущийПользователь() — тот, кто выполняет код.

Оба метода поиска возвращают Неопределено, если учётная запись не найдена. Проверяйте результат до обращения к свойствам.

Запрос к справочнику «Пользователи» в типовых конфигурациях

Учётные записи ИБ языком запросов не выбрать: служебная таблица платформы не входит в метаданные. Зато справочник БСП — обычная таблица, и к ней работает привычный запрос.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Пользователи.Ссылка КАК Ссылка,
|    Пользователи.Наименование КАК Наименование,
|    Пользователи.ИдентификаторПользователяИБ КАК ИдентификаторИБ,
|    Пользователи.Недействителен КАК Недействителен
|ИЗ
|    Справочник.Пользователи КАК Пользователи
|ГДЕ
|    НЕ Пользователи.ПометкаУдаления
|    И НЕ Пользователи.Служебный
|
|УПОРЯДОЧИТЬ ПО
|    Наименование";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    // Выборка.Наименование, Выборка.ИдентификаторИБ
КонецЦикла;

Флаг Недействителен в БСП означает, что пользователю запретили вход, а элемент оставили для истории. Флаг Служебный отмечает технических пользователей, которых программа прячет из обычных списков. Уберите условия, если нужен полный перечень.

Как сопоставить справочник и учётные записи

Типовая задача — найти расхождения: элементы справочника без входа и логины без элемента справочника. Схема простая:

  1. Получите массив ПолучитьПользователей() и сложите идентификаторы в Соответствие.
  2. Выполните запрос к справочнику.
  3. Для каждой строки выборки проверьте наличие ИдентификаторИБ в соответствии. Нет — у элемента нет учётной записи.
  4. Те идентификаторы, что остались в соответствии без пары, — учётные записи без элемента справочника.

Пустой ИдентификаторИБ хранится как пустой уникальный идентификатор (00000000-0000-0000-0000-000000000000). Отсейте такие строки сразу, иначе получите ложные совпадения.

Список пользователей 1С через COM-соединение и внешние скрипты

COM-соединение — способ достать список из внешней программы на Windows: из другой базы 1С, PowerShell, Python. Внешнее соединение работает как толстый клиент без интерфейса, поэтому ПользователиИнформационнойБазы в нём доступен.

Подготовка

  • 🧩 Компонента comcntr.dll должна быть зарегистрирована той же разрядности, что и вызывающая программа. Регистрация: regsvr32 "C:\Program Files\1cv8\<версия>\bin\comcntr.dll" от имени администратора.
  • 🧩 Версия компоненты должна совпадать с версией платформы сервера. После обновления платформы регистрацию повторяют.
  • 🧩 Учётная запись в строке соединения должна иметь административную роль.

Пример из другой базы 1С

Коннектор = Новый COMОбъект("V83.COMConnector");
Соединение = Коннектор.Connect("Srvr=""srv-1c"";Ref=""buh"";Usr=""Админ"";Pwd=""пароль"";");

Пользователи = Соединение.ПользователиИнформационнойБазы.ПолучитьПользователей();
Для Каждого Пользователь Из Пользователи Цикл
    Сообщить(Пользователь.Имя + " — " + Пользователь.ПолноеИмя);
КонецЦикла;

Для файловой базы строка соединения другая: File="C:\Bases\Buh";Usr="Админ";Pwd="пароль";.

Пример на Python

import win32com.client

connector = win32com.client.Dispatch("V83.COMConnector")
conn = connector.Connect('Srvr="srv-1c";Ref="buh";Usr="Admin";Pwd="secret";')

for user in conn.InfoBaseUsers.GetUsers():
    print(user.Name, "|", user.FullName)

Во внешнем соединении работают и английские имена объектов глобального контекста, это удобнее для языков, где кириллица в идентификаторах неудобна.

Каждое COM-соединение занимает сеанс и клиентскую лицензию. Скрипт, который открывает соединение по таймеру и не закрывает его, быстро съест лицензии. Освобождайте объект соединения сразу после выгрузки.

Выдача списка через HTTP-сервис

Если список нужен Linux-системе, порталу или сервису мониторинга, COM не подходит. Надёжный вариант — свой HTTP-сервис в конфигурации или в расширении, который отдаёт JSON.

Создание сервиса

  1. В Конфигураторе (или в расширении) откройте ветку Общие → HTTP-сервисы и добавьте сервис с корневым URL, например users.
  2. Добавьте шаблон URL /list и метод GET.
  3. В обработчике метода напишите код ниже.
  4. Опубликуйте базу на веб-сервере: Администрирование → Публикация на веб-сервере, отметьте сервис в списке HTTP-сервисов.
Функция СписокGET(Запрос)

    УстановитьПривилегированныйРежим(Истина);

    Массив = Новый Массив;
    Для Каждого Пользователь Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
        Массив.Добавить(Новый Структура("name,fullName,id",
            Пользователь.Имя,
            Пользователь.ПолноеИмя,
            Строка(Пользователь.УникальныйИдентификатор)));
    КонецЦикла;

    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    ЗаписатьJSON(Запись, Массив);

    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    Ответ.УстановитьТелоИзСтроки(Запись.Закрыть());
    Возврат Ответ;

КонецФункции

После публикации список доступен по адресу вида http://сервер/buh/hs/users/list. Запрос выполняется от имени пользователя, указанного при базовой авторизации.

Привилегированный режим открывает список всем, кто может вызвать сервис. Заведите для интеграции отдельного пользователя с узкой ролью, где разрешён только этот HTTP-сервис, и закройте публикацию HTTPS.

💡 Стандартный интерфейс OData отдаёт справочник «Пользователи» как обычный справочник, если включить его в состав публикуемых объектов. Учётные записи ИБ через OData не получить — только через свой код.

Кто сейчас в базе: активные сеансы и соединения

Часто «список пользователей» на самом деле означает «кто сейчас работает». Это другая задача, и решается она другими методами.

Из кода конфигурации

Для Каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл
    ИмяПользователя = ?(Сеанс.Пользователь = Неопределено, "<без авторизации>", Сеанс.Пользователь.Имя);
    Сообщить(СтрШаблон("%1 | %2 | %3 | %4",
        ИмяПользователя,
        ПредставлениеПриложения(Сеанс.ИмяПриложения),
        Сеанс.ИмяКомпьютера,
        Сеанс.НачалоСеанса));
КонецЦикла;

ПолучитьСеансыИнформационнойБазы() возвращает все сеансы, включая фоновые задания и COM-соединения. Отфильтровать интерактивных пользователей можно по ИмяПриложения: у тонкого клиента это ThinClient, у веб-клиента WebClient, у фоновых заданий BackgroundJob. Номер своего сеанса даёт НомерСеансаИнформационнойБазы().

Есть и устаревший метод ПолучитьСоединенияИнформационнойБазы(). В новых разработках используйте сеансы: соединение в клиент-серверном режиме — понятие короткоживущее и не равно рабочему месту.

Без захода в базу: rac и консоль кластера

Администратору серверной базы удобнее смотреть сеансы снаружи, через сервер администрирования ras и утилиту rac:

rac cluster list
rac session list --cluster=<uuid-кластера>
rac session list --cluster=<uuid-кластера> --licenses

Вывод содержит имя пользователя, приложение, компьютер и время начала для каждого сеанса. Ключ --licenses показывает, какие лицензии заняты. Точный набор параметров для вашей версии смотрите в rac help session.

Не завершайте сеансы из скрипта «на всякий случай»: пользователь потеряет несохранённый документ. Если сеансы нужно закрыть перед регламентной операцией, делайте это во внерабочее время и предупреждайте людей заранее.

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

Почти все проблемы с этой задачей — про права и контекст выполнения.

Диагностика: выберите симптом

Что прочитать нельзя

  • 🔒 Пароль пользователя — платформа хранит только хеш. Есть лишь признак ПарольУстановлен.
  • 🔒 Прямое чтение таблицы v8users в SQL или в файле базы. Данные там частично в двоичном виде, формат не документирован и меняется. Фирма 1С такой способ не поддерживает, а для СУБД это лишняя нагрузка на служебные таблицы. Используйте платформенные методы.

Большие списки: как не тормозить базу

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

📈 Что реально ускоряет выгрузку:

  • ⚡ Один вызов ПолучитьПользователей() на всю операцию. Метод читает все учётные записи. Не вызывайте его в цикле по справочнику — получите N полных чтений.
  • ⚡ Соответствие вместо поиска в массиве. Для сопоставления со справочником сложите идентификаторы в Соответствие — поиск станет мгновенным.
  • ⚡ Точечный поиск, если нужен один пользователь. НайтиПоУникальномуИдентификатору дешевле полного списка.
  • ⚡ Один серверный вызов с клиента. Соберите всё на сервере и верните массив структур. Десятки вызовов сервера из клиентского цикла — главный источник задержек в веб-клиенте.
  • ⚡ Кеш для частых запросов. Если HTTP-сервис дёргают каждую минуту, сохраняйте результат в повторно используемом модуле на время сеанса или кладите в регистр сведений по расписанию.
  • ⚡ Запрос к справочнику вместо перебора объектов. Если хватает данных справочника, не обращайтесь к учётным записям ИБ вовсе.

Проверка ролей через Роли.Содержит() работает быстро. А вот обращение Метаданные.Роли.ПолныеПрава внутри цикла лучше вынести в переменную до цикла: код станет и чище, и короче.

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

Можно ли получить список пользователей без прав администратора?
Только справочник «Пользователи» запросом, если на него есть право чтения. Учётные записи ИБ требуют административных прав или привилегированного режима на сервере.
Как узнать, когда пользователь последний раз входил в базу?
У объекта пользователя ИБ такого свойства нет. Дату входа берут из журнала регистрации по событию начала сеанса с отбором по пользователю.
Как выгрузить список пользователей в Excel без программирования?
В режиме 1С:Предприятие откройте список пользователей в разделе администрирования и выгрузите его стандартной командой вывода списка. Учётные записи ИБ без справочника так не выгрузить — нужен код.
Работает ли ПолучитьПользователей в файловой базе?
Да. Метод одинаково работает в файловом и клиент-серверном вариантах, отличается только строка соединения для внешнего доступа.
Чем сеанс отличается от пользователя?
Пользователь — учётная запись. Сеанс — конкретный вход под ней. Один пользователь может держать несколько сеансов одновременно, например тонкий клиент и фоновое задание.