Понимаю конечно, что с SAPом сравнивать не очень хорошая идея, но все же. При работе с SAP дл переноса обновлений можно выставить всем пользователям уведомление через систему о планируемых работах, а на период работы выгнать из системы и заблокировать на вход в систему всех пользователей (кроме ИТ). Очень удобная вещь, позволяет перенести обновление без риска потери данных за период сессии у пользователя и практически убирает весь негатив польхователей на тормоза в системе на период её компиляции.

Попробовал в Creatio заблокировать всех пользователей на вход, но такого функционала просто нет - можно решить БП. Уведомления тоже можно сделать БП, Закрытие активной сессии по идее тоже не проблема. 

Собственно вопрос - кто как работает и оповещает пользователей о технических работах в системе?

Нравится

2 комментария

Ну помимо предложенного способа с Бп, есть таблицы в базе данных. Можете подсоединится, вытянуть активных пользователей и уже как-то уведомить их письмом на почту, в мессенджер и т.д Сделать это можно прямо на сервере где развернут IIS простой консолькой на c#, запуск консольки делать планировщиком Windows по таймеру или триггеру

Мы рассматриваем вариант возможной реализации подобной функциональности в базовой логике наших продуктов.

В данный момент оптимальным решением Вашей бизнес-задачи будет реализовать процесс, уведомляющий пользователей о предстоящих работах в системе.

Показать все комментарии

Коллеги всем доброго времени суток.

Подскажите есть ли возможность переноса настроек прав доступа  на объекты с песочницы на прод, что бы не выполнять обно и тоже по нескольку раз.

Нравится

2 комментария
Лучший ответ

Добрый день, да возможно для этого к вашему пакету необходимо прикрепить данные из таблиц и можете связанные сущности по необходимости смотреть
VwWorkspaceObjects (Объекты рабочего пространства (представление))
SysAdminOperation (Operation permissions, если надо)
SysAdminOperationGrantee (Доступ к operation permissions, если надо)
SysEntitySchemaOperationRight (Доступ к объектам)
SysEntitySchemaRecordDefRight (Доступ к записям по умолчанию)
SysEntitySchemaRecordRight (Доступ пользователей к операциям над объектом)

SysAdminUnit(Объект администрирования) и тд. 

так же можете в конфигурации системы найти схемы объектов с словом "Доступ", может быть что-то упустил 

Добрый день, да возможно для этого к вашему пакету необходимо прикрепить данные из таблиц и можете связанные сущности по необходимости смотреть
VwWorkspaceObjects (Объекты рабочего пространства (представление))
SysAdminOperation (Operation permissions, если надо)
SysAdminOperationGrantee (Доступ к operation permissions, если надо)
SysEntitySchemaOperationRight (Доступ к объектам)
SysEntitySchemaRecordDefRight (Доступ к записям по умолчанию)
SysEntitySchemaRecordRight (Доступ пользователей к операциям над объектом)

SysAdminUnit(Объект администрирования) и тд. 

так же можете в конфигурации системы найти схемы объектов с словом "Доступ", может быть что-то упустил 

Также см. обсуждение.

Показать все комментарии

Могу ли я запретить создавать новые записи в реестре, имея только "Администрирование по записям"?

Если я в "Доступ к записям по умолчанию: Изменение" сделаю "кто создает: группа документооборот" и не будет "все сотрудники компании" это поможет сделать так, чтобы создавать могли только люди из группы документооборота?

Нравится

1 комментарий

Это задаётся не в администрировании по записям, а по объекту.

Можно убрать всем сотрудникам право на добавление и дать той группе, кому нужно.

Показать все комментарии

Здравствуйте, Коллеги!:)
В моей работе потребовалось закрыть доступ к ряду справочников(возможен только просмотр). Появилась проблема со справочником ОПФ. Этот справочник открывается особым образом(прикрепил картинку). Пробовал через администрирование, получается, но он блокирует для всех, кроме сис. админов, а мне требуется перекрыть именно всем, даже сис. админу. Помогите, пожалуйста, добрые люди:)

Нравится

2 комментария

Здравствуйте, Артем!

Можно ограничить права на редактирование справочников с помошью права доступа на операцию с кодом CanManageLookup.

"Мотков Илья" написал:

Можно ограничить права на редактирование справочников с помошью права доступа на операцию с кодом CanManageLookup.

Илья, а что делать с другими справочниками, если забрать права на эту операцию у всех? Апдейтить на уровне БД или есть какое-то более адекватное решение?

Показать все комментарии

Здравствуйте, Коллеги!:)
В моей работе потребовалось закрыть доступ к ряду справочников(возможен только просмотр). Появилась проблема со справочником ОПФ. Этот справочник открывается особым образом(прикрепил картинку). Пробовал через администрирование, получается, но он блокирует для всех, кроме сис. админов, а мне требуется перекрыть именно всем, даже сис. админу. Помогите, пожалуйста, добрые люди:)

