Как выгрузить список пользователей, их прав и интерфейсов в 1С:Предприятие 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В платформе 1С:Предприятие 7.7 (так называемых «клюшках») разработчики часто сталкиваются с существенным ограничением: стандартные функции НазваниеНабораПрав() и НазваниеИнтерфейса() возвращают данные только для текущего авторизованного пользователя. Если перед программистом стоит задача провести аудит безопасности или просто выгрузить полный список всех сотрудников с их ролями и правами в файл (например, в Excel), штатных средств встроенного языка оказывается недостаточно. В этой статье мы подробно разберем, как обойти это ограничение, используя внешние компоненты, возможности платформы 1С 8.x и анализ системных файлов.

Причина сложности: Где хранятся пользователи в 1С 7.7?

Для начала разберем техническую сторону вопроса. В отличие от современных версий 1С, где список пользователей может храниться в самой базе данных, в версии 7.7 вся информация о пользователях, их паролях (в виде хэшей), назначенных интерфейсах и наборах прав хранится во внешнем файле users.usr. Этот файл располагается в подкаталоге USRDEF в папке информационной базы.

Важный нюанс: файл users.usr не является текстовым. Он представляет собой Microsoft Compound Document (структурированное хранилище OLE2). Это своего рода «файловая система внутри файла», и прочитать его обычным текстовым редактором не получится. Именно поэтому для получения данных нам понадобятся специализированные инструменты.

Способ 1: Использование внешней компоненты FormEx

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

Проанализируем алгоритм работы с этим методом. Нам понадобится функция ПолучитьСписокПользователейТЗ(). Рассмотрим пример кода, который можно использовать в обработке:


// Загружаем компоненту (предполагается, что dll лежит в каталоге базы или в Bin)
ЗагрузитьВнешнююКомпоненту("FormEx.dll");
Сервис = СоздатьОбъект("Сервис");

// Путь к базе данных (каталог, где лежит папка USRDEF)
ПутьКБазе = КаталогИБ();

// Получаем таблицу значений с данными пользователей
ТЗПользователей = Сервис.ПолучитьСписокПользователейТЗ(ПутьКБазе);

// Теперь мы можем программно обработать этот список
ТЗПользователей.ВыбратьСтроки();
Пока ТЗПользователей.ПолучитьСтроку() = 1 Цикл
    Сообщить("Логин: " + ТЗПользователей.ИмяПользователя);
    Сообщить("Полное имя: " + ТЗПользователей.ПолноеИмяПользователя);
    Сообщить("Роль (права): " + ТЗПользователей.ПраваПользователя);
    Сообщить("Интерфейс: " + ТЗПользователей.ИнтерфейсПользователя);
    Сообщить("-----------------------------------");
КонецЦикла;

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

Способ 2: Конвертация через платформу 1С 8.x

Если вы не хотите подключать сторонние библиотеки к старой базе, можно воспользоваться «хитрым» методом, задействовав штатные механизмы миграции данных, которые встроены в платформу 1С 8.3 (или более ранние версии 8.x). В дистрибутивах восьмерки всегда присутствует обработка для перехода с семерки.

Разберем этот процесс по шагам:

  1. Создадим пустую информационную базу на платформе 1С 8.3.
  2. Воспользуемся мастером импорта данных из 1С 7.7 (или запустим обработку Convert77.epf).
  3. При настройке конвертации нам не нужно переносить справочники или документы. Достаточно указать путь к базе 7.7. Алгоритмы конвертации автоматически прочитают файл users.usr и создадут соответствующих пользователей в новой базе 8.x.
  4. После завершения процесса мы получим список пользователей уже в современной среде, где их можно легко выделить мышкой, скопировать в буфер обмена или выгрузить стандартным отчетом «Список пользователей».

Этот метод хорош тем, что он не требует написания кода на стороне 1С 7.7 и гарантированно работает со всеми версиями users.usr.

Способ 3: Использование специализированных библиотек (Compound.dll и UserDefs.dll)

Как мы уже выяснили, файл пользователей — это структурированное хранилище. Существуют библиотеки, специально предназначенные для работы с такими объектами в среде 1С 7.7. Рассмотрим подробнее:

Библиотека Compound.dll: Позволяет открывать файлы OLE-хранилищ и читать из них потоки данных (streams). Выясним причину выбора этого метода: он дает самый низкоуровневый доступ к данным без запуска Конфигуратора.

Библиотека UserDefs.dll: Это узкоспециализированный инструмент, созданный сообществом разработчиков «клюшек» именно для редактирования и чтения списка пользователей. В отличие от штатных методов, она позволяет даже изменять пароли или добавлять пользователей программно, что может быть полезно при синхронизации с другими системами (например, с Active Directory).

Пример использования подобных библиотек обычно сводится к созданию объекта и вызову метода чтения:


ОбъектПользователи = СоздатьОбъект("UserDefsReader");
ОбъектПользователи.ОткрытьФайл(КаталогИБ() + "USRDEF\users.usr");
// Далее следует цикл по количеству пользователей в коллекции

Способ 4: Консольные утилиты и внешние отчеты

Для тех, кому нужно быстро получить результат без программирования, существуют готовые консольные утилиты, такие как Users1CDefReaderConsole.exe. Эти программы запускаются из командной строки и принимают в качестве параметра путь к файлу users.usr, выдавая на выходе текстовый файл или XML с полным перечнем настроек всех пользователей.

Также на специализированных ресурсах (например, Инфостарт) можно найти готовые обработки (отчеты), которые уже включают в себя одну из вышеупомянутых библиотек. Проанализируем типичный функционал такой обработки:

Технические нюансы SQL-версий

Важно помнить, что даже если ваша 1С 7.7 работает на SQL Server, информация о пользователях всё равно не хранится в SQL-таблицах. Она по-прежнему находится в файле users.usr. Попытки найти список логинов через SQL Management Studio не увенчаются успехом. Единственное, что можно найти в SQL-базе — это ссылки на ID пользователей в некоторых системных таблицах, но их имена и права там отсутствуют.

Практические советы по безопасности

При работе с файлом users.usr всегда соблюдайте следующие правила:

  1. Всегда делайте резервную копию файла перед использованием любых внешних компонент, которые имеют право на запись.
  2. Помните, что доступ к этому файлу — это прямой доступ к безопасности системы. Ограничьте права на папку USRDEF на уровне операционной системы (NTFS) только для администраторов и учетной записи, под которой работают пользователи.
  3. Если вам нужно часто получать список прав, рассмотрите вариант записи этих данных в обычный справочник «Сотрудники» при каждом входе пользователя в систему.

Разберем, как реализовать автоматическую фиксацию прав при входе. В глобальном модуле, в процедуре ПриНачалеРаботыСистемы(), можно добавить следующий код:


Процедура ПриНачалеРаботыСистемы()
    // Находим текущего пользователя в справочнике
    ТекПользователь = ИмяПользователя();
    НаборПрав = НазваниеНабораПрав();
    Интерфейс = НазваниеИнтерфейса();
    
    // Записываем эти данные в справочник Пользователи (если он у вас есть)
    // чтобы потом легко построить отчет штатным способом
    Спр = СоздатьОбъект("Справочник.Пользователи");
    Если Спр.НайтиПоНаименованию(ТекПользователь, 0, 1) = 1 Тогда
        Спр.ПоследнийНаборПрав = НаборПрав;
        Спр.ПоследнийИнтерфейс = Интерфейс;
        Спр.Записать();
    КонецЕсли;
КонецПроцедуры

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

Заключение

Мы рассмотрели несколько способов извлечения данных о пользователях в 1С 7.7. Выбор конкретного метода зависит от ваших задач: для разового аудита проще всего воспользоваться конвертацией в 1С 8 или готовой утилитой, а для регулярной автоматизированной выгрузки лучше всего подойдет внешняя компонента FormEx с её методом ПолучитьСписокПользователейТЗ. Мы проанализировали внутреннюю структуру хранения данных и выяснили, что ключ к решению задачи лежит в правильной обработке файла users.usr.

← На главную