Используем Террасофт XRM 3.3.1.31 на MS SQL.
Технический вопрос такого плана:
Предположим, существует группа доступа "Секретариат", которая может просматривать определенные поля контрагента (наименование, город, ответственный) и добавлять новых контрагентов (с доступом ко всем полям).
У нас получилось два варианта реализации этого:
1. Доступ к таблицам контрагентов: чтение, изменение. Доступ к полям: наименование, город, ответственный (все на чтение), доступ по умолчанию на чтение, изменение.
В таком варианте секретарь видит у существующего контрагента только значения полей наименование, город, ответственный, но новых контрагентов добавлять не может.
2. Доступ к таблицам контрагентов: чтение, изменение. Доступ к полям: наименование, город, ответственный (все на полный доступ), доступ по умолчанию на чтение, изменение.
В таком варианте секретарь дополнительно может изменять поля (наименование, город, ответственный) у существующих контрагентов, а нам бы этого не хотелось.
Возможно, поможет написание дополнительной функциональности в скриптах. Вариант со скрытием колонок в окне реестра и полей в карточке редактирования контрагента не подходит, потому что таким образом менеджер не сможет увидеть в реестре значения полей для тех контрагентов, которые он может редактировать. А также прийдется скрывать эти колонки в окнах выбора контрагента (например, в карточке продажи поле "Контрагент").
Может кто сталкивался с такой проблемой и есть какое-то универсальное решение, а не просто латание дыр (если использовать скрытие колонок в реестре и в других местах).
Подскажите, пожалуйста верную реализацию.
Нравится
Андрей, думаю, более-менее приемлемое решение - то, которое Вы описали (скрывать/отображать нужные поля в зависимости от пользователя/группы и принадлежности записи). Создание механизма, позволяющего управлять доступом на определённые поля определённых записей таблицы, подобно тому, как реализован доступ на записи таблиц в нашей системе, - очень сложная (если вообще возможная) задача, и в результате такой механизм будет сильно нагружать систему.
Спасибо, так и сделаю.
Может кому-то пригодится:
// Функция скрытия некоторых колонок в реестре "Все контрагенты" для неадминов function CheckDisplayColumnsForCurrentUser(Window) { // Если текущий пользователь не администратор if (!Connector.CurrentUser.IsAdmin) { // Разрешенные колонки для просмотра для неадминистратора var AllowedFieldNames = ";Name;OwnershipID;CountryID;StateID;CityID;DistrictID;OwnerID;"; // Получаем количество колонок в представлении "Все контрагенты" var ColumnsCount = gvAll.Count; var IncreaseIndex = 1; for (i = 0; i < ColumnsCount; (i+=IncreaseIndex)) { IncreaseIndex = 1; var Column = gvAll.Items(i); if (AllowedFieldNames.indexOf(';'+Column.DataFieldName+';') == -1) { // Если колонка не в списке разрешенных, то убираем ее gvAll.RemoveItem(Column); ColumnsCount -= 1; IncreaseIndex = 0; Self.RemoveComponent(Column); } } } }