Нравится

3 комментария

Здравствуйте!

Особенность системных администраторов в том, что они могут делать все.
Это администрируется системными операциями:

  • CanDeleteEverything
  • CanInsertEverything
  • CanSelectEverything
  • CanUpdateEverything

Для того, чтобы запретить всем пользователям вносить изменения в справочник необходимо создать соответствующую логику на уровне объекта справочника.

По умолчанию во всех справочниках проверяются права на системную операцию CanManageLookups (логика родительского объекта BaseLookup). Проверка реализована в процессе объекта в методе CanManageLookups.

Можно сделать следующее:
1) Создать новую системную операцию и никому на нее права не давать. Предположим, что ее код CanManageSpecialLookups. Естественно, права на эту операцию мы никому не даем.
2) Заместить объект справочника, в процессе объекта переопределить метод CheckCanManageLookups (установить признак "Переопределен").
Переопределенный метод должен выглядеть следующим образом:
UserConnection.DBSecurityEngine.CheckCanExecuteOperation("CanManageSpecialLookups");

После публикации только пользователи с правами на системную операцию CanManageSpecialLookups (то есть никто) смогут менять/добавлять/изменять данные справочника.

Спасибо, Алексей! Получилось

Так понятно объяснено и в краткие сроки:)

Показать все комментарии

Установка цвета для записи раздела происходит в функции grdDataOnGetRowDrawInfo сервиса scr_UsersGridArea.

Пользователь отображается серым цветом, только в том случае, если значение поле [IsInDatabase] источника данных ds_UserScript содержит enmNo.

Установка значения вычисляемого поля [IsInDatabase] происходит в событии OnDatasetCalcFields источника данных ds_UserScript:

     var SQLObjectName = GetDatasetFieldValue(Dataset, 'SQLObjectName');
     if (IsEmptyValue(SQLObjectName)) {
        return;
    }
    var IsInDatabase = Connector.DBEngine.GetIsUserExists(SQLObjectName);
    if (IsInDatabase) {
        Dataset.Values('IsInDatabase') = enmYes;
    } else {
        Dataset.Values('IsInDatabase') = enmNo;
    }

Функция ядра Connector.DBEngine.GetIsUserExists(SQLObjectName) возвращает true, только при условии, что sql запрос вернет значение равное 1:

SQL:

SELECT count(*) FROM [sysusers] WHERE [name] = 'LoginName' AND [issqlrole] = 0

Oracle:

SELECT COUNT(*) AS CNT FROM ALL_USERS  WHERE UPPER(USERNAME) = (SELECT UPPER("tbl_AdminUnit"."SQLObjectName")as NM FROM "tbl_AdminUnit" WHERE "tbl_AdminUnit"."SQLObjectName"  = 'LoginName');

где LoginName - логин пользователя на сервере

Примечание
Если sql запрос в orcale вернул значение больше 1, необходимо проверить параметры сессии (скорей всего не учитывается регистр в условии):
NLS_COMP
NLS_SORT

Регистр не учитывается:
NLS_COMP=ANSI;
NLS_SORT=BINARY_CI;

Регистр учитывается:
NLS_COMP=BINARY;
NLS_SORT=RUSSIAN;

Установить параметры сессии можно таким запросом:

ALTER SESSION SET NLS_COMP=BINARY;
ALTER SESSION SET NLS_SORT=RUSSIAN;

Нравится

Поделиться

0 комментариев
Показать все комментарии

Мне необходимо конкретному пользователю дать права на редактирование контрагентов. Как своих, так и не своих. Я зашёл в "Администрирование" -> слева вкладка "Пользователи", выбрал пользователя, затем вкладку "Права доступа к группам таблиц". Там установил все галочки напротив поля "Контрагенты". Тем не менее, пользователь так и не может редактировать информацию в контрагентах.
Как быть?

Нравится

2 комментария

Мне кажется, тут нужно использовать «Права доступа по умолчанию». Прописать там для контрагентов кроме группы «Все пользователи» ещё и того пользователя с правом чтения и редактирования. При этом для всех новых контрагентов право будет выдаваться автоматически, а для старых записей нужно единоразово выполнить SQL-запрос:

insert into tbl_AccountRight (RecordID, AdminUnitID, CanRead, CanWrite, CanDelete, CanChangeAccess)
select 
a.ID, 
(select ID from tbl_AdminUnit where Name = 'Василий Пупкин'), --вместо Пупкина необходимо поставить Имя пользователя или группы, которой нужно дать доступ
1, --добавить право на чтение записи (0 - запретить)
1, --добавить право на изменение записи
0, --добавить право на удаление записи
0  --добавить право на управление доступом для этой записи
from tbl_Account a where not exists
(select id from tbl_AccountRight ir
 where AdminUnitID = (select ID from tbl_AdminUnit where Name = 'Василий Пупкин')
and ir.RecordID = a.id
)

