Как программно получить список пользователей, их интерфейсы и роли в 1С 7.7 без внешних компонент

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

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

Где хранятся данные о пользователях в 1С 7.7

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

Важные особенности файла users.usr:

  1. Бинарный формат: Файл нельзя прочитать обычным текстовым редактором, так как он содержит служебные байты и строки в специфической кодировке.
  2. Структура блоков: Информация о каждом пользователе записана в виде последовательных блоков данных.
  3. Кодировка: Текстовые данные (имена, названия ролей) обычно представлены в кодировке Windows-1251.

Алгоритм программного решения задачи

Рассмотрим основной подход к извлечению данных. Поскольку встроенный язык 1С 7.7 ограничен в работе с бинарными файлами, мы воспользуемся объектами COM, которые доступны в операционной системе Windows. Наиболее подходящим инструментом является объект ADODB.Stream, позволяющий считывать файл побайтово или в виде текстового потока с определенной кодировкой.

Процесс разбора файла можно разделить на следующие этапы:

  1. Определение пути к файлу users.usr.
  2. Загрузка содержимого файла в память.
  3. Поиск маркеров начала блока пользователя.
  4. Извлечение строк: Имя, Интерфейс, Роль.
  5. Запись полученных данных в таблицу или файл Excel.

Реализация через ADODB.Stream

Разберем пример кода, который позволяет прочитать содержимое файла. Этот метод позволяет обойтись без внешних компонент типа 1cpp.dll или аналогичных.


// Определяем путь к файлу пользователей
ПутьКФайлу = КаталогИБ() + "USRDEF\users.usr";

// Создаем объект для чтения потока
Поток = СоздатьОбъект("ADODB.Stream");
Поток.Type = 1; // Binary
Поток.Open();
Поток.LoadFromFile(ПутьКФайлу);

// Читаем все данные в переменную
Данные = Поток.Read();
Поток.Close();

После того как данные загружены, их необходимо обработать. Поскольку встроенный язык 7.7 не умеет эффективно работать с типом Binary напрямую как с массивом байтов, мы можем преобразовать их в строку или использовать дополнительные методы COM-объектов для поиска паттернов.

Разбор бинарной структуры (ручной парсинг)

Выясним причину сложности разбора: 1С 7.7 использует проприетарный формат. Однако экспериментально установлено, что данные пользователя (Полное имя, Интерфейс, Роль) идут друг за другом и разделены служебными символами. Длина каждой строки обычно указывается в байте, предшествующем самой строке.

Рассмотрим логику поиска данных в потоке:

  1. Поиск имен: Имена пользователей в users.usr всегда начинаются после определенной сигнатуры. Проанализируем HEX-структуру: часто перед именем стоит идентификатор типа объекта.
  2. Извлечение интерфейса и роли: В 1С 7.7 пользователю может быть назначен только один интерфейс и одна роль. Они следуют сразу за блоком основного имени. Если интерфейс или роль не выбраны (используются значения по умолчанию), на их месте будут пустые строки или нулевые байты.

Альтернативный способ: Использование объекта ФС (Файловая Система)

Если работа с ADODB.Stream по каким-то причинам недоступна, можно использовать стандартный объект 1С ФС. Однако он предназначен для текстовых файлов, поэтому чтение бинарного файла users.usr через него может привести к потере данных при встрече символа "конец строки". Тем не менее, для извлечения именно текстовых подстрок (имен) этот метод иногда применяют с предварительным копированием файла в текстовый формат (что не совсем корректно, но работает для простых списков).

Проанализируем более надежный путь — использование V77.Application через OLE. Хотя через Метаданные мы можем получить только список всех возможных интерфейсов и ролей в конфигурации, мы не увидим привязку к конкретным пользователям. Поэтому чтение users.usr остается единственным верным способом.

Как сопоставить идентификаторы с именами

Иногда в файле users.usr вместо полных названий интерфейсов и ролей могут храниться их порядковые номера в конфигурации. В этом случае нам поможет объект Метаданные. Рассмотрим пример того, как получить список всех ролей конфигурации:


// Перебор всех прав (ролей) в конфигурации
Для Ном = 1 По Метаданные.Права() Цикл
    ИмяРоли = Метаданные.Права(Ном).Идентификатор;
    Сообщить("Найдена роль: " + ИмяРоли);
КонецЦикла;

// Перебор всех интерфейсов
Для Ном = 1 По Метаданные.Интерфейс() Цикл
    ИмяИнтерфейса = Метаданные.Интерфейс(Ном).Идентификатор;
    Сообщить("Найден интерфейс: " + ИмяИнтерфейса);
КонецЦикла;

Сопоставив индекс из бинарного файла с индексом в коллекции Метаданные, мы получим искомые строковые названия.

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

Выполняя инвентаризацию пользователей в нескольких базах, рекомендуем придерживаться следующего плана:

  1. Создание копии файла: Перед программным чтением всегда копируйте users.usr во временную папку. Это исключит риск блокировки файла или повреждения данных при активной работе пользователей в базе.
  2. Вывод в Excel: Используйте объект Excel.Application для формирования итоговой таблицы. Это позволит удобно сгруппировать пользователей по интерфейсам и ролям.
  3. Проверка прав: Помните, что в 1С 7.7 права суммируются только на уровне доступа к объектам, но роль (набор прав) у пользователя формально одна. Интерфейс также жестко привязан к учетной записи.

Таким образом, даже при отсутствии встроенных функций выгрузки, мы можем получить всю необходимую информацию, используя базовые возможности операционной системы и знание структуры хранения данных 1С 7.7. Это решение является "чистым", так как не требует регистрации в системе сторонних DLL-файлов и работает на любой стандартной установке платформы.

← На главную