Кто работает в базе 1С: способы определить пользователя для админа и программиста

· 9 мин

Содержание

Быстрее всего узнать пользователя 1С так: в работающей программе откройте Справка → О программе — там указан текущий пользователь и режим запуска. В коде то же самое возвращает ИмяПользователя(), а список всех, кто сейчас в базе, показывает окно «Активные пользователи» в Конфигураторе (Администрирование → Активные пользователи).

Дальше методы для администратора и для отчёта по прошлым действиям: кто вошёл, кто изменил документ, под какой учёткой Windows идёт сеанс и что видно со стороны СУБД. Всё относится к платформе 8.3 и типовым конфигурациям на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11).

Три «пользователя» в одной базе: в чём разница

Прежде чем искать, решите, какой пользователь вам нужен. В 1С их три уровня, и путаница между ними — главная причина «не тех» результатов.

УровеньГде хранитсяЧто содержит
👤 Пользователь информационной базыслужебная таблица платформыимя для входа, пароль, роли, связь с учёткой Windows
📇 Элемент справочника «Пользователи»данные конфигурации (БСП)ФИО, подразделение, контакты, группы доступа
🧑‍💼 Сотрудник / физическое лицокадровые справочникитабельные и личные данные

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

В журнале регистрации и в списке сеансов вы видите имя пользователя ИБ. В реквизите «Ответственный» документа — ссылку на справочник. Это разные объекты, хотя обычно названия совпадают.

Встроенные функции: как определить текущего пользователя в коде

Для обработок, отчётов и расширений достаточно нескольких функций платформы и БСП.

Функции платформы

// Имя для входа (логин)
Логин = ИмяПользователя();

// Полное имя из свойств пользователя ИБ
ФИО = ПолноеИмяПользователя();

// Объект пользователя ИБ целиком
ТекПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Сообщить("Имя: " + ТекПользователь.Имя);
Сообщить("Полное имя: " + ТекПользователь.ПолноеИмя);
Сообщить("Учётка Windows: " + ТекПользователь.ПользовательОС);
Сообщить("ID: " + Строка(ТекПользователь.УникальныйИдентификатор));

ПользовательОС заполнен, только если пользователю включена аутентификация операционной системы. Иначе там пустая строка.

Функции БСП

В типовых конфигурациях удобнее работать со ссылкой на справочник:

// Ссылка на элемент справочника «Пользователи»
ТекущийПользователь = Пользователи.ТекущийПользователь();

// Пользователь или внешний пользователь — в зависимости от того, кто вошёл
Авторизованный = Пользователи.АвторизованныйПользователь();

// Проверка полных прав
ЕстьПолныеПрава = Пользователи.ЭтоПолноправныйПользователь();

Общий модуль Пользователи вызывается и на сервере, и на клиенте. В запросах и ограничениях доступа на уровне записей БСП использует параметр сеанса ТекущийПользователь.

Сеанс и имя компьютера

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

Сеанс = ПолучитьТекущийСеансИнформационнойБазы();
Сообщить("Пользователь: " + Сеанс.Пользователь.Имя);
Сообщить("Компьютер: " + Сеанс.ИмяКомпьютера);
Сообщить("Приложение: " + Сеанс.ИмяПриложения);
Сообщить("Сеанс № " + Формат(Сеанс.НомерСеанса, "ЧГ=0") + " с " + Строка(Сеанс.НачалоСеанса));

Учётную запись Windows на клиентской машине платформа отдельной функцией не возвращает. Если она нужна, а аутентификации ОС нет, на клиенте под Windows выручает COM-объект:

