Как программно открыть стандартную форму пользователя информационной базы в 1С без БСП

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Многие разработчики в такой ситуации начинают проектировать собственные формы «с нуля», описывая программное взаимодействие с объектом ПользовательИнформационнойБазы. Но существует более изящный способ: недокументированное использование стандартных форм и ресурсов самой платформы, к которым можно обратиться через специальный протокол. Разберем по шагам, как это реализовать.

Использование протокола v8res для доступа к системным формам

Платформа 1С хранит множество служебных инструментов во внутренних ресурсах. Проанализируем механизм получения обработок и обращения к ним. Для этого используется префикс v8res://, который указывает системе, что файл обработки нужно искать не на диске, а внутри библиотек исполняемого кода платформы. Служебная папка mngbase содержит формы, которые мы привыкли видеть в меню «Функции для технического специалиста».

Для управления пользователями нам понадобится файл StandardUserList.epf. Рассмотрим, как подключить его программно на стороне сервера:


&НаСервере
Процедура ПодключитьВнутреннююФормуНаСервере()
    // Подключаем встроенный ресурс как внешнюю обработку
    // Путь v8res://mngbase/StandardUserList.epf является универсальным для платформы 8.3
    ВнешниеОбработки.Подключить("v8res://mngbase/StandardUserList.epf", "StandardUserList", Ложь);
КонецПроцедуры

После выполнения этого кода в сеансе регистрируется внешняя обработка с именем StandardUserList, к формам которой мы теперь можем обращаться через стандартный метод ОткрытьФорму.

Программное открытие списка пользователей

Если нам нужно просто открыть общий список всех пользователей информационной базы (или выполнить групповой перенос пользователей между базами), достаточно вызвать форму UserList. Выясним, как это выглядит в коде кнопки на форме:


&НаКлиенте
Процедура ОткрытьСписокПользователей(Команда)
    // Сначала обеспечиваем подключение обработки на сервере
    ПодключитьВнутреннююФормуНаСервере();
    
    // Открываем форму списка
    ОткрытьФорму("ВнешняяОбработка.StandardUserList.Форма.UserList");
КонецПроцедуры

Открытие формы конкретного пользователя с параметрами

Ситуация усложняется, когда нам нужно открыть форму редактирования конкретного пользователя или реализовать копирование ролей и прав. Форма User в этой обработке требует передачи определенных параметров, без которых она не сможет инициализироваться. Проанализируем структуру параметров, необходимых для открытия.

Самый важный параметр — это UUID (уникальный идентификатор пользователя ИБ). Обратите внимание, что это не ссылка на справочник, а именно идентификатор из свойств объекта ПользовательИнформационнойБазы. Также форме требуются коллекции ролей и языков.

Рассмотрим пример функции, которая открывает форму конкретного пользователя по его имени:


&НаКлиенте
Процедура ОткрытьКарточкуПользователя(ИмяНужногоПользователя)
    
    // Подключаем обработку
    ПодключитьВнутреннююФормуНаСервере();
    
    // Получаем форму списка, чтобы извлечь из нее системные настройки (роли, языки)
    ФормаСписка = ПолучитьФорму("ВнешняяОбработка.StandardUserList.Форма.UserList");
    
    // Поиск пользователя в динамическом списке формы (параметр Name)
    // Параметры поиска зависят от структуры внутренней обработки
    СтруктураПоиска = Новый Структура("Name", ИмяНужногоПользователя);
    НайденныеСтроки = ФормаСписка.List.НайтиСтроки(СтруктураПоиска);
    
    Если НайденныеСтроки.Количество() > 0 Тогда
        СтрокаПользователя = НайденныеСтроки[0];
        
        ПараметрыФормы = Новый Структура;
        ПараметрыФормы.Вставить("UUID",           СтрокаПользователя.UUID);
        ПараметрыФормы.Вставить("DataSeparators", ФормаСписка.DataSeparators);
        ПараметрыФормы.Вставить("Languages",      ФормаСписка.Languages);
        ПараметрыФормы.Вставить("Roles",          ФормаСписка.Roles);
        
        ОткрытьФорму("ВнешняяОбработка.StandardUserList.Форма.User", ПараметрыФормы);
    Иначе
        Сообщить("Пользователь с таким именем не найден!");
    КонецЕсли;
    
КонецПроцедуры

Прямое получение UUID на сервере

Мы можем оптимизировать процесс, если нам заранее известен идентификатор пользователя. В 1С 8.3 объект ПользовательИнформационнойБазы имеет свойство УникальныйИдентификатор. Проанализируем, как получить его на сервере и передать на клиент:


&НаСервереБезКонтекста
Функция ПолучитьИдентификаторПользователя(ИмяПользователя)
    ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
    Если ПользовательИБ <> Неопределено Тогда
        Возврат ПользовательИБ.УникальныйИдентификатор;
    КонецЕсли;
    Возврат Неопределено;
КонецФункции

Используя этот метод, мы можем формировать структуру параметров ПараметрыФормы более гибко, не обращаясь к форме списка, если нам нужно только редактирование базовых свойств.

Дополнительные возможности и настройки формы

Разберем дополнительные параметры, которые принимает стандартная форма User:

  1. ReadOnly — если передать значение Истина, форма откроется в режиме просмотра. Это полезно для аудита настроек прав доступа без возможности их случайного изменения.
  2. IsNew — флаг, указывающий системе, что создается новый пользователь.
  3. DataSeparators — критически важный параметр для систем с разделением данных (облачные сервисы, модели SaaS). Если в вашей конфигурации используются разделители, их необходимо правильно инициализировать в этой структуре.

Важные замечания и риски использования

Несмотря на удобство, данный метод является недокументированным. Рассмотрим основные моменты, которые стоит учитывать при его внедрении в рабочие базы:

  1. Англоязычный код: Внутренние ресурсы mngbase исторически написаны на английском языке. Это касается имен реквизитов формы, структуры параметров и методов. Будьте внимательны к регистру: используйте UUID, а не УИД.
  2. Отсутствие событий обратной связи: Поскольку форма является внешней, вы не сможете легко перехватить событие ПослеЗаписи. Если в вашей конфигурации есть справочник Пользователи, который должен синхронизироваться с пользователями ИБ, вам придется реализовывать механизмы синхронизации (например, через подписки на события или регламентные задания), так как стандартная форма напрямую меняет данные в таблицах платформы, минуя объекты метаданных конфигурации.
  3. Зависимость от версии платформы: Состав параметров в StandardUserList.epf может незначительно меняться между версиями платформы (например, при переходе с 8.3.10 на 8.3.25). Рекомендуется периодически проверять работоспособность кода при крупных обновлениях платформы.

Для детального изучения кода этой обработки вы можете воспользоваться хитростью и сохранить её на диск с помощью метода КопироватьФайл, указав в качестве источника v8res://mngbase/StandardUserList.epf. Это позволит вам открыть её в конфигураторе как обычную внешнюю обработку и изучить все доступные формы, такие как ExternalUser (для внешних пользователей) или ExternalUserList.

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

← На главную