Пользователи информационной базы 1С из кода: методы, примеры, подводные камни
Содержание
Программно получить список пользователей базы 1С 8.3 проще всего одной строкой на сервере: ПользователиИнформационнойБазы.ПолучитьПользователей(). Метод возвращает массив объектов ПользовательИнформационнойБазы с именем, полным именем, ролями и способами входа. Вызывать его нужно в серверном контексте и с административными правами.
Если нужен список «снаружи» — из скрипта, другой базы или внешней системы — подойдут COM-соединение, собственный HTTP-сервис или утилита rac (она покажет, кто сейчас работает в базе). Тема общая для платформы: код одинаково работает в Бухгалтерии, ЗУП, УТ и самописных конфигурациях.
Где платформа хранит пользователей: два разных списка
Первое, что путает разработчиков: в типовой конфигурации пользователей два набора, и они живут в разных местах.
| Что | Где хранится | Как получить |
|---|---|---|
| Пользователи информационной базы | Служебная таблица платформы, вне объектов конфигурации | ПользователиИнформационнойБазы |
| Элементы справочника «Пользователи» | Обычная таблица справочника | Запрос к Справочник.Пользователи |
Первый список — это те, кто может войти в базу. Его видно в Конфигураторе через Администрирование → Пользователи. Там логин, пароль (точнее, его хеш), роли, аутентификация ОС, OpenID и прочие настройки входа.
Второй список ведёт Библиотека стандартных подсистем (БСП). Справочник «Пользователи» нужен прикладной логике: ответственный в документах, настройки, группы доступа. Элемент справочника связан с пользователем ИБ через реквизит ИдентификаторПользователяИБ — это уникальный идентификатор учётной записи платформы.
📌 Несколько практических следствий:
- 🔹 В справочнике бывают элементы без учётной записи — например, сотрудники, которым вход не нужен.
- 🔹 В списке ИБ бывают учётные записи без элемента справочника — их создали в Конфигураторе в обход программы.
- 🔹 Если в базе нет ни одного пользователя ИБ, вход идёт без авторизации, а
ПолучитьПользователей()вернёт пустой массив.
Если задача — «кто может войти», берите список ИБ. Если «кто числится в программе и в каких группах доступа» — справочник. Для сверки нужны оба, связанные по идентификатору.
Получение списка пользователей встроенным языком
Менеджер ПользователиИнформационнойБазы доступен на сервере, в толстом клиенте и во внешнем соединении. В тонком клиенте и веб-клиенте его нет, поэтому код размещают в серверной процедуре или общем модуле с флагом «Сервер».
Базовый пример: собираем таблицу с ключевыми полями.
&НаСервереБезКонтекста
Функция СписокПользователейИБ()
Результат = Новый Массив;
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Для Каждого Пользователь Из Пользователи Цикл
Данные = Новый Структура;
Данные.Вставить("Имя", Пользователь.Имя);
Данные.Вставить("ПолноеИмя", Пользователь.ПолноеИмя);
Данные.Вставить("Идентификатор", Строка(Пользователь.УникальныйИдентификатор));
Данные.Вставить("ВходПоПаролю", Пользователь.АутентификацияСтандартная);
Данные.Вставить("ВходОС", Пользователь.АутентификацияОС);
Данные.Вставить("ПользовательОС", Пользователь.ПользовательОС);
Данные.Вставить("ПолныеПрава", Пользователь.Роли.Содержит(Метаданные.Роли.ПолныеПрава));
Результат.Добавить(Данные);
КонецЦикла;
Возврат Результат;
КонецФункции
Почему функция возвращает структуры, а не сами объекты? ПользовательИнформационнойБазы нельзя передать на клиент. Попытка вернуть массив таких объектов в клиентскую процедуру закончится ошибкой о недопустимом типе. Структуры из строк и булевых значений передаются без проблем.
Полезные свойства пользователя ИБ
| Свойство | Что содержит |
|---|---|
Имя | Логин, который вводят в окне входа |
ПолноеИмя | Представление в списке выбора |
УникальныйИдентификатор | Ключ для связи со справочником |
АутентификацияСтандартная | Разрешён вход по логину и паролю |
АутентификацияОС / ПользовательОС | Вход через Windows и учётная запись домена |
ПоказыватьВСпискеВыбора | Виден ли в выпадающем списке при входе |
ПарольУстановлен | Задан ли пароль (сам пароль прочитать нельзя) |
Роли | Коллекция назначенных ролей |
Поиск одного пользователя без перебора
Если нужен не весь список, а конкретная учётная запись, перебор не нужен:
- 🔎
ПользователиИнформационнойБазы.НайтиПоИмени("Бухгалтер")— по логину; - 🔎
ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Идентификатор)— по идентификатору из справочника; - 🔎
ПользователиИнформационнойБазы.ТекущийПользователь()— тот, кто выполняет код.
Оба метода поиска возвращают Неопределено, если учётная запись не найдена. Проверяйте результат до обращения к свойствам.
Запрос к справочнику «Пользователи» в типовых конфигурациях
Учётные записи ИБ языком запросов не выбрать: служебная таблица платформы не входит в метаданные. Зато справочник БСП — обычная таблица, и к ней работает привычный запрос.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Пользователи.Ссылка КАК Ссылка,
| Пользователи.Наименование КАК Наименование,
| Пользователи.ИдентификаторПользователяИБ КАК ИдентификаторИБ,
| Пользователи.Недействителен КАК Недействителен
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| НЕ Пользователи.ПометкаУдаления
| И НЕ Пользователи.Служебный
|
|УПОРЯДОЧИТЬ ПО
| Наименование";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Выборка.Наименование, Выборка.ИдентификаторИБ
КонецЦикла;
Флаг Недействителен в БСП означает, что пользователю запретили вход, а элемент оставили для истории. Флаг Служебный отмечает технических пользователей, которых программа прячет из обычных списков. Уберите условия, если нужен полный перечень.
Как сопоставить справочник и учётные записи
Типовая задача — найти расхождения: элементы справочника без входа и логины без элемента справочника. Схема простая:
- Получите массив
ПолучитьПользователей()и сложите идентификаторы вСоответствие. - Выполните запрос к справочнику.
- Для каждой строки выборки проверьте наличие
ИдентификаторИБв соответствии. Нет — у элемента нет учётной записи. - Те идентификаторы, что остались в соответствии без пары, — учётные записи без элемента справочника.
Пустой ИдентификаторИБ хранится как пустой уникальный идентификатор (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.
Создание сервиса
- В Конфигураторе (или в расширении) откройте ветку
Общие → HTTP-сервисыи добавьте сервис с корневым URL, напримерusers. - Добавьте шаблон URL
/listи методGET. - В обработчике метода напишите код ниже.
- Опубликуйте базу на веб-сервере:
Администрирование → Публикация на веб-сервере, отметьте сервис в списке 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-сервис дёргают каждую минуту, сохраняйте результат в повторно используемом модуле на время сеанса или кладите в регистр сведений по расписанию.
- ⚡ Запрос к справочнику вместо перебора объектов. Если хватает данных справочника, не обращайтесь к учётным записям ИБ вовсе.
Проверка ролей через Роли.Содержит() работает быстро. А вот обращение Метаданные.Роли.ПолныеПрава внутри цикла лучше вынести в переменную до цикла: код станет и чище, и короче.