GUID пользователя информационной базы 1С: где взять и как не перепутать

· 9 мин

Содержание

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

Типичная ситуация: интегратор просит «GUID пользователя» для настройки обмена, или в журнале регистрации всплыла запись с незнакомым идентификатором, и надо понять, кто это. В обоих случаях одного взгляда в карточку пользователя не хватит: в интерфейсе 1С этот идентификатор нигде не выводится.

Какой идентификатор вам нужен: три похожих GUID

В базе на платформе 8.3 у одного человека бывает сразу несколько идентификаторов. Их путают чаще всего, поэтому сначала определитесь, какой именно у вас просят.

Что этоГде живётКак выглядитКогда нужен
Идентификатор пользователя ИБСписок пользователей платформы (Конфигуратор → Администрирование → Пользователи)3f2a9c1e-... (36 символов)Журнал регистрации, сеансы, программная работа с правами и паролями
Уникальный идентификатор ссылкиЭлемент справочника «Пользователи»Тоже 36 символов, но другое значениеНавигационные ссылки, обмены данными, внешние системы
Номер сеансаТекущее подключениеЦелое число, например 14Завершение конкретного сеанса, разбор блокировок

Пользователь ИБ — это учётная запись платформы: имя, пароль, роли, аутентификация. Элемент справочника «Пользователи» — это объект конфигурации, на который ссылаются документы в поле «Ответственный» или «Автор». В типовых конфигурациях на базе БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) эти две сущности связаны через реквизит ИдентификаторПользователяИБ.

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

Кто сейчас в базе: смотрим подключения через интерфейс

Интерфейс не покажет GUID, но поможет найти имя пользователя и номер его сеанса. С именем на руках идентификатор достаётся за минуту способами из следующих разделов.

В пользовательском режиме (Бухгалтерия 3.0, ЗУП 3.1, УТ 11):

  1. Откройте Администрирование → Обслуживание.
  2. В группе, посвящённой протоколированию и анализу, нажмите «Активные пользователи».
  3. В списке видны имя пользователя, компьютер, приложение (тонкий клиент, конфигуратор, фоновое задание), время начала и номер сеанса.

В Конфигураторе: Администрирование → Активные пользователи. Список проще, но для файловой базы этого достаточно.

В клиент-серверной базе сеансы видны также в консоли администрирования серверов 1С: кластер → информационная база → «Сеансы». Там же колонка «Пользователь» и номер сеанса. Из командной строки то же самое выдаёт rac session list с указанием кластера; параметры уточняйте через rac help session.

Из этих списков можно завершить сеанс. Пользователь потеряет несохранённые данные, а фоновое задание оборвётся на середине. Завершайте сеансы только после предупреждения людей.

Идентификатор пользователя ИБ через консоль запросов

Самый быстрый способ без программирования — запрос к справочнику «Пользователи». Подойдёт внешняя обработка «Консоль запросов» или любая другая, умеющая выполнять произвольный запрос. Нужны права на чтение справочника; администратору их хватает.

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

ВЫБРАТЬ
    Пользователи.Наименование КАК ФИО,
    Пользователи.ИдентификаторПользователяИБ КАК GUID_ПользователяИБ,
    Пользователи.Ссылка КАК Ссылка,
    Пользователи.Недействителен КАК Недействителен
ИЗ
    Справочник.Пользователи КАК Пользователи
УПОРЯДОЧИТЬ ПО
    Пользователи.Наименование

Колонка GUID_ПользователяИБ — то, что искали. Если у кого-то там нули (00000000-0000-0000-0000-000000000000), значит, элемент справочника есть, а учётной записи для входа нет. Так бывает у сотрудников, которых завели «для подписи», но в базу не пускали.

Обратная задача — по GUID из журнала найти человека:

ВЫБРАТЬ
    Пользователи.Наименование
ИЗ
    Справочник.Пользователи КАК Пользователи
ГДЕ
    Пользователи.ИдентификаторПользователяИБ = &Идентификатор

В параметр Идентификатор передайте значение типа «Уникальный идентификатор», а не строку. В консоли запросов тип параметра выбирают при его заполнении.

Если в базе используются внешние пользователи (личные кабинеты контрагентов), такой же реквизит ИдентификаторПользователяИБ есть у справочника «Внешние пользователи». Не нашли GUID среди обычных пользователей — проверьте там.

Ограничение способа: запрос видит только тех, кто заведён в справочнике. Учётную запись, созданную напрямую в Конфигураторе в обход справочника, он не найдёт. Её покажет только код из следующего раздела.

