Вопрос

Сокрытие списка полей на бизнес-уровне

Помогите разобраться: имею список названий колонок схемы, нужно на уровне Entity их очистить, чтобы гарантировать, что они не будут видны не только в конкретной форме, но и нигде. Предположил, что можно пройтись по GetColumnValueNames(), но для колонок-справочников имена отличаются, типа <имя>Id (Я так понимаю, как в БД), <имя>Value (lookup value из связанной таблицы). Подскажите, как гарантировано и эффективно очистить колонки по имени? Насколько быстрым будет вариант через Entity - Schema - EntitySchemaColumn? Может ли помочь знание не только ColumnName, но и UId?

Нравится

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

Нужно просто настроить запрещающий доступ по колонкам.

Так же вы на уровне можете скрыть поле на уроне Entity (будет существовать в БД, невозможно будет создать колонку с таким же именем и тд), но тогда обращение к нему стандартными методами будет затруднено. Для этого необходимо изменить режим использования 

Запрещающий доступ не подходит, поскольку администрировать нужно по каждой записи отдельно. Сценарий - индивидуальный менеджер видит все по своему контрагенту, любой менеджер - только часть. Может, есть где-то нормальная документация по sdk с комментариями чуть полнее, чем Overloaded :) ?

Вопрос комбинации доступа по записям и полям обсуждался неоднократно, простого решения нет, только доработка.

 

Зверев Александр,

Так доработку мы и ведем, сейчас наткнулись на то, что вычитать "запрещенные" колонки можем, но скрыть их - нет, поскольку в схеме и сущности разные нотации, а гарантированно сопоставить одни с другими не можем.

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

Так мы пока и сделали, но это явный костыль, не ясно, как отработает колонка, у которой Id уже присутствует в названии. Поэтому и ищем более чистое решение.

Если у справочной колонки уже есть «Id» как часть названия, то в базе будет, соответственно, «IdId». Но лучше таких названий избегать.

Исправить первый пост не могу, там не <имя>Value, а <имя>Name, что впрочем не принципиально. Принципиально, что о гглупости, или незнанию, или умышленно созданная колонка ContactName не будет отличаться от Contact.Name, а потом такую ошибку черта лысого найдешь.

Посмотреть список полей можно в дизайнере объекта в конфигурации, а список колонок таблицы — подключившись к базе. Если есть риск, что пользователи по глупости, незнанию или злому умыслу создадут колонки с неподходящими именами — не давайте им прав администратора.

Спасибо, мы все это смотрели, но мы делаем более-менее generic решение, с тем, чтобы оно работало без дополнительных ограничений и не только в момент сдачи, поэтому варианты посмотреть, перечислить явно и т.п. никак не подходят. Нужна или аутентичная процедура получения одного из другого (или хотя бы документированное API, по которому не приходится догадываться, что имеется в виду), или официальній документ о требованиях к именованию, или (что хуже всего) авторитетное утверждение, что єти колонки каждій именует как Бог на душу положит и задача не решается в принципе.

Требования к именованию публиковались ещё во времена 3.Х.

Если Вы делаете универсальный механизм выдачи прав, можно делать подобно уже существующим: права для колонок хранятся в таблице SysEntitySchemaColumnRight. Там указывается не название, а именно Id колонки.

Мы так и делаем, правда там хранятся не Id, а UId, и я пытаюсь от имеющихся UId перейти к columnName, которые можно передать в Entity.SetColumnValue. Думал, что нашел, но см. первый пост этой ветки.

Поскольку на https://community.terrasoft.ru/questions/spisok-ne-administriruemyh-kol… никто не отвечает по сути вопроса, я просто пробую другой подход, основная часть задачи решена, а то, что казалось очевидным при беглом взгляде на имеющийся API, оказалось проблемой.

Обычно имена в базе и схеме совпадают, отличие только для справочных. Можно проверять, справочник ли это и затем добавлять или удалять «Id».

Также можно получить в виде JSON метаданные объекта и анализировать их: для каждой  справочной колонки там в соответствующих полях есть тройка названий: для поля-объекта, поля с Guid и поля для отображения. Например, "Type", "TypeId" и "TypeName".

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