Добрый день всем!
Недавно обнаружена необычная особенность в ограничении доступа по полям.
Поскольку в руководстве администратора об этом не сказано, думаю, об этом будет полезно узнать всем, кто собирается ограничить доступ по полям для пользователей системы.
Итак, постановка задачи.
Есть некоторая группа пользователей, для которой необходимо запретить просмотр и редактирование некоторого поля (например, Зарплата) в разделе, например, Контакты.

Общая модель прав доступа в системе такова, что при определении уровня прав доступа система анализирует права пользователя и всех групп, в которые он входит, и исходя из этого берет максимальные права. Это справедливо для прав по группам таблиц и прав по записям.
Однако, только для MSSQL, и только для прав доступа по полям, наблюдается следующее исключение. При определении уровня прав пользователя на некоторое поле используются встроенные средства MSSQL, использование которых приводит к тому, что при определении уровня прав доступа берутся не максимальные, а минимальные права пользователя на поле.

Пример:

Есть группа Все пользователи, группа Операторы, группа Начальство. Требуется для обычных пользователей скрыть доступ на поле Зарплата карточки Контакта, причем сделать это на уровне прав доступа на поле.

Решение, которое подходит для MSSQL: для группы Все пользователи доступ по полям не ограничивать (по умолчанию полный доступ), всех обычных пользователей поместить в группу Операторы, и группе Операторы запретить чтение поля Зарплата в таблице Контакт. Группе пользователей Начальство не изменять прав доступа по полям (по умолчанию полный доступ).
Недостаток - все обычные пользователи должны быть помещены в группу Операторы.
Преимущество - высокая скорость работы, т.к. используются "родные" механизмы СУБД MSSQL.

Решение, которое подойдет для Oracle и Firebird: для группы Все пользователи запретить доступ на поле Зарплата сущности Контакт, для группы Начальство не ограничивать доступ по полям.
Достоинство - простота настройки.
Недостаток - искусственная реализация на уровне запросов и ядра, более низкая скорость.
Кстати, этот материал актуален для 3.3.0, 3.3.1. Для других версий не проверял, очень вероятно, что это справедливо для всех версий начиная с 3.1.1.

 

Нравится

Поделиться

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

О, наконец-то появилось аргументирование объяснение этому "спецэффекту" с правами доступа на поля.

Точно, Большое спасибо,
а то вроде права раздал правильно, а в результате - "зарплату" никто не видит ;)

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

Дмитрий, спасибо за разъяснения.

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

При работе в TSAdmin, во время изменения имени существующего поля таблицы, происходит слияние заголовка, если он состоит более чем из одного слова(удаляются пробелы).
Было поле "ArvTransfer" - с заголовком "Встреча в аэропорту"
Поменял на "ArvTransferID" - заголовок преобразовался в "Встречаваэропорту"
P.S.Предполагаю что это специфика автозаполнения заголовка...
Можно ли это исправить?

---
Конфигурация:
TSCRM 3.3.1.36
Firebird 2.0 (v.2.0.3.12981)

Нравится

5 комментариев

Имея исходники TSAdmin - легко :)

"Underscore a.k.a. _" написал:Имея исходники TSAdmin - легко :)

не факт :smile: помучится точно придется

"Агутин Алексей" написал:помучится точно придется

Ну судя по тому сколько эта бага жить и трудиться мешает, то да :)

"Underscore a.k.a. _" написал:Ну судя по тому сколько эта бага жит и трудится мешает, то да :)

Поэтому нужно давать названия не в бровь, а в глаз, которые не нужно бы было потом менять :)

"Раловец Ольга" написал:Поэтому нужно давать названия не в бровь, а в глаз, которые не нужно бы было потом менять

Я думал нужно писать софт, в которым не нужно бы было потом баги вылавливать :) Но Ваш вариант тоже можно рассмотреть :)

Кстати, Александр, оформляйте идею, два балла на дороге не валяются :)

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

При синхронизации полей раздела "Контакты" с MS Outlook возникает ситуация, когда информацию из некоторых полей нет надобности переносить.
Для того, чтобы сократить число синхронизируемых полей, достаточно закомментировать соответствующие строки в функции SetContactInfoFromMSOutlook скрипта scr_MSOutlookContactSynchronization. В этом скрипте описан перечень полей, информация которых должны быть синхронизирована. Вам необходимо закомментировать те поля, которые нет надобности синхронизировать, сохранить внесенные изменения, перезапустить рабочее приложение Terrasoft CRM и протестировать работоспособность системы.

Желаю удачи!

С уважением,
Мельникова Екатерина

Нравится

Поделиться

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

Рассмотрим реализацию функционала на конкретном примере.Видоизменяем карточку контакта для собственных нужд: создаем отдельные поля "Фамилия", "Имя", "Отчество". Но также оставляем поле "ФИО", которое должно заполняться автоматически на основании суммы значений в вышеуказанных полях.