Получение идентификатора пользователя в коде 1С

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

Текущий пользователь

&НаСервереБезКонтекста
Функция ИдентификаторТекущегоПользователя()
    ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
    Возврат Строка(ПользовательИБ.УникальныйИдентификатор);
КонецФункции

Для ТекущийПользователь() административные права не нужны: любой пользователь может узнать свой идентификатор.

Пользователь по имени

&НаСервереБезКонтекста
Функция ИдентификаторПоИмени(ИмяПользователя)
    ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
    Если ПользовательИБ = Неопределено Тогда
        Возврат "";
    КонецЕсли;
    Возврат Строка(ПользовательИБ.УникальныйИдентификатор);
КонецФункции

Ищется по полю «Имя» (логин), а не по полному имени. Для «Иванова Мария Петровна» с логином ИвановаМП передавать нужно ИвановаМП.

Все пользователи списком

&НаСервере
Процедура ВывестиВсехПользователей()
    УстановитьПривилегированныйРежим(Истина);
    Для Каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
        Сообщить(СтрШаблон("%1 | %2 | %3",
            ПользовательИБ.Имя,
            ПользовательИБ.ПолноеИмя,
            Строка(ПользовательИБ.УникальныйИдентификатор)));
    КонецЦикла;
КонецПроцедуры

Этот метод требует права «Администрирование», поэтому в обработке для обычного пользователя без привилегированного режима он упадёт с ошибкой нарушения прав. Привилегированный режим разрешён только в серверном коде и в модулях, которым он позволен; во внешней обработке, запущенной в базе с профилями безопасности, он может быть недоступен.

Пользователи из активных сеансов

&НаСервере
Процедура ВывестиСеансы()
    Для Каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл
        Если Сеанс.Пользователь = Неопределено Тогда
            Продолжить;
        КонецЕсли;
        Сообщить(СтрШаблон("Сеанс %1: %2 (%3), %4",
            Формат(Сеанс.НомерСеанса, "ЧГ=0"),
            Сеанс.Пользователь.Имя,
            Строка(Сеанс.Пользователь.УникальныйИдентификатор),
            Сеанс.ИмяПриложения));
    КонецЦикла;
КонецПроцедуры

Проверка на Неопределено нужна для сеансов без пользователя. Свой сеанс отдельно возвращает ПолучитьТекущийСеансИнформационнойБазы().

Строка или уникальный идентификатор

Внешние системы и журналы передают GUID строкой, а реквизиты и методы платформы ждут значение типа УникальныйИдентификатор. Сравнение строки с таким значением даст «Ложь», даже если символы совпадают. Поэтому строку сначала преобразуют, а заодно проверяют, что это вообще GUID:

&НаСервереБезКонтекста
Функция ПользовательПоСтроке(СтрокаGUID)
    Попытка
        Идентификатор = Новый УникальныйИдентификатор(СокрЛП(СтрокаGUID));
    Исключение
        Возврат Неопределено; // в строке не GUID
    КонецПопытки;
    УстановитьПривилегированныйРежим(Истина);
    Возврат ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Идентификатор);
КонецФункции

Конструктор вызывает исключение на строке неверного формата: с лишними символами, фигурными скобками от SQL или обрезанной при копировании. СокрЛП убирает пробелы и переносы, которые часто прилипают при копировании из почты.

Связь со справочником в типовых конфигурациях

В конфигурациях на БСП ссылку на элемент справочника текущего пользователя даёт Пользователи.ТекущийПользователь(), а элемент по GUID находится так:

Ссылка = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", Идентификатор);

Здесь Идентификатор — значение типа УникальныйИдентификатор. Из строки его получают конструктором Новый УникальныйИдентификатор(СтрокаGUID). Обратный путь — по GUID найти учётную запись — даёт ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Идентификатор).

Поиск в журнале регистрации задним числом

Задача обратная: пользователь уже вышел, а нужно понять, кто вчера в 17:40 удалил документ. Журнал регистрации хранит для каждой записи и имя, и идентификатор пользователя ИБ.

Через интерфейс:

  1. Откройте Администрирование → Обслуживание → Журнал регистрации (в Конфигураторе — Администрирование → Журнал регистрации).
  2. Установите отбор по периоду и по пользователю.
  3. Откройте нужную запись двойным щелчком: в карточке видны пользователь, компьютер, приложение, событие и данные.

Программно — методом ВыгрузитьЖурналРегистрации. В выгруженной таблице колонка Пользователь содержит уникальный идентификатор, а ИмяПользователя — имя:

&НаСервере
Процедура КтоРаботалВчера()
    УстановитьПривилегированныйРежим(Истина);
    Таблица = Новый ТаблицаЗначений;
    Отбор = Новый Структура;
    Отбор.Вставить("ДатаНачала", НачалоДня(ТекущаяДатаСеанса() - 86400));
    Отбор.Вставить("ДатаОкончания", КонецДня(ТекущаяДатаСеанса() - 86400));
    ВыгрузитьЖурналРегистрации(Таблица, Отбор);
    Таблица.Свернуть("ИмяПользователя, Пользователь");
    Для Каждого Строка Из Таблица Цикл
        Сообщить(СтрШаблон("%1 — %2", Строка.ИмяПользователя, Строка(Строка.Пользователь)));
    КонецЦикла;
КонецПроцедуры

Сворачивание оставит по одной строке на каждого, кто работал за этот день. 86 400 — число секунд в сутках, так из текущей даты получается вчерашняя.

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

Журнал хранится столько, сколько разрешает настройка периода в Конфигураторе (Администрирование → Настройка журнала регистрации). Если там стоит «по месяцам» с регулярным сокращением, события старше этого срока искать бесполезно.

Файловая и клиент-серверная база: где физически лежат данные

Способы из разделов выше работают одинаково в обоих вариантах. Различаются место хранения и доступные инструменты.

Файловая базаКлиент-серверная база
Список пользователей ИБВнутри файла 1Cv8.1CDСлужебная таблица v8users в базе СУБД
Журнал регистрацииПапка 1Cv8Log рядом с 1Cv8.1CDКаталог кластера: srvinfo\reg_1541\<идентификатор базы>\1Cv8Log
Активные сеансыКонфигуратор, «Активные пользователи»Плюс консоль администрирования и rac
Привилегированный режим в обработкеОбычно доступенМожет быть ограничен профилем безопасности

Путь к каталогу журнала на сервере зависит от того, куда установлен кластер и какой порт у менеджера: reg_1541 соответствует порту по умолчанию.

В журнале старого формата (файл .lgf) пользователи перечислены прямо в тексте вместе с GUID и именем, поэтому в аварийной ситуации идентификатор можно найти поиском по имени в текстовом редакторе. Журнал нового формата (.lgd) — это база SQLite, её открывают только через 1С или стороннюю утилиту для SQLite.

Не редактируйте таблицу v8users и файл 1Cv8.1CD напрямую. Даже чтение v8users средствами SQL неудобно: данные там в служебном формате платформы. Любая запись в эту таблицу в обход 1С легко делает базу недоступной для входа.

Ошибки при получении GUID и как их обойти

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

Ещё одна ловушка — навигационная ссылка. Если открыть карточку пользователя и скопировать ссылку (команда «Получить ссылку» в меню карточки), в ней будет строка вида e1cib/data/Справочник.Пользователи?ref=.... Шестнадцатеричное значение после ref= относится к элементу справочника и к идентификатору пользователя ИБ отношения не имеет.

И последнее: после загрузки базы из .dt идентификаторы пользователей ИБ сохраняются. А вот если пользователей пересоздали вручную с теми же именами, GUID у них будут новые, и связь со справочником придётся восстанавливать. В типовых конфигурациях проще всего снять и снова установить в карточке пользователя разрешение на вход в программу: при записи карточка создаст учётную запись и пропишет её новый GUID в справочник.

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

Меняется ли идентификатор пользователя ИБ при смене имени или пароля?
Нет. GUID присваивается при создании учётной записи и остаётся прежним при любых изменениях имени, пароля и ролей.
Можно ли задать GUID пользователя вручную?
Свойство только для чтения: платформа генерирует его сама. Задать собственный идентификатор при создании пользователя нельзя.
Совпадают ли идентификаторы пользователей в копии базы?
Да, если копия сделана выгрузкой в .dt или копированием файла 1Cv8.1CD. В двух независимо созданных базах у одноимённых пользователей идентификаторы разные.
Как получить GUID пользователя через внешнее соединение или COM?
Тем же кодом: в объекте соединения доступен ПользователиИнформационнойБазы, и метод НайтиПоИмени вернёт пользователя со свойством УникальныйИдентификатор. Подключаться нужно под учётной записью с правом «Администрирование», если требуется список всех пользователей.
Почему в «Активных пользователях» есть записи без имени?
Это фоновые задания и служебные сеансы, запущенные не от имени конкретного пользователя, а также подключения к базе без авторизации.