Пример реализации табличной части с документами в веб-доступе

22 3

На проектах внедрения довольно часто возникает необходимость в использовании реквизита типа "Документ", которого нет в системе. В прикладной части это довольно легко решается использованием функции 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, т.е. использовать это свойство в своем проекте у меня не получится.

Расскажите, пожалуйста, каким образом Вы добавили новый метод 

TD_SearchDocuments

Возможно я иду совсем не той дорогой? 

Антон Посаженков

Разобрался. Можно не отвечать на вопросы)

Просто в своем проекте создал похожий объект и уже его использую.

Авторизуйтесь, чтобы написать комментарий