Потом, когда появится второй такой пользователь, дать ему права будет намного легче, если всё это проделать не для пользователя, а для группы. Создать группу с названием вроде «Имеют право редактировать контрагентов», настроить для неё права по умолчанию, запустить скрипт. И в конце пользователей включить в эту группу.

Огромное спасибо! Помогло.

Показать все комментарии

Здравствуйте!
Можно ли сделать администрирование по записям для справочника в версии 3.2. Я пытался сделать для одного из своих справочников - не удалось. Выставил флаг "Администрирование по записям", занес права пользователей, но доступ пользователей к записям справочника стал невозможен несмотря на выставленные права, пока не убрал администрирование по записям, да и убрать удалось далеко не с первой попытки.

Нравится

2 комментария

Добрый день!

Во вложении находится руководство по настройке прав доступа на справочники.prava_dostupa_na_otdelnye_spravochniki.doc

Спасибо! Вопрос снят. Новую группу создавать не нужно, можно выставить права на группу "Справочники". Чтобы правами можно было управлять пришлось создать подобие раздела для справочника.

Показать все комментарии

Terrasoft 341 на Oracle

Хочется поделиться теми доработками, которые коснулись работы с СУБД Oracle в версии 341. Сделанные доработки - это самые кардинальные изменения с момента появления поддержки СУБД Oracle в Terrasoft 3.х.

Переработана почти половина всего взаимодействия с Oracle, оптимизирован раздел Администрирование, получение прав и раздача прав пользователей, сделано множество исправлений и существенно повышена безопасность.

Немного про оптимизацию

Для сравнения, например раздача прав на чтение одному пользователю на группу таблиц занимала более 30 секунд, в версии 341 раздача права чтения для группы пользователей с 500 пользователями занимает 3 секуды. Работа с разделом Администрирование стала гораздо комфортнее. Немного оптимизировано сохранение таблиц.

Системные объекты Oracle

Одной из основных задач стоял отказ от использования системных таблиц, представлений и ролей Oracle. Сейчас не используется ни один системный объект, пользователи и администраторы Terrasoft видят только объекты Terrasoft и не имеют никаких "опасных" прав. Другие пользователи Oracle также не имеют доступа к Terrasoft, ни одна привилегия не раздается на PUBLIC (для всех пользователей). Каждый пользователь Terrasoft получает только те права, которые ему необходимы, ни больше ни меньше.

Доработка скриптов поднятия БД

По многочисленным просьбам добавлена возможность указывать имя инстанса Oracle и табличное пространство для разворачивания схемы.

Список ключевых изменений:

  • Не используется системная роль DBA, не используется системный пользователь SYS
  • Не используются системные функции, пакеты, таблицы и представления
  • Администратор и Системный администратор не являются администраторами Oracle, соответственно не могут выполнять никаких лишних административных действий, не могут видеть и изменять никакую информацию из других схем БД Oracle
  • Все пользователям Террасофт доступны только объекты схемы Террасофт
  • Может быть множество администраторов и системных администраторов
  • Для групп таблиц не используются роли сервера
  • Оптимизирована раздача прав пользователям на группы таблиц
  • Оптимизация раздачи прав на не администрируемые объекты Террасофт
  • Повышена безопасность – не раздается доступ на PUBLIC, доступ дается только пользователям и ролям, которым он действительно нужен
  • Оптимизированы скрипты поднятия бэкапа

Нравится

Поделиться

4 комментария

Супер! Это отличная новость!

Александр, вы начали использовать RLS или так и остались представления?

"Осауленко Александр" написал:

Александр, вы начали использовать RLS или так и остались представления?


Используем представления, но не системные.

Саша, вы все молодцы, вы реально крутые!
Это то, что требуется нашим клиентам!!
Большое - пребольшое спасибо и респект!! :smile:

Показать все комментарии

Ситуация в следующем:
В администрировании создал Группы (Школы). Установил им определенные права, т.е. если Школа 1 добавила Студента 1, то Школа 2 не видит данного студента. Аналогично если Школа 2 добавила Студента 2, то Школа 1 не видит его. Примерно выглядит следующим образом:

1

Теперь на карточке дублей необходимо создать кнопку "Использовать найденного клиента". Описание:
Школа 1 добавила Студента 3 к себе. Теперь Студент 3 хочет учиться, помимо Школы 1, и в Школе 2. Школа 2 добавляет его к себе. Всплывает окно дублей о том что студент уже есть в базе. Суть кнопки в следующем: берется найденный студент и добавляется в Школу 2, но чтобы он был виден и Школе 1 и в Школе 2. Примерно отобразил следующем рисунке:

