. В данной статье будет описано, как с помощью 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)

Листинг 1. Формирование поля lookup по нескольким объектам
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 +=    "";
outerHTML +=       "";
outerHTML +=        "";
outerHTML +=            "";
outerHTML +=        "";
outerHTML +=    "
"; outerHTML +=        "
"; outerHTML +=        ""; outerHTML +=                ""; outerHTML +=            "
"; outerHTML +=             "";   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);
Листинг 2. Код для фильтра по должникам
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;
}
Листинг 3. Код сворачивания карточки
//сворачивание
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();
Листинг 4. Код списка всех просрочек по конкретному должнику
// 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";}