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