На проектах внедрения довольно часто возникает необходимость в использовании реквизита типа "Документ", которого нет в системе. В прикладной части это довольно легко решается использованием функции EDocumentSelect. В данной статье рассмотрим как сделать аналогичный функционал для веб-доступа.
Для определенных видов документов в карточке в табличной части должна быть возможность указать документы, с которыми связан текущий документ и тип связи.
В таблице по щелчку в ячейке Наименование должна открываться карточка связанного документа. По ссылке Добавить под таблицей должен запускаться поиск документов и выбранный документ добавляться в таблицу.
Разработку для десктоп-клиента рассматривать не будем. Разработка под веб выполнена в веб-модуле "Канцелярия" версии 5.4.2.
В документе имеем табличную часть
Форма-карточка:
В функции WA.ready js-файла веб-модуля определим поведение карточки нашего документа:
WA.ready(function () {
var form = WA.CR.form;
switch (WA.getLocation()) {
case "doc":
.....
if (WA.current.CardTypeCode === "TestDocs") {
WA.CR.form.controls.links.AddDocLink.bind('click', function () {
var searchDialog = RecordOffice.TD_searchDocumentDialog();
searchDialog.show();
});
// Сделать недоступной ссылку
if (WA.CR.form.isDisabled()) {
WA.CR.form.controls.links.AddDocLink.disable();
}
// Добавить в таблице кнопки просмотра карточки документа
$(function () {
initBoundDocsTable('BoundDocsGrid', 'StringT6', 'IntNumT6');
});
}
break;
.....
}
});
Функция initBoundDocsTable добавляет кнопки в ячейках для открытия карточки документа:
function initBoundDocsTable(tableName, reqName, idReqName) {
var table = WebAccess.current.form.controls.tables[tableName];
var rows = table.rows.toArray();
$.each(rows, function (i, r) {
var req = r.requisites[reqName];
req.setCustomAction(function (data) {
var docID = r.requisites[idReqName].getValue();
if (docID) {
var link = new WA.Link(docID, OBJECT_TYPE.EDOCUMENT);
link.open();
}
}, "Открыть карточку");
});
}
Функция TD_searchDocumentDialog запускает диалог поиска документов и добавляет выбранный документ в таблицу:
RecordOffice.TD_searchCriteriaForm = function () {
var form = new WA.CMP.forms.FormBuilder('searchAttach')
.addInput('DS_NAME')
.addReferenceSelect('DS_DOCUMENT_KIND', 'ВЭД')
.addDate('DS_DATE_OF_CREATION_START')
.addDate('DS_DATE_OF_CREATION_END')
.addReferenceSelect('DS_MODIFIED_BY', 'ПОЛ')
.addDate('DS_EDIT_DATE_START')
.addDate('DS_EDIT_DATE_END')
.addReferenceSelect('DS_AUTHOR', 'ПОЛ')
.addInput('DS_ID');
return form;
};
RecordOffice.TD_searchDocumentDialog = function () {
var form = RecordOffice.TD_searchCriteriaForm();
var dialog = window.searchDialog = new WA.CMP.dialogs.BaseDialog();
dialog.setHtml(form.render());
dialog.setTitle(L('DOCUMENTS_SEARCH'));
dialog.isShowCancelButton = true;
dialog.okText = L('SEARCH');
dialog.ok = function () {
if (form.isValid() !== true) return false;
var name = $('input#ds_name').val();
var documentKind = $('input#hSelID_ds_document_kind').val();
var creationDateStart = $('input#ds_date_of_creation_start').val();
var creationDateEnd = $('input#ds_date_of_creation_end').val();
var modifiedBy = $('input#hSelID_ds_modified_by').val();
var editDateStart = $('input#ds_edit_date_start').val();
var editDateEnd = $('input#ds_edit_date_end').val();
var author = $('input#hSelID_ds_author').val();
var docId = $('input#ds_id').val();
var ajaxData = {
'Name': name,
'DocumentKind': documentKind,
'CreationStartDate': creationDateStart,
'CreationEndDate': creationDateEnd,
'ModifiedByID': modifiedBy,
'EditDateStart': editDateStart,
'EditDateEnd': editDateEnd,
'AuthorID': author,
'DocumentID': docId
};
WA.SRV.callSync("/RecordOffice.asmx/TD_SearchDocuments", ajaxData).done(function (result) {
if (typeof docSelectDialog === 'object') {
docSelectDialog.html = result.Result;
docSelectDialog.show();
} else {
docSelectDialog(result.Result);
}
initJSinModal(result.ResultJs);
});
};
return dialog;
};
Функция docSelectDialog уже есть в веб-модуле канцелярия, в нее нужно добавить обработку вызова из карточки документа:
....
for (i = 0; i < linkElements.length; i++) {
currentElement = linkElements[i];
currentElement.setAttribute('data-index', i);
//currentElement.dataset.index = i;
currentElement.onclick = function () {
// Получить данные
var data = $("#DocumentsList_data")[0].value;
var index = this.getAttribute('data-index');
//var index = this.dataset.index;
var JSONObject = JSON.parse(data);
WA.SRV.callSync('/RecordOffice.asmx/BindDocuments', { SourceDocId: WA.current.getID(), BindedDocId: JSONObject[index].ID })
.fail(function (message) {
WA.CR.inlineHint.showError(message);
});
$('.ui-dialog-buttonset')[0].childNodes[0].click();
/* Поиск вызывается из карточки документа и выбранный документ нужно добавить в таблицу*/
if (WA.current.getKind() === "EDOC")
if (WA.current.CardTypeCode === "TestDocs") {
var reqs = {};
reqs = { "StringT6": { value: JSONObject[index].Name, displayValue: JSONObject[index].Name, 'needTriggerResult': 'false' }, "IntNumT6": { value: JSONObject[index].ID, displayValue: JSONObject[index].ID, 'needTriggerResult': 'true' } };
WA.CR.form.controls.tables['BoundDocsGrid'].addRow(reqs, null, true);
setTimeout(function () {
initBoundDocsTable('BoundDocsGrid', 'StringT6', 'IntNumT6');
}, 100);
}
/* Поиск вызывается из карточки документа и выбранный документ нужно добавить в таблицу*/
};
}
....
И новый веб-метод TD_SearchDocuments, который является копией метода SearchDocuments с добавленным критерием поиска по виду документа:
<WebMethod()>
Public Function TD_SearchDocuments(ByVal Name As String, ByVal DocumentKind As String, ByVal CreationStartDate As String, ByVal CreationEndDate As String,
ByVal ModifiedByID As String, ByVal EditDateStart As String, ByVal EditDateEnd As String, ByVal AuthorID As String, ByVal DocumentID As String) As WebServiceResponse(Of EdocumentResponse)
Dim Filter As String = String.Empty
Dim ResHTML As String = Nothing
Dim ResJS As String = Nothing
Dim Res As New EdocumentResponse
Dim Search = WebSession.Context.Searches.Search("EDOCUMENT_SEARCH")
If Not String.IsNullOrEmpty(Name) Then
Search.Criterions(Constants.REQ_EDOC_NAME).SetValue(Name)
End If
If Not String.IsNullOrEmpty(DocumentKind) Then
Dim ID As Integer = 0
If Integer.TryParse(DocumentKind, ID) Then
Search.Criterions("ISBEDocKind").SetReferenceValue(ID)
End If
End If
If Not String.IsNullOrEmpty(CreationStartDate) Then
Dim CreationDate As New DateTime
If NpoComputer.WebAccess.Management.Utils.DateTimeTryParse(CreationStartDate, CreationDate) Then
Search.Criterions("ISBEDocCreateDate").SetOnlyDateBeginOfRange(CreationDate)
End If
End If
If Not String.IsNullOrEmpty(CreationEndDate) Then
Dim CreationDate As New DateTime
If NpoComputer.WebAccess.Management.Utils.DateTimeTryParse(CreationEndDate, CreationDate) Then
Search.Criterions("ISBEDocCreateDate").SetOnlyDateEndOfRange(CreationDate)
End If
End If
If Not String.IsNullOrEmpty(ModifiedByID) Then
Dim ID As Integer
If Integer.TryParse(ModifiedByID, ID) Then
Search.Criterions("PseudoModifier").SetReferenceValue(ModifiedByID)
End If
End If
If Not String.IsNullOrEmpty(EditDateStart) Then
Dim EditDate As New DateTime
If NpoComputer.WebAccess.Management.Utils.DateTimeTryParse(EditDateStart, EditDate) Then
Search.Criterions("PseudoModified").SetOnlyDateBeginOfRange(EditDate)
End If
End If
If Not String.IsNullOrEmpty(EditDateEnd) Then
Dim EditDate As New DateTime
If NpoComputer.WebAccess.Management.Utils.DateTimeTryParse(EditDateEnd, EditDate) Then
Search.Criterions("PseudoModified").SetOnlyDateBeginOfRange(EditDate)
End If
End If
If Not String.IsNullOrEmpty(AuthorID) Then
Dim ID As Integer = 0
If Integer.TryParse(AuthorID, ID) Then
Search.Criterions("ISBEDocAuthor").SetReferenceValue(ID)
End If
End If
If Not String.IsNullOrEmpty(DocumentID) Then
Dim ID As Integer = 0
If Integer.TryParse(DocumentID, ID) Then
Search.Criterions(Constants.REQ_ID).SetValue(ID)
End If
End If
Dim EdocResult = Search.Execute(Nothing)
If EdocResult IsNot Nothing AndAlso EdocResult.Count > 0 Then
'Вернуть модальное окно
Res.ResultType = "OneEdoc"
Dim Control As New CreateControlToShowDocumentsList
Dim DocsList As New List(Of BaseDataObject)
For Each DocID In EdocResult
DocsList.Add(DocID)
Next
Control.ListObjects = DocsList
ResHTML = NpoComputer.WebAccess.Management.Utils.RenderControlWithScripts(Control, ResJS)
Res.Result = ResHTML
Res.ResultJs = ResJS
Else
'Вернуть пустую строку, так как документов нет
Res.ResultType = "Empty"
Res.Result = ""
End If
Return WebServiceResponse(Of EdocumentResponse).OK(Res)
End Function
В таблице в ячейках появилась кнопка, по которой в новой вкладке открывается карточка документа.
По ссылке Добавить появляется окно запроса критериев поиска и результаты поиска:
Добрый день, Анастасия. Каким образом можно посмотреть исходный код метода веб-сервиса SearchDocuments?
Будет ли работать Ваш пример на версии 5.3.1?
Создал новый проект С#. Добавил там новый метод веб-сервиса по Вашему примеру.
Но когда пытаюсь заполнить свойство ListObjects у объект CreateControlToShowDocumentsList
Получаю ошибку 'DIRECTUM.WebAccess.Extensions.RecordOffice.CreateControlToShowDocumentsList' does not contain a definition for 'ListObjects' and no extension method 'ListObjects' accepting a first argument of type 'DIRECTUM.WebAccess.Extensions.RecordOffice.CreateControlToShowDocumentsList' could be found (are you missing a using directive or an assembly reference?)
Декомпилировав сборку DIRECTUM.WebAccess.Extensions.RecordOffice.dll выясняется, что свойство ListObjects имеет модификатор доступа internal, т.е. использовать это свойство в своем проекте у меня не получится.
Расскажите, пожалуйста, каким образом Вы добавили новый метод
Возможно я иду совсем не той дорогой?
Разобрался. Можно не отвечать на вопросы)
Просто в своем проекте создал похожий объект и уже его использую.
Авторизуйтесь, чтобы написать комментарий