&НаКлиенте
Процедура ПоказатьУчеткуWindows(Команда)
	Сеть = Новый COMОбъект("WScript.Network");
	Сообщить(Сеть.UserDomain + "\" + Сеть.UserName);
КонецПроцедуры

В веб-клиенте и на Linux этот приём не работает .

Если в базе нет ни одного пользователя ИБ, ИмяПользователя() возвращает пустую строку. БСП в этом случае подставляет служебного пользователя «<Не указан>». Учитывайте это в проверках: пустой логин — не ошибка, а база без списка пользователей.

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

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

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

  • В Конфигураторе: Администрирование → Активные пользователи.
  • В режиме 1С:Предприятие: Все функции → Стандартные → Активные пользователи. Если пункта «Все функции» в меню нет, включите его в Сервис и настройки → Параметры, флаг «Отображать команду “Все функции”».
  • В Бухгалтерии 3.0 и других конфигурациях на БСП список доступен и из раздела Администрирование → Обслуживание.

В окне видны имя пользователя, приложение (тонкий клиент, Конфигуратор, фоновое задание, COM-соединение), компьютер и время начала сеанса.

В консоли кластера (клиент-сервер)

Откройте «Администрирование серверов 1С Предприятия», раскройте кластер → Информационные базы → нужная база → Сеансы. Колонки «Пользователь», «Компьютер», «Приложение», «Начало сеанса», «Последняя активность» отвечают на вопрос полностью.

Из командной строки то же даёт утилита rac (нужен запущенный сервис ras):

rac cluster list
rac session list --cluster=<ID кластера> --infobase=<ID базы>

Идентификатор базы берите из вывода rac infobase summary list --cluster=<ID кластера>. Остальные параметры смотрите в rac help session.

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

Журнал регистрации: кто входил и кто менял данные

Активные сеансы показывают настоящее. Для прошлого — кто открыл базу вчера, кто провёл или удалил документ — нужен журнал регистрации.

Где открыть

  • Конфигуратор: Администрирование → Журнал регистрации.
  • Бухгалтерия 3.0 и ЗУП 3.1: Администрирование → Обслуживание → блок отчётов и журналов.
  • Любая конфигурация: Все функции → Стандартные → Журнал регистрации.

Как отфильтровать

  1. Нажмите «Установить отбор».
  2. Задайте интервал дат — без него журнал большой базы открывается долго.
  3. В поле «Пользователи» отметьте нужных людей.
  4. В «Событиях» выберите то, что ищете:
    • 🔑 Сеанс. Начало и Сеанс. Завершение — входы и выходы;
    • ✏️ Данные. Изменение, Данные. Проведение, Данные. Удаление — работа с документами и справочниками;
    • ⛔ Сеанс. Аутентификация (ошибка) — неудачные попытки входа.
  5. Для поиска по конкретному документу заполните отбор по метаданным и по данным.

В каждой строке есть пользователь, компьютер, приложение и номер сеанса. Если один логин используют несколько человек, отличить их можно только по компьютеру — это сильный довод выдать каждому свою учётку.

Журнал пишет только то, что включено уровнем регистрации. Уровень задаётся в Конфигураторе: Администрирование → Настройка журнала регистрации. Рабочий вариант — «Регистрировать все события». При уровне «Ошибки» изменений данных в журнале не будет.

Выгрузка в коде для отчёта

Для своего отчёта «кто что делал» журнал выгружают в таблицу значений:

Отбор = Новый Структура;
Отбор.Вставить("ДатаНачала", НачалоДня(ТекущаяДата()));
Отбор.Вставить("ДатаОкончания", КонецДня(ТекущаяДата()));
Отбор.Вставить("Событие", "_$Session$_.Start");

События = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(События, Отбор);

Для Каждого Запись Из События Цикл
	Сообщить(Строка(Запись.Дата) + " — " + Запись.ИмяПользователя + " (" + Запись.Компьютер + ")");
КонецЦикла;

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

Запросы к справочнику «Пользователи» для отчёта

Когда нужен список пользователей с их данными, а не только текущий, работайте через запрос к справочнику и сверяйте его с пользователями ИБ.

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

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Выборка.ИдентификаторИБ);
	Логин = ?(ПользовательИБ = Неопределено, "<нет входа>", ПользовательИБ.Имя);
	Сообщить(Выборка.ФИО + " — " + Логин);
КонецЦикла;

