В платформе 1С:Предприятие 7.7 (так называемых «клюшках») разработчики часто сталкиваются с существенным ограничением: стандартные функции НазваниеНабораПрав() и НазваниеИнтерфейса() возвращают данные только для текущего авторизованного пользователя. Если перед программистом стоит задача провести аудит безопасности или просто выгрузить полный список всех сотрудников с их ролями и правами в файл (например, в Excel), штатных средств встроенного языка оказывается недостаточно. В этой статье мы подробно разберем, как обойти это ограничение, используя внешние компоненты, возможности платформы 1С 8.x и анализ системных файлов.
Для начала разберем техническую сторону вопроса. В отличие от современных версий 1С, где список пользователей может храниться в самой базе данных, в версии 7.7 вся информация о пользователях, их паролях (в виде хэшей), назначенных интерфейсах и наборах прав хранится во внешнем файле users.usr. Этот файл располагается в подкаталоге USRDEF в папке информационной базы.
Важный нюанс: файл users.usr не является текстовым. Он представляет собой Microsoft Compound Document (структурированное хранилище OLE2). Это своего рода «файловая система внутри файла», и прочитать его обычным текстовым редактором не получится. Именно поэтому для получения данных нам понадобятся специализированные инструменты.
Одним из самых элегантных и быстрых способов программного доступа к списку пользователей является использование популярной внешней компоненты FormEx. В ней реализован метод, который позволяет считать данные напрямую из файла пользователей и представить их в удобном виде таблицы значений.
Проанализируем алгоритм работы с этим методом. Нам понадобится функция ПолучитьСписокПользователейТЗ(). Рассмотрим пример кода, который можно использовать в обработке:
// Загружаем компоненту (предполагается, что dll лежит в каталоге базы или в Bin)
ЗагрузитьВнешнююКомпоненту("FormEx.dll");
Сервис = СоздатьОбъект("Сервис");
// Путь к базе данных (каталог, где лежит папка USRDEF)
ПутьКБазе = КаталогИБ();
// Получаем таблицу значений с данными пользователей
ТЗПользователей = Сервис.ПолучитьСписокПользователейТЗ(ПутьКБазе);
// Теперь мы можем программно обработать этот список
ТЗПользователей.ВыбратьСтроки();
Пока ТЗПользователей.ПолучитьСтроку() = 1 Цикл
Сообщить("Логин: " + ТЗПользователей.ИмяПользователя);
Сообщить("Полное имя: " + ТЗПользователей.ПолноеИмяПользователя);
Сообщить("Роль (права): " + ТЗПользователей.ПраваПользователя);
Сообщить("Интерфейс: " + ТЗПользователей.ИнтерфейсПользователя);
Сообщить("-----------------------------------");
КонецЦикла;
В результате выполнения этого кода мы получим таблицу со следующими колонками: ИмяПользователя, ХэшПароляПользователя, ПолноеИмяПользователя, ДиректорияПользователя, ИнтерфейсПользователя и ПраваПользователя. Это исчерпывающий набор данных для решения нашей задачи.
Если вы не хотите подключать сторонние библиотеки к старой базе, можно воспользоваться «хитрым» методом, задействовав штатные механизмы миграции данных, которые встроены в платформу 1С 8.3 (или более ранние версии 8.x). В дистрибутивах восьмерки всегда присутствует обработка для перехода с семерки.
Разберем этот процесс по шагам:
Convert77.epf).users.usr и создадут соответствующих пользователей в новой базе 8.x.Этот метод хорош тем, что он не требует написания кода на стороне 1С 7.7 и гарантированно работает со всеми версиями users.usr.
Как мы уже выяснили, файл пользователей — это структурированное хранилище. Существуют библиотеки, специально предназначенные для работы с такими объектами в среде 1С 7.7. Рассмотрим подробнее:
Библиотека Compound.dll: Позволяет открывать файлы OLE-хранилищ и читать из них потоки данных (streams). Выясним причину выбора этого метода: он дает самый низкоуровневый доступ к данным без запуска Конфигуратора.
Библиотека UserDefs.dll: Это узкоспециализированный инструмент, созданный сообществом разработчиков «клюшек» именно для редактирования и чтения списка пользователей. В отличие от штатных методов, она позволяет даже изменять пароли или добавлять пользователей программно, что может быть полезно при синхронизации с другими системами (например, с Active Directory).
Пример использования подобных библиотек обычно сводится к созданию объекта и вызову метода чтения:
ОбъектПользователи = СоздатьОбъект("UserDefsReader");
ОбъектПользователи.ОткрытьФайл(КаталогИБ() + "USRDEF\users.usr");
// Далее следует цикл по количеству пользователей в коллекции
Для тех, кому нужно быстро получить результат без программирования, существуют готовые консольные утилиты, такие как Users1CDefReaderConsole.exe. Эти программы запускаются из командной строки и принимают в качестве параметра путь к файлу users.usr, выдавая на выходе текстовый файл или XML с полным перечнем настроек всех пользователей.
Также на специализированных ресурсах (например, Инфостарт) можно найти готовые обработки (отчеты), которые уже включают в себя одну из вышеупомянутых библиотек. Проанализируем типичный функционал такой обработки:
Важно помнить, что даже если ваша 1С 7.7 работает на SQL Server, информация о пользователях всё равно не хранится в SQL-таблицах. Она по-прежнему находится в файле users.usr. Попытки найти список логинов через SQL Management Studio не увенчаются успехом. Единственное, что можно найти в SQL-базе — это ссылки на ID пользователей в некоторых системных таблицах, но их имена и права там отсутствуют.
При работе с файлом users.usr всегда соблюдайте следующие правила:
Разберем, как реализовать автоматическую фиксацию прав при входе. В глобальном модуле, в процедуре ПриНачалеРаботыСистемы(), можно добавить следующий код:
Процедура ПриНачалеРаботыСистемы()
// Находим текущего пользователя в справочнике
ТекПользователь = ИмяПользователя();
НаборПрав = НазваниеНабораПрав();
Интерфейс = НазваниеИнтерфейса();
// Записываем эти данные в справочник Пользователи (если он у вас есть)
// чтобы потом легко построить отчет штатным способом
Спр = СоздатьОбъект("Справочник.Пользователи");
Если Спр.НайтиПоНаименованию(ТекПользователь, 0, 1) = 1 Тогда
Спр.ПоследнийНаборПрав = НаборПрав;
Спр.ПоследнийИнтерфейс = Интерфейс;
Спр.Записать();
КонецЕсли;
КонецПроцедуры
Этот «пассивный» метод со временем наполнит вашу базу актуальными данными о правах всех активных пользователей без использования внешних библиотек, хотя он и не покажет тех, кто давно не заходил в программу.
Мы рассмотрели несколько способов извлечения данных о пользователях в 1С 7.7. Выбор конкретного метода зависит от ваших задач: для разового аудита проще всего воспользоваться конвертацией в 1С 8 или готовой утилитой, а для регулярной автоматизированной выгрузки лучше всего подойдет внешняя компонента FormEx с её методом ПолучитьСписокПользователейТЗ. Мы проанализировали внутреннюю структуру хранения данных и выяснили, что ключ к решению задачи лежит в правильной обработке файла users.usr.