Для реализации подобного функционала во-первых, требуется создать функцию, которая будет заполнять поле ФИО. Эту функцию можно создать вначале скрипта, в котором будет обработчик события OnDatasetDataChange:

function CreateName(Dataset) {
var FirstName = Dataset.Values('FirstName');
FirstName = (IsEmptyValue(FirstName) ? '' : ' ' + FirstName);
var Surname = Dataset.Values('Surname');
Surname = (IsEmptyValue(Surname) ? '' : Surname);
var PatronymicName = Dataset.Values('PatronymicName');
PatronymicName = (IsEmptyValue(PatronymicName) ? '' : ' ' + PatronymicName);
Dataset.Values('Name') = Surname + FirstName + PatronymicName;
}

Затем на событии OnDatasetDataChange датасета необходимо для каждого из полей вызывать созданную предварительно функцию:

function SelfOnDatasetDataChange(DataField) {
var Dataset = DataField.ParentDataFields.ParentDataset;
if (DataField.Name == 'Surname') {
CreateName(Dataset);
return;
}
if (DataField.Name == 'FirstName') {
CreateName(Dataset);
return;
}
if (DataField.Name == 'PatronymicName') {
CreateName(Dataset);
return;
}
if ((Contact.IsUpdating || !Assigned(DataField) ||
(IsEmpty(DataField.Value)))) {
return;
};
}

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

Нравится

Поделиться

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

Всем известно, что в поле "Обращение" должно подставляться имя и отчество. Это логично и это прекрасно реализовано в стандартной версии приложения. Но как быть, если используется английская версия приложения и базу наполняют американцы? Вводишь в поле "Name" John Smith, а в поле "Обращение" подставляется Smith (фамилия), делаешь рассылку с макросом по полю обращения и только потом обнаруживаешь, что тебе делают замечания типа "My name is John"....

Оказывается, для повышения клиенториентированности компании достаточно закомментировать почти все строки одной маленькой функции.

Открою тайну, где это необходимо сделать.Открываем scr_ContactAccountUtils, функция GetDearFromName.
Эта функция должна иметь следующий вид:

f

unction GetDearFromName(ContactName) {
 var NameArray = ContactName.split(' ');
 var Result = '';
 if (NameArray.length 2) {
  return Result;
 }
/* for (var i = 1; i NameArray.length; i++) {
  if (Result != '') {
   Result += ' ';
  }
  Result += NameArray[i];
 }
*/

 Result = NameArray[0];
 return Result;
}

Сохраняем изменения, перезапускаем рабочее приложение Terrasoft CRM.

Желаю удачи!

С уважением,
Мельникова Екатерина

Нравится

Поделиться

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

Добрый день!
Подскажите, пожалуйста, как реализовать в отчете вывод Фамилии и инициалов контакта, имея стандартное в TS CRM поле ФИО?
Заранее спасибо!

var FIO = 'Иванов Петр Федорович';
var surname = FIO.substr(0, FIO.indexOf(' ')) + ' ';
var d1 = FIO.indexOf(' ');
surname += FIO.substr(d1 + 1, 1) + '. ';
surname += FIO.substr(FIO.indexOf(' ', d1 + 1) + 1, 1) + '.';

surname = 'Иванов П.Ф.'

Спасибо большое! Все работает:smile:

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

В процессе работы с системой Terrasoft возникает необходимость всячески ускорить процесс введения данных в карточки. Например, при введении значения в поле "Город" было бы неплохо заполнять автоматически не только поле "Страна", но и "Регион". Естественно, что без внесения изменений в конфигурацию приложения не обойтись.
Для реализации подобной функциональности предлагаю следующий вариант решения.
В скрипте scr_Account нужно внести изменения в функцию function SelfOnDatasetDataChange(DataField). Готовый и протестированный код привожу ниже:

var CountryDataField = Self.DataFields.ItemsByName('CountryID');
                var CityDataField = Self.DataFields.ItemsByName('CityID');
                var StateDataField = Self.DataFields.ItemsByName('StateID');
        Self.DataFields.ParentDataset.DisableEvents();
                if (FieldName == 'CityID') {
                        if (!IsEmptyValue(DataField.Value)) {
                                var CityInfo = GetDatasetFieldValuesByID('ds_City', DataField.Value,
                                        'CountryID', 'StateID');
                                Self('StateID') = CityInfo('StateID');
                                Self('CountryID') = CityInfo('CountryID');
                        }

                }

Общая схема доработки такова: необходимо прописать условие по полю «Город», if (FieldName == 'CityID'). Если в этом поле есть значение – то заполнять поля «Страна» и «Регион».

После сохранения внесенных изменений, перезапуска рабочего приложения Terrasoft CRM Вы будете счастливым обладателем удобного функционала в системе!

Желаю удачи!

С уважением,
Мельникова Екатерина

Нравится

Поделиться

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

"Мельникова Екатерина" написал:Self.DataFields.ParentDataset.DisableEvents();

Жжете :)
И в компанию к DisableEvents() кажется чего-то не хватает.

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