В процессе работы в службе поддержки DIRECTUM достаточно часто сталкиваюсь с вопросами программной работы с компонентой «Пользователи», а именно: создание и генерация пользователей, создание группы пользователей, добавление в нее пользователей и выдача ее членам прав на компоненты, отключение пользователя и удаление его из БД. Предлагаю Вашему вниманию несколько примеров работы с данной компонентой.
1. Пример сценария создания и генерации пользователя:
// Имя и полное имя создаваемого пользователя:
UserName = 'USERNAME'
FullName = 'USERNAME U.'
// Получить ссылку на компоненту "Пользователи"
USERS_COMPONENT = CreateReference(SYSREF_USERS)
// Во время работы с компонентой в визуальном режиме при генерации пользователя
// запрашиваются логин и пароль для доступа к SQL Server.
// Установить режим, запрещающий выводить диалоговые окна и задать значения
// необходимых параметров:
USERS_COMPONENT.Params.Add('DontShowDialogs'; TRUE)
USERS_COMPONENT.Params.Add('SQLUserName'; 'sa')
USERS_COMPONENT.Params.Add('SQLUserPassword'; '')
USERS_COMPONENT.Params.Add('DontShowUserGenerationCompleteMessage'; TRUE)
// Поскольку компонента открывается только для добавления новой записи,
// ее нужно открыть пустой:
WhereID = USERS_COMPONENT.AddWhere('0 = 1')
// Добавить нового пользователя (работа с компонентой во многом аналогична работе
// со справочниками):
USERS_COMPONENT.Open
USERS_COMPONENT.Insert
USERS_COMPONENT.Requisites(SYSREQ_CODE).Value = UserName
USERS_COMPONENT.Requisites(SYSREQ_NAME).Value = FullName
USERS_COMPONENT.Requisites(SYSREQ_TYPE).Value = 'П'
USERS_COMPONENT.Requisites('UserStatus').Value = 'Пользователь'
USERS_COMPONENT.Save
// Задать представление компоненты и получить ссылку на форму для выбранного
// представления:
USERS_COMPONENT.ViewName = 'Главное'
USERS_COMPONENT_FORM = USERS_COMPONENT.Form
// Выполнить действие, соответствующее кнопке "Генерировать"
USERS_COMPONENT_FORM.Actions.FindAction('GenerateUsersAction').Execute
// Закрыть компоненту и удалить ограничения на выборку набора данных:
USERS_COMPONENT.Close
USERS_COMPONENT.DelWhere(WhereID)
2. Пример программного создания группы пользователей, добавления в нее пользователей и выдачи ее членам прав на компоненты. Приведенный ниже фрагмент кода создает группу пользователей с именем "Имя группы" и полным именем "Полное имя группы". В группу включается пользователь с именем "U1". Всем членам группы даются права на выполнение сценария с именем "Поиск РКК":
// Открыть компоненту "Группы пользователей".
// Поскольку компонента открывается только для добавления новой записи,
// ее нужно открытьпустой:
USERGROUPS = CreateReference(SYSREF_USER_GROUPS)
USERGROUPS_WhereID = USERGROUPS.AddWhere('0=1')
USERGROUPS.Open
// Добавить запись и заполнить значения реквизитов главного раздела:
USERGROUPS.Insert
USERGROUPS.Requisites(SYSREQ_CODE).Value = 'Имягруппы'
USERGROUPS.Requisites(SYSREQ_NAME).Value = 'Полноеимягруппы'
// Добавить в группу пользователя c сетевым именем U1 (1-ый детальный раздел):
DDS1 = USERGROUPS.DetailDataSet(1)
DDS1.Insert
// .. в качестве кода записи в данном случае используется имя пользователя
DDS1.Requisites('ПользовательТ').Value = 'U1'
// Выдать группе права на компоненту "BDFY" (это - сценарий):
// .. найти ИД и код компоненты с именем "Поиск РКК"
// ..(для этого открывается соответствующая запись компоненты "Компоненты").
// ..Перед открытием накладывается фильтр таким образом, чтобы после открытия
// ..набора данных компоненты в нем содержалась только искомая запись.
COMPONENTS = CreateReference(SYSREF_COMPONENTS)
WhereStr = COMPONENTS.DataSet.TableName & '.' & COMPONENTS.Requisites(SYSREQ_NAME).SQLFieldName & " = 'ПоискРКК'"
COMPONENTS_WhereID = COMPONENTS.AddWhere(WhereStr)
COMPONENTS.Open
COMPONENTS.OpenRecord
COMPONENT_ID = COMPONENTS.Requisites(SYSREQ_ID).Value
COMPONENT_CODE = COMPONENTS.Requisites(SYSREQ_CODE).Value
COMPONENTS.CloseRecord
COMPONENTS.Close
COMPONENTS.DelWhere(COMPONENTS_WhereID)
// ..найти ИД и код типа прав "Выполнение" на компоненту "Поиск РКК".
// ..Идея поиска полностью аналогична предыдущему случаю.
ART = CreateReference(SYSREF_ACCESS_RIGHTS_TYPES)
WhereStr = '(' & ART.DataSet.TableName & '.' & ART.Requisites('ComponentID').SQLFieldName & ' = ' & COMPONENT_ID & ')'
WhereStr = WhereStr & ' AND (' & ART.DataSet.TableName & '.' & ART.Requisites('КодТипа').SQLFieldName & ' = ' & "'ВЫПОЛНЕНИЕ'" &')'
ART_WhereID = ART.AddWhere(WhereStr)
ART.Open
ART.OpenRecord
AccessCode = ART.Requisites(SYSREQ_CODE).Value
ART.CloseRecord
ART.Close
ART.DelWhere(ART_WhereID)
// ..заполнить найденными значениями соответствующую строку в табличном разделе на закладке "Компоненты"
DDS2 = USERGROUPS.DetailDataset(2)
DDS2.Insert
DDS2.Requisites('ИмяТ').Value = COMPONENT_CODE // Компонента в таблице "Компоненты"
DDS2.Requisites('ПраваТ').Value = AccessCode // Тип доступа на компоненту в таблице "Компоненты"
// Сохранить группу, закрыть набор данных и удалить ограничения:
USERGROUPS.Save
USERGROUPS.Close
USERGROUPS.DelWhere(USERGROUPS_WhereID)
3. Пример отключения пользователя.
UserName = ' UserName '
ref = CreateReference(SYSREF_USERS)
foreach i in ref
if ref.Requisites('Наименование').Value == UserName
ref.Open
ref.OpenRecord
ref.Requisites('UserStatus').Value = 'Отключен'
ref.Save
endif
endforeach
4. Пример удаления логина пользователя из БД.
Для сохранения ссылочной целостности данных не рекомендуется удалять пользователя из системы, а лишь установить его статус «Отключен», воспользовавшись вышеприведенным примером.
Если же необходимо удалить пользователя из БД, например, пользователь заведен ошибочно, то это можно сделать только с помощью SQL запросов, убедившись перед этим, что он не используется в других объектах. Иначе после удаления пользователя возможны ошибки в работе системы.
Таким образом, перед выполнением запроса необходимо выполнить сценарии:
- Проверка целостности базы данных в части папок и электронных документов;
- Проверка целостности базы данных в части деловых процессов.
Данные сценарии вернут ИД объектов, которые принадлежали удаленному пользователю или были с ним связаны. Необходимо изменить эти объекты таким образом, чтобы они не содержали ссылок на несуществующие записи. Следующие запросы удаляют пользователя из групп пользователей и самого пользователя из БД.
delete MBAnValR
where Vid = 3118
and PolzovatelT = (select Analit from MBAnalit where Vid = 3119 and Dop = 'Логин')
delete MBAnalit
where Vid = 3119
and Dop = 'Логин'
Используя функцию SQL(), можно выполнить эти запросы в вычислениях на ISBL.
На самом деле из компоненты администратора Пользователи запись удалять можно (и через объектную модель это тоже должно работать). Не стоит удалять записи из справочника Пользователи (справочник с именем "ПОЛ").
Перед удалением выполнять проверку целостности БД нет особого смысла: данные до удаления в базе будут корректны. Проблемы начнуться после вмешательства в БД через SQL -запросы.
Перед удалением логина нужно выполнить интегрированный отчет "использование записи справочника", работая со справочником "пользователи".
Дополню также следующее: сценарии "проверка целостности БД в части..." в зависимости от выбранного при старте режима самостоятельно способны произвести удаление некорректных данных. Для этого при запуске нужно выбрать вариант "Скрипт".
Но это будет именно удаление (документов, задач и т.п.), так что без предварительной проверки, что он собирается удалить, не рекомендую на рабочей БД этот скрипт выполнять.
Здравствуйте, подскажите как при генерации поменять вид Аутентификации??
Где можно посмотреть список реквизитов компоненты "Пользователи"?
ХА!! )))) В справочнике ПОЛ(Пользователи), а где же еще ))))
Не все так просто. Генерация пользователя выполняется через компоненту администратора Пользователи.
Можно создать этот справочник и просто по всем реквизитам пройтись (вывести их имена на экран). Справочник имеет имя "Пользователи", насколько я помню.
В справочнике ПОЛ вообще не нашел реквизита Аутентификация. Я так понимаю нужен реквизит компоненты здесь использовать (так как мы работаем с компонентой)??
Например: USERS_COMPONENT.Requisites(*******).Value = 'По перекодированному паролю'
Вот как то так, вместо точек имя реквизита. По умолчанию создает Windows-аутентификацию
Вопрос решил. В цикле прошелся по всем реквизитам справочника SYSREF_USERS и вывел все на экран. Реквизит оказался называется банально 'Аутентификация' ))))
В справке по объектной модели для версии DIRECTUM 4.6.1, в ветке "Системные константы ISBL" - "Константы для работы с данными" есть раздел "Реквизиты компонент". В нем описаны константы и их значения для обращения к реквизитам компонент системы DIRECTUM. Так для обращения к реквизиту "Аутентификация" компоненты "Пользователи" можно вместо имени реквизита указать константу SYSREQ_USERS_AUTHENTICATION. Там же можно посмотреть и весь список реквизитов компоненты.
Было бы здорово, добавить сюда вычисление для создания групп пользователей из наполненного справочника Подразделения. С занесением состава подразделения в группу пользователей.
Такой скриптик здорово бы экономил время при первичной настройке системы.
По п.3 "Пример отключения пользователя" вопрос: зачем нужен foreach если i никак не используется?
Или так)
Авторизуйтесь, чтобы написать комментарий