Кто работает в базе 1С: способы определить пользователя для админа и программиста
Содержание
Быстрее всего узнать пользователя 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:
Администрирование → Обслуживание→ блок отчётов и журналов. - Любая конфигурация:
Все функции → Стандартные → Журнал регистрации.
Как отфильтровать
- Нажмите «Установить отбор».
- Задайте интервал дат — без него журнал большой базы открывается долго.
- В поле «Пользователи» отметьте нужных людей.
- В «Событиях» выберите то, что ищете:
- 🔑
Сеанс. НачалоиСеанс. Завершение— входы и выходы; - ✏️
Данные. Изменение,Данные. Проведение,Данные. Удаление— работа с документами и справочниками; - ⛔
Сеанс. Аутентификация (ошибка)— неудачные попытки входа.
- 🔑
- Для поиска по конкретному документу заполните отбор по метаданным и по данным.
В каждой строке есть пользователь, компьютер, приложение и номер сеанса. Если один логин используют несколько человек, отличить их можно только по компьютеру — это сильный довод выдать каждому свою учётку.
Журнал пишет только то, что включено уровнем регистрации. Уровень задаётся в Конфигураторе: Администрирование → Настройка журнала регистрации. Рабочий вариант — «Регистрировать все события». При уровне «Ошибки» изменений данных в журнале не будет.
Выгрузка в коде для отчёта
Для своего отчёта «кто что делал» журнал выгружают в таблицу значений:
Отбор = Новый Структура;
Отбор.Вставить("ДатаНачала", НачалоДня(ТекущаяДата()));
Отбор.Вставить("ДатаОкончания", КонецДня(ТекущаяДата()));
Отбор.Вставить("Событие", "_$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 подключаются к СУБД. Одна и та же для всех пользователей.
Связать запрос в СУБД с человеком помогают два инструмента:
- Консоль кластера. В свойствах сеанса есть время, проведённое в СУБД, и захваченное сеансом соединение. Сеанс с растущими цифрами — кандидат.
- Технологический журнал. В
logcfg.xmlвключите сбор событияDBMSSQL(для PostgreSQL —DBPOSTGRS). Каждая запись содержит свойствоUsrс именем пользователя 1С и текст запроса.
Технологический журнал без отбора быстро занимает гигабайты. Ставьте фильтр по длительности, задавайте срок хранения history и включайте его на ограниченное время.
Когда пользователь «не находится»: частые проблемы
Журнал хранится на сервере 1С в каталоге базы, в подпапке 1Cv8Log. Для файловой базы — в той же папке, где лежит 1Cv8.1CD. Если журнал подчищают ради места, сначала заархивируйте его: после удаления «кто удалил документ» уже не узнать.
Частые вопросы
Можно ли узнать пароль пользователя 1С?
Как узнать, кто последний входил в базу?
Видно ли пользователя в файловой базе без сервера?
rac там нет.