Строка с «<нет входа>» — это элемент справочника без пользователя ИБ. Такой человек в программу зайти не может: его карточка есть, а учётки для входа нет.

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

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

Узнать пользователя мало — часто важнее, что ему разрешено.

Что нужноГде смотреть
Роли пользователя ИБКонфигуратор: Администрирование → Пользователи → карточка → вкладка «Прочие»
Группы доступа в типовойАдминистрирование → Настройки пользователей и прав → Пользователи → карточка → «Права доступа»
Доступна ли роль в кодеРольДоступна("ПолныеПрава")
Полный администратор в БСППользователи.ЭтоПолноправныйПользователь()
Роли объекта в кодеПользовательИБ.Роли.Содержит(Метаданные.Роли.ПолныеПрава)

В конфигурациях на БСП роли вручную в Конфигураторе не раздают. Права задаются группами доступа, а БСП сама переносит роли пользователям ИБ. Роль, добавленная в Конфигураторе, при следующей записи пользователя в программе может пропасть.

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

Что именно вы хотите узнать о пользователе?

Пользователь на уровне СУБД: что видно в SQL

Администраторы MS SQL и PostgreSQL часто ищут 1С-пользователя прямо в базе данных. Тут два разных вопроса.

Список пользователей в таблице v8users

Пользователи ИБ хранятся в служебной таблице v8users в базе данных информационной базы. Основные поля:

  • ID — идентификатор, тот же, что в ИдентификаторПользователяИБ;
  • Name — имя для входа;
  • Descr — полное имя;
  • OSName — учётная запись Windows;
  • AdmRole — признак административной роли.
SELECT Name, Descr, OSName
FROM v8users
ORDER BY Name;

Только чтение. Пароли, роли и прочие настройки лежат в двоичном поле в формате платформы. Правка этой таблицы напрямую в обход 1С ломает аутентификацию и не поддерживается.

Таблицы справочника «Пользователи» в SQL называются по шаблону _ReferenceNNN. Чтобы найти номер, вызовите в 1С ПолучитьСтруктуруХраненияБазыДанных() и найдите в результате Справочник.Пользователи.

Кто из 1С грузит сервер СУБД

В sp_who2, sys.dm_exec_sessions или pg_stat_activity вы увидите не логин 1С, а учётку, под которой рабочие процессы rphost подключаются к СУБД. Одна и та же для всех пользователей.

Связать запрос в СУБД с человеком помогают два инструмента:

  1. Консоль кластера. В свойствах сеанса есть время, проведённое в СУБД, и захваченное сеансом соединение. Сеанс с растущими цифрами — кандидат.
  2. Технологический журнал. В logcfg.xml включите сбор события DBMSSQL (для PostgreSQL — DBPOSTGRS). Каждая запись содержит свойство Usr с именем пользователя 1С и текст запроса.

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

Когда пользователь «не находится»: частые проблемы

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

Журнал хранится на сервере 1С в каталоге базы, в подпапке 1Cv8Log. Для файловой базы — в той же папке, где лежит 1Cv8.1CD. Если журнал подчищают ради места, сначала заархивируйте его: после удаления «кто удалил документ» уже не узнать.

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

Можно ли узнать пароль пользователя 1С?
Нет. Платформа хранит не пароль, а его хеш. Администратор может только задать новый пароль в карточке пользователя.
Как узнать, кто последний входил в базу?
Отфильтруйте журнал регистрации по событию «Сеанс. Начало» и отсортируйте по дате: верхняя запись — последний вход.
Видно ли пользователя в файловой базе без сервера?
Да. «Активные пользователи» и журнал регистрации работают и в файловом варианте. Консоли кластера и rac там нет.
Можно ли запретить вход под чужим логином?
Используйте аутентификацию ОС или вход по паролю с отдельной учёткой на каждого. Общий логин без пароля не позволяет установить, кто именно работал.
Почему COM-соединение отображается как отдельный пользователь?
Внешние программы подключаются под учёткой из строки соединения. В сеансах они видны с приложением «COM-соединение» и занимают свой сеанс.