Ах, какая архиполезнейшая ветка, господа! Прочитал с большим интересом.
Цитата:
Сообщение от
Alexis
Вот только ума не приложу, неужели так сложно было реализовать эту кнопку и для ВСЕХ групп тоже, а не только для одной. :-\
С позволения присоединюсь, потому что тоже приходилось несколько раз экспортировать права всех групп в файлы - руками по одной группе за одно нажатие на кнопку "Экспорт". И тоже недоумевал. И тоже надоело. Решил рискнуть - и что-то получилось. Не супер-пупер, но сработало как мне надо. Может, кому-нибудь еще пригодится.
X++:
static void KKu_Job_6B01_ExportAllUserGroupsToFiles(Args _args)
{
// сохраняет все права групп пользователей в отдельных файлах в указанном каталоге
SysSecurityUserGroup sysSecurity;
UserGroupInfo userGroupInfo;
userGroupId userGroupId , tmpUserGroupId;
domainId domainId , tmpDomainId;
str fileName;
str filePath = @'C:\YourOwnFolder\ForUserGroups\'; // '//заключительный обратный слэш - обязателен'
;
sysSecurity = SysSecurityUserGroup::construct();
domainId = ''; // здесь возможно нужен конкретный домен, если их несколько,
// но у меня их нет (в таблице DomainInfo нет записей) - поэтому пустая строка
while select userGroupInfo
{
userGroupId = userGroupInfo.id;
fileName = filePath +
( strReplace
( strReplace
( strReplace
( strReplace
( strReplace
( strReplace
( strReplace
( strReplace
( strReplace( userGroupId, '.', '_'), // в качестве имени файла - id группы, очищенный от "нехороших" символов
' ', '_'),
':', '_'),
'/', '_'),
@'\', '_'),
'?', '_'),
'*', '_'),
'[', '_'),
']', '_')
);
tmpUserGroupId = sysSecurity.parmUserGroupId();
tmpDomainId = sysSecurity.parmDomainId();
// ----------------------------------------------------------------------------------------
// выдрано из цикла if (dialog.run()) метода exportWithDialog класса SysSecurityUserGroup
// скопировал по-обезьяньи, не особо разбираясь что к чему, но всё работает как мне надо :)
sysSecurity.save();
sysSecurity.parmDomainId( domainId );
sysSecurity.parmUserGroupId( userGroupId );
sysSecurity.load();
sysSecurity.export( fileName );
sysSecurity.parmDomainId( tmpDomainId );
sysSecurity.parmUserGroupId( tmpUserGroupId );
sysSecurity.load();
// ----------------------------------------------------------------------------------------
}
}
Всё что нужно сделать перед запуском джоба, так это прописать ваше имя папки, в которую будут складываться файлы.
Имена файлов формируются автоматически из идентификаторов групп. "Центрально симметричная" конструкция с многократными вызовами функции strReplace занимается очисткой идентификаторов групп от "нехороших" символов с точки зрения имени файла. Как видно в коде, "нехорошие" символы заменяются символами подчеркивания. Степень "нехорошести" - моя субъективная и некоторые символы (пробел, точка) в принципе вполне корректны для имени файла. Просто я предпочитаю, чтобы имя файла состояло только из букв, цифр и подчеркиваний. Вы можете смело сократить или расширить перечень заменямых символов по вашему усмотрению (например, на основании предварительного анализа значений поля Id таблицы UserGroupInfo)
Собственно "движок" процесса экспорта заимствован из цикла if (dialog.run()) метода exportWithDialog класса SysSecurityUserGroup. Заимствован неосознанно, без большого понимания что и как происходит именно в этих строчках кода (за неимением времени разбираться). Если кто-то не сочтет за труд немного прокомментировать (или даже оптимизировать) этот фрагмент - заранее премного благодарен!
Цитата:
Сообщение от
sukhanchik
Внимание - вопрос: вот вы выгрузили права для 5 групп и одного домена. А загружаться они как должны? А если они чуть-чуть отличаются между собой? А если при загрузке вы выделили не те группы/домены (или таковых вообще не существует)? А названия групп/доменов в файле экспорта/импорта не хранятся - т.к. импортировать права можно в другую пару домен/группа. Вопросов тут больше чем ответов.
На это заострение темы с доменами внимание, конечно, обратил, но особо пока не "грузился" по этому поводу и был очень рад, что домен у меня "один, да и тот пустой"