2

Как я понимаю необходимо в деталь "Доступ" (по найденному дублю записи) добавить запись с Группой (Школой). Встает встречный вопрос: как узнать Группу (Школу) в которой находится входящий в систему пользователь. Есть ли такая табличка с пользователем и соответствующей ему Группе (Школе)?

Нашел способ. Итак что я сделал:

В скрипте scr_SubjectDuplicates создал глобальную переменную

var DublFlag = 0;

На OnPrepare окна дублей добавил следующее

        var Sender = Self.Attributes('DuplicatesProperties').NotifyObject;

        if (Sender.Name == 'wnd_ContactEdit') {
                DublContact = 1
        }

и на кнопку "Использовать найденного клиента"

function btnUseOnClick(Control) {
        if (DublContact == 1) {
                var ds_Contact = Services.GetNewItemByUSI('ds_Contact');
                var Sender = Self.Attributes('DuplicatesProperties').NotifyObject;
                var ID = Self.Attributes('DuplicatesProperties').SubjectDataset.Values('ID');
                SetAttribute(Sender, 'IDRecord', ID);
                SetAttribute(Sender, 'IsDuble', true);
                btnUse.ModalResult = wmrCancel;
        }
}

Далее на кнопк Ок

function btnOKOnClick(Control) {
        var Dataset = dlData.Dataset;
        if (!CheckContactData(Dataset)) {
                return;
        }
        CheckName();
        CheckEmail();
        SetAttribute(Self, 'IDTo', dlData.Dataset.Values('ID'));
        scr_BaseDBEdit.btnOKOnClick(Control);
       
        // Если есть дубль но вызов функции
        var IsDuble = Self.Attributes('IsDuble');
        if (IsDuble == true) {  
                FillDublicatesValues();
                Self.Close();
        }

}

где в функции FillDublicatesValues()

взял Connector.CurrentUser.ContactID входящего.
Отфильтровал tbl_AdminUnit, поле UserContactID по Connector.CurrentUser.ContactID.
Взял ID

Отфильтровал tbl_UserInGroup, поле UserID по ID.
Взял все GroupID и вставил в tbl_ContactRight, т.е.

function FillDublicatesValues() {  
        var ID = Self.Attributes('IDRecord');
        var ds_Contact = Services.GetNewItemByUSI('ds_Contact');
        var DatasetTo = Services.GetNewItemByUSI('ds_Contact');
        var IDTo = Self.Attributes('IDTo');
       
        var ds_ContactRight = Services.GetNewItemByUSI('ds_ContactRight');
        ApplyDatasetFilter(ds_ContactRight, 'RecordID', ID, true)
        ds_ContactRight.Open();

                var IncomingUser = Connector.CurrentUser.ContactID;
                var ds_AdminUnit = Services.GetNewItemByUSI('ds_AdminUnit');
                ApplyDatasetFilter(ds_AdminUnit, 'UserContactID', IncomingUser, true);
                ds_AdminUnit.Open();
                var AdminUnitID = ds_AdminUnit.Values('ID');

                var ds_UserInGroup = Services.GetNewItemByUSI('ds_UserInGroup');
                ApplyDatasetFilter(ds_UserInGroup, 'UserID', AdminUnitID, true);
                ds_UserInGroup.Open();
                while (!ds_UserInGroup.IsEOF) {
                        var GroupID = ds_UserInGroup.Values('GroupID');
                       
                        while (!ds_ContactRight.IsEOF) {
                                if(ds_ContactRight.Values('AdminUnitID') != GroupID) {
                                        var IQ = Services.GetNewItemByUSI('iq_ContactRight');
                                        IQ.ColumnsValues.ItemsByName('ID').Value = Connector.GenGUID();
                                        IQ.ColumnsValues.ItemsByName('RecordID').Value = ID;
                                        IQ.ColumnsValues.ItemsByName('AdminUnitID').Value = GroupID;
                                        IQ.ColumnsValues.ItemsByName('CanRead').Value = true;
                                        IQ.ColumnsValues.ItemsByName('CanWrite').Value = true;
                                        IQ.ColumnsValues.ItemsByName('CanDelete').Value = false;
                                        IQ.ColumnsValues.ItemsByName('CanChangeAccess').Value = false;
                                        IQ.Execute();  
                                }
                                ds_ContactRight.GoToNext();
                        }
                        ds_UserInGroup.GoToNext();
                }
}

Думаю кому то в будущем пригодится!

Нравится

Поделиться

0 комментариев
Показать все комментарии