. В данной статье будет описано, как с помощью JavaScript реализовать:
- создание поля, подобного полю lookup по нескольким объектам;
- фильтрацию выпадающих списков в зависимости от значения в поле;
- свертывание раздела на вкладке;
- отображение списка на вкладке объекта.
Реализация перечисленных механизмов будет производиться на объекте «Реестр должников». Смоделируем следующую ситуацию. Предположим, компания, которая является коллекторским агентством, нуждается в автоматизации процесса отслеживания должников. Компании необходима система, позволяющая:
- вести список должников (должником может быть человек или компания);
- отслеживать тип должника (долг менее 500 тыс., долг более 500 тыс.);
- отслеживать стадию дела по должнику;
- отслеживать контактные телефоны должника;
- отслеживать информацию по долгам;
- отслеживать список мероприятий по данному должнику;
- отслеживать список просрочек должника.
Список мероприятий должен делиться на два типа: досудебные мероприятия и судебные мероприятия. Список доступных стадий дела должен фильтроваться в зависимости от значения в поле «Тип должника». Список просрочек должен отображаться в разделе «Записи». Дополнительные контактные телефоны должны быть свернуты при открытии карточки; поля, характеризующие информацию по долгам, должны отображаться в зависимости от значения в поле «Тип должника».
На первом этапе реализуем создание поля, подобного полю поиска lookup. Для этого создаем в системе объект «Реестр должников» (new_register_debtors), меняем уровень требований у основного атрибута на значение «Без ограничений». В форме объекта «Реестр должников» создаем новую вкладку «Администрирование». На вкладке «Администрирование» создаем раздел «Данные» и переносим в созданный раздел поле «Владелец».
В созданном объекте создаем два поля типа nvarchar (550): «Должник» (new_debtors), «Должник ссылка» (new_debtors_url). В поле «Должник» будет отображаться название или имя должника (ФИО, в случае если это физическое лицо, и название компании, если должник — организация). В поле «Должник ссылка» будет храниться непосредственно сама ссылка на должника (url должника). Добавляем поле «Должник» на вкладку «Общие» раздела «Общие», а поле «Должник ссылка» на вкладку «Администрирование» раздела «Данные» (экран 1 и экран 2).
Экран 1. Добавление поля «Должник» на вкладку «Общие» раздела «Общие» |
Экран 2. Добавление поля «Должник ссылка» на вкладку «Администрирование» раздела «Данные» |
Далее в форме «Реестра должников» в событии onLoad необходимо написать приведенный ниже код (листинг 1), в котором функция crmForm.create_type_lookup формирует поле, подобное полю lookup по нескольким объектам.
После публикации объекта «Реестр должников» получаем следующий интерфейс для выбора должника (экран 3). После выбора в поле «Должник» значения, в поле «Должник ссылка» подставляется ссылка на выбранного должника (экран 4).
Экран 3. Выбор должника |
Экран 4. Ссылка на выбранного должника |
На втором этапе реализуем фильтрацию выпадающих списков в зависимости от значения в поле. В объекте «Реестр должников» создадим поля:
- «Тип должника» (new_ type_subject) типа picklist со значениями: 1 — долг менее 500 тыс. руб., 2 — долг более 500 тыс. руб.);
- «Стадия дела» (new_stage_debtors) типа picklist со значениями: «1 — Переговоры с должником», «2 — Ожидание погашения долга», «3 — Погашение долга просрочено», «4 — Подготовка дела для суда», «5 — Судебное производство», «6 — Исполнительное производство».
Значение в поле «Стадия дела» зависит от значения в поле «Тип должника». Если в поле «Тип должника» стоит значение «1 — долг менее 500 тыс. руб.», тогда в поле «Стадия дела» должны быть доступны только значения: «1 — Переговоры с должником», «2 — Ожидание погашения долга», «3 — Погашение долга просрочено». А если в поле «Тип должника» стоит значение «2 — Долг более 500 тыс. руб.», тогда в поле «Стадия дела» должны быть доступны только значения: «4 — Подготовка дела для суда», «5 — Судебное производство», «6 — Исполнительное производство».
Далее в форме «Реестра должников» в событии onLoad и событии OnCange поля «Тип должника» (new_type_subject)» необходимо добавить код из листинга 2.
После публикации объекта «Реестр должников» получаем следующую фильтрацию списков (экран 5).
Экран 5. Фильтр действий по должникам |
На третьем этапе реализуем сворачивание раздела на вкладке. В объекте «Реестр должников» создадим следующий набор полей типа nvarchar (50): «Домашний телефон» (new_phone1), «Рабочий телефон» (new_phone2), «Мобильный телефон» (new_phone3), «Телефон супруга/супруги» (new_phone_relative1), «Телефон отца» (new_ phone_relative2), «Телефон матери» (new_phone_relative3), «Телефон сестры» (new_phone_relative4), «Телефон брата» (new_phone_relative5), «Телефон руководителя» (new_phone_work1), «Телефон отдела кадров» (new_phone_work2). В объекте добавим два новых раздела: «Телефоны», «Контакты родственников/коллег». В раздел «Телефоны» добавляем поля: «Домашний телефон», «Рабочий телефон», «Мобильный телефон». А в раздел «Контакты родственников/коллег» добавляем телефоны: «Телефон супруга/супруги» (new_phone_relative1), «Телефон отца» (new_phone_relative2), «Телефон матери» (new_phone_relative3), «Телефон сестры» (new_phone_relative3), «Телефон брата» (new_phone_relative4), «Телефон руководителя» (new_phone_work1), «Телефон отдела кадров» (new_phone_work2).
Раздел «Контакты родственников/коллег» при открытии карточки должника должен быть свернут. При необходимости у пользователя системы должна быть возможность просмотреть информацию, находящуюся в данном разделе. В форме «Реестра должников» в событии onLoad необходимо добавить код из листинга 3. Примечание: {93d727d9-7846-e011-9fb9-00155d0a0b01} — является идентификатором раздела.
После публикации объекта «Реестр должников» получаем следующий интерфейс в карточке «Реестр должников» при ее открытии (экран 6). Если мы нажмем на «плюсик», откроется экран 7.
Экран 6. Свернутая карточка |
Экран 7. Карточка раскрыта |
На четвертом этапе реализуем отображение списка на вкладке объекта. Создаем объект «Просрочки» (new_delays), который связываем с объектом «Реестр должников» в отношении N:1. Создадим в объекте «Просрочки» отношение N:1. В качестве основного объекта выберем объект «Реестр должников». В разделе «Атрибут отношения» в поле «Отображаемое имя» пишем «Реестр должников», а в поле «Имя» пишем «new_register_debtors», в разделе «Элемент области переходов для основного объекта» в поле «Параметры отображения» выберем значение «Использовать имя во множественном числе» (экран 8). Добавляем на форму в объекте «Просрочки» поле «Реестр должников».
Экран 8. Отображение списка на вкладке объекта |
Сделаем так, чтобы список всех просрочек по конкретному должнику отображался в форме должника в отдельном разделе. В форме «Реестра должников» добавляем раздел «Просрочки». В созданный раздел добавляем «Интернет-кадр», в поля «Имя» вводим «IFRAME_delays», в поле «URL-адрес» вводим «about: blank», снимаем галочку «Ограничить использование сценария между кадрами» (экран 9). В событие onLoad добавляем код, представленный в листинге 4.
Экран 9. Добавление кадра |
После публикации объектов «Реестр должников» и «Просрочки» получаем следующий интерфейс в карточке «Реестр должников» (экран 10). Если мы добавим просрочки по данному реестру должников, то карточка реестра будет выглядеть, как показано на экране 11.
Экран 10. Измененная карточка реестра должников |
Экран 11. Просмотр просрочки по данному должнику |
Анастасия Сипко (sakra@bk.ru) — программист, имеет сертификат Microsoft Certified (Technology Specialist)
crmForm.create_type_lookup = function(idField, valueField, lookuptypeIcons, lookuptypenames, lookuptypes) { var tmpid = idField.id; var tmpid_req = idField.req; var tmpid_tabIndex = idField.tabIndex; var tmpid_onchange = idField.onchange; var tmpid_disabled = idField.Disabled; outerHTML = ""; outerHTML += ""; outerHTML += " "; idField.outerHTML = outerHTML; idField = document.getElementById(tmpid); idField.aoUnattachedEvents = new Array(); idField.Disabled = tmpid_disabled; idField.attachEvent('onchange', function() { if (idField.DataValue != null) { var lkp = idField.DataValue; valueField.DataValue = lkp[0].name + "|" + lkp[0].id + "|" + lkp[0].typename; } else { valueField.DataValue = ""; } } ); if (valueField.DataValue != null && valueField.DataValue != "") { var item = valueField.DataValue.split(‘|’); var lookupData = new Array(); var lookupItem= new Object(); lookupItem.id = item[1]; lookupItem.typename = item[2]; lookupItem.name = item[0]; lookupData[0] = lookupItem; idField.DataValue = lookupData; } } lookuptypeIcons = ‘/_imgs/ico_16_1.gif:/_imgs/ico_16_2.gif’; lookuptypenames = ‘account:1,contact:2’; lookuptypes = ‘1,2’; crmForm.create_type_lookup(crmForm.all.new_debtors, crmForm.all.new_debtors_url, lookuptypeIcons, lookuptypenames, lookuptypes);
crmForm.all. new_stage_debtors.DataValue = null; crmForm.all. new_stage_debtors.ForceSubmit = true; var Value = crmForm.all.new_stage_debtors.DataValue; var count = 1000; for (i = 1; i < count; i++) { crmForm.all.new_stage_debtors.DeleteOption(i); } if (crmForm.all. new_type_subject.DataValue != null) { if (crmForm.all.new_type_subject.DataValue == 1) { crmForm.all.new_stage_debtors.AddOption("Переговоры с должником", 1); crmForm.all.new_stage_debtors.AddOption("Ожидание погашения долга", 2); crmForm.all.new_stage_debtors.AddOption("Погашение долга просрочено", 3); } else if (crmForm.all.new_type_subject.DataValue == 2) { crmForm.all.new_stage_debtors.AddOption("Подготовка дела для суда", 4); crmForm.all.new_stage_debtors.AddOption("Исполнительное производство", 5); } crmForm.all.new_stage_debtors.DataValue = Value; }
//сворачивание function OnCrmPageLoad() { ConvertSection("{93d727d9-7846-e011-9fb9-00155d0a0b01}", false); } function ConvertSection(id, state) { var sec = document.getElementById(id); var td = sec.childNodes[1].childNodes[0].childNodes[0]; var secHTML = td.innerHTML; state = (typeof (state) == "undefined") ? false : !state; var src = (state == false) ? "/_imgs/tree/dashPlus.gif" : "/_imgs/tree/dashMinus.gif"; td.innerHTML = "" + td.innerHTML + " "; td.childNodes[0].childNodes[0].state = state; excoSection(td.childNodes[0]); } function excoSection(sec) { sec = sec.childNodes[0]; sec.state = !sec.state; sec.src = (sec.state) ? "/_imgs/tree/dashMinus.gif" : "/_imgs/tree/dashPlus.gif"; var display = (sec.state) ? "inline" : "none"; var tblsec = sec.parentElement.parentElement.parentElement.parentElement; for (var i = 1; i < tblsec.rows.length; i++) tblsec.rows[i].style.display = display; } this.excoSection = excoSection; OnCrmPageLoad();
// IFRAME nav_new_new_register_debtors_new_delays.style.display = "none"; //имя отношения if (crmForm.FormType == 2) {document.all.IFRAME_delays.src = "/" + ORG_UNIQUE_NAME + "/sfa/accts/areas.aspx?oId=" + crmForm.ObjectId + "&oType=" + crmForm.ObjectTypeCode + "&security=852023&tabSet=new_new_register_debtors_new_delays";} else {document.all.IFRAME_delays.src = "about:blank";}