В процессе администрирования и проведения инвентаризации прав доступа в базах на платформе 1С:Предприятие 7.7 часто возникает необходимость выгрузить полный список пользователей. Стандартные средства конфигуратора не позволяют сделать это одной кнопкой, а использование внешних компонент (ВК) не всегда возможно по соображениям безопасности или техническим ограничениям. Разберем подробно, как решить эту задачу программным путем, обратившись напрямую к системным файлам базы данных.
Для начала проанализируем структуру хранения информации. Все сведения о пользователях, включая их полные имена, назначенные интерфейсы и наборы прав (роли), хранятся в бинарном файле users.usr. Этот файл располагается в подкаталоге USRDEF, который находится в основном каталоге базы данных.
Важные особенности файла users.usr:
Рассмотрим основной подход к извлечению данных. Поскольку встроенный язык 1С 7.7 ограничен в работе с бинарными файлами, мы воспользуемся объектами COM, которые доступны в операционной системе Windows. Наиболее подходящим инструментом является объект ADODB.Stream, позволяющий считывать файл побайтово или в виде текстового потока с определенной кодировкой.
Процесс разбора файла можно разделить на следующие этапы:
users.usr.Разберем пример кода, который позволяет прочитать содержимое файла. Этот метод позволяет обойтись без внешних компонент типа 1cpp.dll или аналогичных.
// Определяем путь к файлу пользователей
ПутьКФайлу = КаталогИБ() + "USRDEF\users.usr";
// Создаем объект для чтения потока
Поток = СоздатьОбъект("ADODB.Stream");
Поток.Type = 1; // Binary
Поток.Open();
Поток.LoadFromFile(ПутьКФайлу);
// Читаем все данные в переменную
Данные = Поток.Read();
Поток.Close();
После того как данные загружены, их необходимо обработать. Поскольку встроенный язык 7.7 не умеет эффективно работать с типом Binary напрямую как с массивом байтов, мы можем преобразовать их в строку или использовать дополнительные методы COM-объектов для поиска паттернов.
Выясним причину сложности разбора: 1С 7.7 использует проприетарный формат. Однако экспериментально установлено, что данные пользователя (Полное имя, Интерфейс, Роль) идут друг за другом и разделены служебными символами. Длина каждой строки обычно указывается в байте, предшествующем самой строке.
Рассмотрим логику поиска данных в потоке:
users.usr всегда начинаются после определенной сигнатуры. Проанализируем HEX-структуру: часто перед именем стоит идентификатор типа объекта.Если работа с ADODB.Stream по каким-то причинам недоступна, можно использовать стандартный объект 1С ФС. Однако он предназначен для текстовых файлов, поэтому чтение бинарного файла users.usr через него может привести к потере данных при встрече символа "конец строки". Тем не менее, для извлечения именно текстовых подстрок (имен) этот метод иногда применяют с предварительным копированием файла в текстовый формат (что не совсем корректно, но работает для простых списков).
Проанализируем более надежный путь — использование V77.Application через OLE. Хотя через Метаданные мы можем получить только список всех возможных интерфейсов и ролей в конфигурации, мы не увидим привязку к конкретным пользователям. Поэтому чтение users.usr остается единственным верным способом.
Иногда в файле users.usr вместо полных названий интерфейсов и ролей могут храниться их порядковые номера в конфигурации. В этом случае нам поможет объект Метаданные. Рассмотрим пример того, как получить список всех ролей конфигурации:
// Перебор всех прав (ролей) в конфигурации
Для Ном = 1 По Метаданные.Права() Цикл
ИмяРоли = Метаданные.Права(Ном).Идентификатор;
Сообщить("Найдена роль: " + ИмяРоли);
КонецЦикла;
// Перебор всех интерфейсов
Для Ном = 1 По Метаданные.Интерфейс() Цикл
ИмяИнтерфейса = Метаданные.Интерфейс(Ном).Идентификатор;
Сообщить("Найден интерфейс: " + ИмяИнтерфейса);
КонецЦикла;
Сопоставив индекс из бинарного файла с индексом в коллекции Метаданные, мы получим искомые строковые названия.
Выполняя инвентаризацию пользователей в нескольких базах, рекомендуем придерживаться следующего плана:
users.usr во временную папку. Это исключит риск блокировки файла или повреждения данных при активной работе пользователей в базе.Excel.Application для формирования итоговой таблицы. Это позволит удобно сгруппировать пользователей по интерфейсам и ролям.Таким образом, даже при отсутствии встроенных функций выгрузки, мы можем получить всю необходимую информацию, используя базовые возможности операционной системы и знание структуры хранения данных 1С 7.7. Это решение является "чистым", так как не требует регистрации в системе сторонних DLL-файлов и работает на любой стандартной установке платформы.