Дерево страниц

Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.
details
Информация
Статус СтатусcolourGreen
iconfalse
title
ГОТОВОАвторКомментарий
панель

На этой странице:

Оглавление

Постановка задачи

Разработать представление для отображения документов, в котором будет присутствовать фильтрация, сортировка по колонкам.

Подсказка
Image Removed
icon
Image RemovedImage Removed
false

Инструмент

: Палитра XML

Свойства страницы
Статус

Статус
colour

Реализация

Создание основы

В основу входит:

  • Написание SQL-запроса (Кастомная коллекция)
  • Описание метаданных (Кастомная коллекция)
  • Описание колонок (Тип элемента коллекции)
  • Связь колонок с данными SQL-запроса (Дескриптор)
  • Связь навигационной панели на полученную таблицу (Представление)

    Green
    titleГОТОВО

    РазделПредставления
    Комментарий

    панель
    titleРеализация

    Оглавление

    панель
    titleРезультат

    Image Added

    Image Added

    Image Added



    Создание представления

    SQL-запрос

    Примечание

    Список обязательных колонок, если по записи нужно потом получить объект (документ, заявку, справочник и т.д.): id, created_date, updated_date, Module, self_1, self_2, self_3.

    Получение данных:

    1. Системные поля прописаны в таблицах и их можно найти в разделе 4.1. Схема данных AF5/CM6.
    2. Настраиваемые поля хранятся в таблицах tn_field и tn_field_<тип данных> (string, date, datetime, decimal и т.д.)

      Блок кода
      languagesql
      titleЗапрос на получение значения из настаиваемого поля status
      linenumberstrue
      collapsetrue
      select tfs."value" as v
              from tn_field
              join tn_field_string tfs on tn_field.access_object_id = tfs.id
              where tn_field."owner" = rkkbase.id
              and tn_field.owner_type = rkkbase.id_type
              and tn_field.cmjfield = 'status') as statusWPRequest
    3. Поля из комплексного справочника хранятся в таблицах classifier_compleх, clscom_tag, cls_typeComp

      Блок кода
      languagesql
      titleЗапрос на получение значения из поля valueCountry комплексного справочника Офис (схема ComplectClassifierOffice)
      linenumberstrue
      collapsetrue
      SELECT title FROM classifier_complex WHERE classifier_complex.id = (
      					SELECT
      						complex1.id
      						FROM
      							clscom_tag tag1
      					left join clscom_to_tag to_tag1 on to_tag1.tag = tag1.id
      					left join classifier_complex complex1 on complex1.id = to_tag1.classifier
      					left join cls_typeComp typecom1 on typecom1.id = complex1.owner
      							WHERE (
      								tag1.schema = 'ComplectClassifierOffice' and typecom1.alias = 'valueCountry' and tag1.id = tag.id
      								))
      								) as OfficeCountry

    Кастомная коллекция

    Кастомная коллекция представляет собой набор 2-х файлов:

    Блок кода
    languagexml
    titleXML коллекции. Описывается SQL-запрос, кол-во возвращаемых записей, фильтрация, поиск
    linenumberstrue
    collapsetrue
    <collection name="WorkplaceRequests_(vw_cmj_all)" idField="id" replace="runtime">
        <prototype>
            <![CDATA[
                     SELECT
                      id,
                      created_date,
                      updated_date,
                      Module,
                      self_1,
                      self_2,
                      self_3,
                      typeRequest,
    				  statusWPRequest,
    				  stage,
                      regNumber,
                      rNumber,
                      numberWOTags,
    				  wpInitiator,
    				  term,
                      finishtime,
                      wpEmployee,
                      wpEmpDepartment,
                      wpEmpHierDepatment,
                      wpEmpGoingToWork,
                      wpMovingDate,
                      wpInitBranch,
                      wpOffice,
                      wpTypeOffice,
                      wpInitOrganization,
                      wpInitiatorDepartment,
                      wpLocality,
                      wpCountry,
                      wpArea,
                      wpFloor,
                      wpRoomNumber,
                      wpCode
                    FROM (
                           select
    	rkkbase.id,
        rkkbase.created_date,
        rkkbase.updated_date,
        rkkbase.module                                   AS Module,
        '<id>'                                           AS self_1,
        ':'                                              AS self_2,
        '</>'                                            AS self_3,
        rkkbase."type"                                   AS typeRequest,
        (select tfs."value" as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'status') as statusWPRequest,
        (select tfs."value" as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'stage') as stage,
       '<regNumberPrefix>' || coalesce(rkk.prjnumprist, '') || '</>' || '<regNumberCounter#Number>' || coalesce(cast(rkk.prjnumcounter as varchar), '') || '</>' || '<regNumberSuffix>' || coalesce(rkk.prjnumfin , '') || '</>' as regNumber,
       rkk.prjnumcounter as rNumber,
       coalesce(rkk.prjnumprist, '') || coalesce(cast(rkk.prjnumcounter as VARCHAR), '') || coalesce(rkk.prjnumfin, '') as numberWOTags,
    	(select
    		coalesce('<id>' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'%(.*)')
        	|| ':' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'(.*)%') || '</><shortName>'
        	|| substr(tfs."value", 1, strpos(tfs."value", '%') - 1) || '</>', '<id></><shortName></>') as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpInitiator') as wpInitiator,
    	(select tfs."value" as v
            from tn_field
            join tn_field_datetime tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'plannedfinishtime') as term,
    	(select tfs."value" as v
            from tn_field
            join tn_field_datetime tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'finishtime') as finishtime,
    	(select tfs."value" as v
            from tn_field
            join tn_field_beard tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'assignee') as assignee,
    	(select
    		coalesce('<id>' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'%(.*)')
        	|| ':' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'(.*)%') || '</><shortName>'
        	|| substr(tfs."value", 1, strpos(tfs."value", '%') - 1) || '</>', '<id></><shortName></>') as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
             and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpEmployee') as wpEmployee,
        (select date(tfs."value") as v
            from tn_field
            join tn_field_dateonly tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpEmpGoingToWork') as wpEmpGoingToWork,
        (select date(tfs."value") as v
            from tn_field
            join tn_field_dateonly tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpMovingDate') as wpMovingDate,
    	(select
    		coalesce('<id>' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'%(.*)')
        	|| ':' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'(.*)%') || '</><shortName>'
        	|| substr(tfs."value", 1, strpos(tfs."value", '%') - 1) || '</>', '<id></><shortName></>') as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpEmpDepartment') as wpEmpDepartment,
        (select
    		tfs."value"  as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpEmpHierDepatment') as wpEmpHierDepatment,
    	(select
    		coalesce('<id>' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'%(.*)')
        	|| ':' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'(.*)%') || '</><shortName>'
        	|| substr(tfs."value", 1, strpos(tfs."value", '%') - 1) || '</>', '<id></><shortName></>') as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpInitBranch') as wpInitBranch,
    	(select tfs."value" as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpOffice') as wpOffice,
    	(select tfs."value" as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpTypeOffice') as wpTypeOffice,
    	(select
    	    coalesce('<id>' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'%(.*)')
        	|| ':' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'(.*)%') || '</><shortName>'
        	|| substr(tfs."value", 1, strpos(tfs."value", '%') - 1) || '</>', '<id></><shortName></>') as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpInitOrganization') as wpInitOrganization,
    	(select
    		coalesce('<id>' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'%(.*)')
        	|| ':' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'(.*)%') || '</><shortName>'
        	|| substr(tfs."value", 1, strpos(tfs."value", '%') - 1) || '</>', '<id></><shortName></>') as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpInitDepartment') as wpInitiatorDepartment,
    	(select tfs."value" as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpLocality') as wpLocality,
    	(select tfs."value" as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpCountry') as wpCountry,
    	(select
    	    coalesce('<id>' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'%(.*)')
        	|| ':' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'(.*)%') || '</><shortName>'
        	|| substr(tfs."value", 1, strpos(tfs."value", '%') - 1) || '</>', '<id></><shortName></>') as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpArea') as wpArea,
    	(select tfs."value" as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpFloor') as wpFloor,
    	(select tfs."value" as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpRoomNumber') as wpRoomNumber,
    	(select tfs."value" as v
            from tn_field
            join tn_field_string tfs on tn_field.access_object_id = tfs.id
            where tn_field."owner" = rkkbase.id
            and tn_field.owner_type = rkkbase.id_type
            and tn_field.cmjfield = 'wpRMCode') as wpCode
    	FROM F_DP_Intrkk internalrkk
                      JOIN f_dp_rkk rkk ON rkk.id = internalrkk.id
                      JOIN f_dp_rkkbase rkkbase ON rkkbase.id = rkk.id
                      JOIN F_DP_Intrkk_Executor executor ON executor.owner = internalrkk.id
                      JOIN so_beard beard ON beard.id = executor.executor
             WHERE rkkbase.isdeleted <> 1
               AND rkk.regnumcnt IS NULL
    		   ) s
                    WHERE stage NOT IN ('Перемещена в архив')
                    AND 1 = 1
                        ::where-clause
                ]]>
        </prototype>
        <counting-prototype>
            <![CDATA[
                SELECT
    				COUNT(1)
    			FROM (
    				SELECT
    					rkkbase.id
    				FROM F_DP_Intrkk internalrkk
                      JOIN f_dp_rkk rkk ON rkk.id = internalrkk.id
                      JOIN f_dp_rkkbase rkkbase ON rkkbase.id = rkk.id
                      JOIN F_DP_Intrkk_Executor executor ON executor.owner = internalrkk.id
                      JOIN so_beard beard ON beard.id = executor.executor
    				WHERE rkkbase.isdeleted <> 1 AND rkk.regnumcnt IS NULL
    			) s
    			WHERE stage NOT IN ('Перемещена в архив')
                    AND 1 = 1
                ::where-clause
                ]]>
        </counting-prototype>
        <filter name="MODULE">
            <criteria placeholder="where-clause">
                <![CDATA[
                        Module = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="self">
            <criteria placeholder="where-clause"><![CDATA[ Module = {0} and id = {1} ]]></criteria>
        </filter>
        <filter name="created_date">
            <criteria placeholder="where-clause">
                <![CDATA[
                       cast(created_date as date) = cast({0} as date)
                    ]]>
            </criteria>
        </filter>
        <filter name="rNumber">
            <criteria placeholder="where-clause"><![CDATA[ rNumber = {0} ]]></criteria>
        </filter>
        <filter name="rNumber_partial">
            <criteria placeholder="where-clause"><![CDATA[ rNumber iLIKE ('%'||{0}||'%') ]]></criteria>
        </filter>
        <filter name="rNumber_L">
            <criteria placeholder="where-clause"><![CDATA[ rNumber < {0} ]]></criteria>
        </filter>
        <filter name="rNumber_GE">
            <criteria placeholder="where-clause"><![CDATA[ rNumber >= {0} ]]></criteria>
        </filter>
        <filter name="rNumber_Partial">
            <criteria placeholder="where-clause"><![CDATA[ rNumber LIKE {0} ]]></criteria>
        </filter>
        <filter name="regNumber">
            <criteria placeholder="where-clause"><![CDATA[ regNumber = {0} ]]></criteria>
        </filter>
        <filter name="regNumber_partial">
            <criteria placeholder="where-clause"><![CDATA[ numberWOTags iLIKE ('%'||{0}||'%') ]]></criteria>
        </filter>
        <filter name="typeRequest">
            <criteria placeholder="where-clause">
                <![CDATA[
                        typeRequest = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="typeRequest_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                    typeRequest ilike '%'||{0}||'%'
                ]]>
            </criteria>
        </filter>
        <filter name="wpInitiator">
            <criteria placeholder="where-clause">
                <![CDATA[
                        wpInitiator = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="wpInitiator_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                    wpInitiator ilike '%'||{0}||'%'
                ]]>
            </criteria>
        </filter>
        <filter name="stage">
            <criteria placeholder="where-clause">
                <![CDATA[
                        stage = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="stage_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                    stage ilike '%'||{0}||'%'
                ]]>
            </criteria>
        </filter>
        <filter name="statusWPRequest">
            <criteria placeholder="where-clause">
                <![CDATA[
                        wpStatus = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="statusWPRequest_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                    statusWPRequest ilike '%'||{0}||'%'
                ]]>
            </criteria>
        </filter>
        <filter name="term_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                      cast(term as date) = cast({0} as date)
                ]]>
            </criteria>
        </filter>
        <filter name="finishtime_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                     cast(finishtime as date) = cast({0} as date)
                ]]>
            </criteria>
        </filter>
        <filter name="wpEmpGoingToWork_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                      cast(wpEmpGoingToWork as date) = cast({0} as date)
                ]]>
            </criteria>
        </filter>
        <filter name="wpMovingDate">
            <criteria placeholder="where-clause">
                <![CDATA[
                        (wpMovingDate >= ({0})::timestamp and
    					 wpMovingDate < (({0})::timestamp + interval '1 day'))
                    ]]>
            </criteria>
        </filter>
        <filter name="assignee">
            <criteria placeholder="where-clause">
                <![CDATA[
                        assignee = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="assignee_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                    assignee ilike '%'||{0}||'%'
                ]]>
            </criteria>
        </filter>
        <filter name="wpEmployee">
            <criteria placeholder="where-clause">
                <![CDATA[
                        wpEmployee = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="wpEmployee_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                    wpEmployee ilike '%'||{0}||'%'
                ]]>
            </criteria>
        </filter>
        <filter name="wpEmpDepartment">
            <criteria placeholder="where-clause">
                <![CDATA[
                        wpEmpDepartment = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="wpEmpDepartment_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                    wpEmpDepartment ilike '%'||{0}||'%'
                ]]>
            </criteria>
        </filter>
        <filter name="wpInitBranch">
            <criteria placeholder="where-clause">
                <![CDATA[
                        wpInitBranch = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="wpInitBranch_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                    wpInitBranch ilike '%'||{0}||'%'
                ]]>
            </criteria>
        </filter>
        <filter name="wpInitiatorDepartment">
            <criteria placeholder="where-clause">
                <![CDATA[
                        wpInitiatorDepartment = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="wpInitiatorDepartment_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                    wpInitiatorDepartment ilike '%'||{0}||'%'
                ]]>
            </criteria>
        </filter>
        <filter name="wpLocality">
            <criteria placeholder="where-clause">
                <![CDATA[
                        wpLocality = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="wpLocality_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                    wpLocality ilike '%'||{0}||'%'
                ]]>
            </criteria>
        </filter>
        <filter name="wpCountry">
            <criteria placeholder="where-clause">
                <![CDATA[
                        wpCountry = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="wpCountry_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                    wpCountry ilike '%'||{0}||'%'
                ]]>
            </criteria>
        </filter>
        <filter name="wpArea">
            <criteria placeholder="where-clause">
                <![CDATA[
                        wpArea = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="wpArea_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                    wpArea ilike '%'||{0}||'%'
                ]]>
            </criteria>
        </filter>
        <filter name="wpFloor">
            <criteria placeholder="where-clause">
                <![CDATA[
                        wpFloor = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="wpRoomNumber">
            <criteria placeholder="where-clause">
                <![CDATA[
                        wpRoomNumber = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="wpCode">
            <criteria placeholder="where-clause">
                <![CDATA[
                        wpCode = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="wpEmpHierDepatment">
            <criteria placeholder="where-clause">
                <![CDATA[
                        wpEmpHierDepatment = {0}
                    ]]>
            </criteria>
        </filter>
        <filter name="wpEmpHierDepatment_partial">
            <criteria placeholder="where-clause">
                <![CDATA[
                    wpEmpHierDepatment ilike '%'||{0}||'%'
                ]]>
            </criteria>
        </filter>
        <filter name="BeforeDate">
            <criteria placeholder="where-clause">
                <![CDATA[
                    updated_date < {0}
                ]]>
            </criteria>
        </filter>
    </collection> 
    Блок кода
    languagexml
    titleXML метаданных коллекции. Описывается сортировка по умолчанию, категоризация, специфичные колонки
    linenumberstrue
    collapsetrue
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:p="http://www.springframework.org/schema/p" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd" default-lazy-init="true">
    
    	<bean id="WorkplaceRequests_(vw_cmj_all)Metadata"
              class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.CollectionMetadataNew" p:caseSensitiveFieldNames="true">
              <constructor-arg>
                <list value-type="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field">
                    <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field" p:name="self">
                        <property name="virtualField">
                            <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.BuildVirtualField">
                                 <property name="realFields">
                                     <list>
                                        <value>self_1</value>
                                    	<value>Module</value>
                                        <value>self_2</value>
                                        <value>ID</value>
                                        <value>created_date</value>
                                        <value>self_3</value>
                                      </list>
                                 </property>
    							 <property name="pattern" value="<id>([0-9]{16}):([0-9A-F]{32})</>" />
                                 <property name="separator" value=""/>
                                 <property name="emptySeparator" value="true"/>
    	                    </bean>
                        </property>
                    </bean>         
                </list>
            </constructor-arg>        
        </bean>
    </beans>
    Примечание

    Названия корневого bean должно строиться из названия collection и префикса Metadata. Пример: WorkplaceRequests_(vw_cmj_all)Metadata


    Тип элемента коллекции

    Описывает тип колонки и её название

    Идентификатор колонки должен совпадать с названием колонки, возвращаемой в SQL-запросе кастомной коллекции.

    Блок кода
    languagexml
    titleПример. Типов элемента
    linenumberstrue
    collapsetrue
    <?xml version='1.0' encoding='UTF-8'?>
    <catalog xmlns="http://www.intertrust.ru/schema/palette/cat-ui">
      <column name="finishtime" subject="${catalog.column.finishtime.subject:Дата исполнения}" extends="datetime">
        <meta>
          <documentation>Фактический срок исполнения</documentation>
        </meta>
      </column>
      <column name="NumberWPRequest" subject="${catalog.column.NumberWPRequest.subject:Номер}" extends="string">
        <meta>
          <documentation>Номер</documentation>
        </meta>
      </column>
      <column name="NumberWPRequestOneline" subject="${catalog.column.NumberWPRequestOneline.subject:Номер заявки}" extends="string">
        <meta>
          <documentation>Номер заявки</documentation>
        </meta>
      </column>
      <column name="statusWPRequest" subject="${catalog.column.statusWPRequest.subject:Статус документа}" extends="string">
        <meta>
          <documentation>Статус</documentation>
        </meta>
      </column>
      <column name="term" subject="${catalog.column.term.subject:Срок исполнения по регламенту}" extends="datetime">
        <meta>
          <documentation>Срок исполнения по регламенту</documentation>
        </meta>
      </column>
      <complex-column name="wpEmpDepartment" subject="${catalog.column.wpEmpDepartment.subject:СП Работника по заявке}" extends="vcard">
        <meta>
          <documentation>СП Работника по заявке</documentation>
        </meta>
        <column-ref ref="shortName"/>
        <column-ref ref="id"/>
        <column-ref ref="hint"/>
      </complex-column>
      <complex-column name="wpEmployee" subject="${catalog.column.wpEmployee.subject:Работник по заявке}" extends="vcard">
        <meta>
          <documentation>Работник по заявке</documentation>
        </meta>
        <column-ref ref="shortName"/>
        <column-ref ref="id"/>
        <column-ref ref="hint"/>
      </complex-column>
      <complex-column name="wpInitBranch" subject="${catalog.column.wpInitBranch.subject:Филиал/ ГО}" extends="vcard">
        <meta>
          <documentation>Филиал/ ГО</documentation>
        </meta>
        <column-ref ref="shortName"/>
        <column-ref ref="id"/>
        <column-ref ref="hint"/>
      </complex-column>
      <complex-column name="wpInitiatorDepartment" subject="${catalog.column.wpInitiatorDepartment.subject:СП инициатора}" extends="vcard">
        <meta>
          <documentation>СП инициатора</documentation>
        </meta>
        <column-ref ref="shortName"/>
        <column-ref ref="id"/>
        <column-ref ref="hint"/>
      </complex-column>
      <complex-column name="wpInitOrganization" subject="${wp.Organization:Организация}" extends="vcard">
        <meta>
          <documentation>Организация</documentation>
        </meta>
        <column-ref ref="shortName"/>
        <column-ref ref="id"/>
        <column-ref ref="hint"/>
      </complex-column>
      <complex-column name="wpArea" subject="${wp.Area:Зона СП}" extends="vcard">
        <meta>
          <documentation>Зона СП</documentation>
        </meta>
        <column-ref ref="shortName"/>
        <column-ref ref="id"/>
        <column-ref ref="hint"/>
      </complex-column>
      <complex-column name="wpInitiator" subject="${wp.Inititator:Инициатор}" extends="vcard">
        <meta>
          <documentation>Инициатор</documentation>
        </meta>
        <column-ref ref="shortName"/>
        <column-ref ref="id"/>
        <column-ref ref="hint"/>
      </complex-column>
      <column name="wpOffice" subject="${wp.Office:Офис}" extends="string"/>
      <column name="wpTypeOffice" subject="${wp.TypeOffice:Тип офиса}" extends="string"/>
      <column name="wpLocality" subject="${wp.Locality:Город}" extends="string"/>
      <column name="wpCountry" subject="${wp.Country:Страна}" extends="string"/>
      <column name="wpFloor" subject="${wp.Floor:Этаж}" extends="string"/>
      <column name="wpRoomNumber" subject="${wp.RoomNumber:Номер кабинета}" extends="string"/>
      <column name="wpCode" subject="${wp.Code:Код РМ}" extends="string"/>
      <column name="wpEmpGoingToWork" subject="${wp.GoingToWork:Дата выхода}" extends="datetime"/>
      <column name="wpMovingDate" subject="${wp.wpMovingDate:Дата переезда}" extends="datetime"/>
      <column name="wpEmpHierDepatment" subject="${wp.wpEmpHierDepatment:Подразделение}" extends="string"/>
    </catalog>


    Дескриптор

    Дескриптор решает следующие задачи:

    1. Связывает колонки с табличными данными
    2. Управляет колонками: категоризация, сортировка, фильтрация, скрытие, важность и т.д.
    3. Определяет по какому алгоритму будут отображаться данные в Web-клиенте, с помощью builder
    4. Связывает с модулем
    5. Подключает кастомные кнопки
    Блок кода
    languagexml
    titleПример. Дескриптора
    linenumberstrue
    collapsetrue
    <?xml version='1.0' encoding='UTF-8'?>
    <catalog xmlns="http://www.intertrust.ru/schema/palette/cat-ui">
      <custom-descriptor ident="WorkplaceRequests" view="WorkplaceRequests_(vw_cmj_all)" id="wp-request-all-docs-af5" name="Заявки на организацию РМ - Все" style="default">
        <builder name="ru.intertrust.cm_sochi.srv.uicollections.UiBuilder">
          <config>
            <view-complex-classif level-select="all"/>
          </config>
        </builder>
        <table>
          <columns>
            <column-ref ref="self" important="true"/>
            <column-ref ref="created_date" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
            <column-ref ref="typeRequest" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
            <column-ref ref="regNumber" sort-asc="true" sort-desc="true" filter="true"/>
            <column-ref ref="wpInitBranch" sort-asc="true" sort-desc="true" important="true" filter="true"/>
            <column-ref ref="wpInitiator" sort-asc="true" sort-desc="true" important="true" filter="true"/>
            <column-ref ref="wpInitiatorDepartment" sort-asc="true" sort-desc="true" important="true" filter="true"/>
            <column-ref ref="wpEmployee" sort-asc="true" sort-desc="true" important="true" filter="true"/>
            <column-ref ref="wpEmpDepartment" sort-asc="true" sort-desc="true" important="true" filter="true"/>
            <column-ref ref="wpEmpHierDepatment" sort-desc="true" sort-asc="true" filter="true" invisible-default="true"/>
            <column-ref ref="stage" sort-asc="true" sort-desc="true" important="true" filter="true"/>
            <column-ref ref="statusWPRequest" filter="true" sort-asc="true" sort-desc="true" important="true"/>
            <column-ref ref="term" sort-asc="true" sort-desc="true" important="true" filter="true"/>
            <column-ref ref="finishtime" sort-asc="true" sort-desc="true" important="true" filter="true"/>
            <column-ref ref="wpArea" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
            <column-ref ref="wpCode" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
            <column-ref ref="wpCountry" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
            <column-ref ref="wpInitOrganization"  sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
            <column-ref ref="wpFloor" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
            <column-ref ref="wpLocality" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
            <column-ref ref="wpRoomNumber" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
            <column-ref ref="wpTypeOffice" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
            <column-ref ref="wpOffice" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
            <column-ref ref="wpEmpGoingToWork" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
            <column-ref ref="wpMovingDate" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
          </columns>
        </table>
        <custom-actions schema-ref="RkkReadersCollection"/>
      </custom-descriptor>
    </catalog>


    Представление

    Представление связывает дескриптор с навигационной панелью.

    Блок кода
    languagexml
    titleПример. Представления
    linenumberstrue
    collapsetrue
      <view parent-ref="request" id="workplace-requests" name="${catalog.view.workplace_requests.name:Заявки на ОРМ}" position="10">
        <pagename name="Заявки на ОРМ"/>
        <descriptor-ref ref="wp-request-all-docs-af5"/>
        <source>
          <module ident="WorkplaceRequests"/>
        </source>
      </view>

    Инструменты отладки

    Кастомные коллекции

    Отлаживать кастомные коллекции можно через Управление конфигурациями. Данный раздел находится в админ-клиенте AF5 в Структуре Системы.

    С помощью фильтров ищется нужная коллекция, открывается на редактирование, на вкладку Черновик вносится код xml-коллекции, сохраняется.

    Далее выделяется данная коллекция и нажимается кнопка "Применить черновик"

    Изменения применяются без dropcache

    Дескрипторы и представления

    Дескрипторы и представления отлаживать удобнее, через заливу Палитры XML, но возможность сделать через админку AF5 есть.

    Нужно перейти в раздел Структура системы\Каталог\Папки и Структура системы\Каталог\Дескрипторы