Динамическая форма создания и редактирования объекта Контрагент

С помощью конструктора форм можно управлять видимостью и обязательностью заполнения контекстных переменных на формах создания и редактирования объектов. К сожалению, в системных объектах, в отличии от пользовательских, нельзя использовать сценарии в конструкторе форм, поэтому мы воспользуемся javascript и Razor-формой.

В данном примере мы рассмотрим создание динамической формы для системного объекта Контрагент, а именно, сделаем фильтр для одного объекта, зависящий от другого.

Создание справочников

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

Создаем справочник Тип работ, по которому будем фильтровать:   

Сохраняем  и публикуем Тип работ.

Создаем справочник Работы, который в дальнейшем будем фильтровать:

В справочнике Работы создаем свойство с типом Тип работ:

Сохраняем и публикуем Работы

Добавляем с объект Контрагент два свойства с типами Работы и Тип работ

Сохраняем и публикуем Контрагент, перезапускаем сервер.

Создание формы

В папке \UserConfig\WebApplication\Modules\EleWise.ELMA.CRM.Web\View (если такого пути нет, его необходимо создать) создаем файл Contractor_create.cshtml.

Содержимое файла Contractor_create.cshtml:

<script type=’text/javascript’>
function setFilter(id){
    var selectUrl = id > 0 ? "/Common/Entity/Select?uid={uid_object1}&filterProviderUid=3d23090b-7809-40aa-beec-b19042591a82&filterProviderData={object1_attribute}%3D"+id : "/Common/Entity/Select?uid={uid_object1}";
    $(’#Entity_{object1_name}_Id’).data(’tComboBox’).ajax.selectUrl=selectUrl;
}
$(document).ready(function(){
    $(’#Entity_{object2_name}_Id’).bind(’valueChange’, function(e){setFilter(e.value);});
	setTimeout("setFilter($(’#Entity_{object2_name}_Id’).val())", 100);
});
</script>

где

{uid_object1} - UID первого объекта, который нужно фильтровать и в котором есть ссылка на второй. Его можно посмотреть в адресной строке браузера в веб-интерфесе, открыв справочник:

  

{object1_attribute} - имя свойства в первом объекте, которое имеет тип второго объекта:

{object1_name} - имя первого свойства в объекте Контрагент, которое нужно фильтровать:

{object2_name} - имя второго свойства в объекте Контрагент, по которому будем фильтровать:

На форму создания и редактирования объекта Контрагент добавляем панель:

В настройках панели, во вкладке Общие, указываем Стиль - Без стиля, чтобы ее не было видно на форме.

Во вкладке Системные указываем путь к Razor-форме: ~/Modules/EleWise.ELMA.CRM.Web/View/Contractor_create.cshtml

 

Содержимое файла Contractor_create.cshtml для данного примера:

<script type=’text/javascript’>
function setFilter(id){
    var selectUrl = id > 0 ? "/Common/Entity/Select?uid=e4b32ba2-9966-4047-9eef-8bf8cc53542a&filterProviderUid=3d23090b-7809-40aa-beec-b19042591a82&filterProviderData=TipRabot%3D"+id : "/Common/Entity/Select?uid=e4b32ba2-9966-4047-9eef-8bf8cc53542a";
    $(’#Entity_Raboty_Id’).data(’tComboBox’).ajax.selectUrl=selectUrl;
}

$(document).ready(function(){
    $(’#Entity_TipRabot_Id’).bind(’valueChange’, function(e){setFilter(e.value);});
	setTimeout("setFilter($(’#Entity_{object2_name}_Id’).val())", 100);
});
</script>

В результате, до указания типа работ, получаем полный список работ:

После указания типа работ, получаем отфильтрованный список: