Содержание

Подробное описание секции наборов строк

lss | Декларативное описание экранной формы

Введение

Наборы строк содержат отображаемые экранной формы данные. Эти данные отображаются в визуальных элементах экранного интерфейса - панелях. Именно наборы строк манипулируют данными на клиенте - отвечают за правку данных и взаимодействие с сервером. Используемые в экранной форме наборы строк должны быть объявлены в секции rowsets.

Тут есть хитрость: у набора строк на стороне сервера есть контроллер. Этот контроллер умеет возвращать описание своего набора строк по запросу definition. А описания в секции rowsets позволяют подстроить типовое унифицированное описание набора строк под нужды конкретной экранной формы.

Родительский и дочерние наборы строк

На уровне экранной формы наборы строк можно выстроить в иерархию: родительский - дочерний. При смене текущей строки в родительском наборе строк его дочерние наборы строк автоматически перечитываются. Задача программиста описать в дочерних наборах строк фильтры так, что бы после перечитки содержимое дочернего набора строк соответствовало текущей строке родительского набора строк.

Пример:

<rowsets>

  <rowset name="document">
    <rowsets>
      <rowset name="item">
        <param name="filter.documentid" js_value="get('document.id')"/>
      </rowset>
    </rowsets>
  </rowset>
  
</rowsets>

В этом примере описаны 2 набора строк: document и item. Их подробное описание в секции rowsets отсутствует, так как размещенные на сервере контроллеры наборов строк вернут экранной форме их унифицированные описания, по запросу definition.

Набор строк document объявлен родительским. Набор строк item для него описан как дочерний. Предполагается, что на сервере контроллер набора строк item понимает параметр filter.documnentid и воспринимает его как фильтр - возвращает только строки, относящиеся к заданному значению documentid. Соответственно, при смене текущей строки в наборе строк document автоматически произойдет перечитка дочернего к нему набора строк item. А благодаря правильно настроенному фильтру - параметру filter.documentid перечитка вернет только данные, относящиеся к текущей строке набора строк document.

Этот пример можно записать компактнее:

<rowsets>

  <rowset name="document">
    <rowset name="item">
      <param name="filter.documentid" js_value="get('document.id')"/>
    </rowset>
  </rowset>
  
</rowsets>

Набор строк фильтра

Есть типовая задача - экранная форма должна отображать не все данные, а только интересующую пользователя часть, причем пользователь может задавать фильтруемые значения. Для хранения и правки данных фильтра в LSS используется специальный набор строк - фильтр. Он задается параметром filter=«1».

У этого набора строк есть несколько особенностей:

Пример:

<rowsets>

  <rowset name="filter" filter="1">
    <fields>
      <field name="doctypeid" type="ref" caption="Тип документа" default="25">
        <ref datasource="doctype"/>
      </field>
      <field name="doctype_name" refid="doctypeid" caption="Тип документа" default="Наряд на проведение работ"/>
      <field name="ndoc" caption="Номер документа" type="string" len="15"/>
      <field name="ddoc" caption="Дата документа" type="date"/>
    </fields>
    <rowset name="document">
      <param name="filter.doctypeid" js_value="get('filter.doctypeid')" skipempty="1"/>
      <param name="filter.ndoc" js_value="get('filter.ndoc')" skipempty="1"/>
      <param name="filter.ddoc" js_value="get('filter.ddoc')" skipempty="1"/>

      <rowset name="item">
        <param name="filter.documentid" js_value="get('document.id')"/>
      </rowset>
    </rowset>
  </rowset>
  
</rowsets>

В этом примере набор строк с именем filter объявлен как фильтр посредством атрибута filter=«1». В секции fields описаны его поля. У полей doctypeid и doctype_name с помощью атрибута default заданы начальные значения.

Набор строк document описан как дочерний к нему. Каждое изменение пользователем значения поля набора строк фильтра автоматически вызовет перечитку дочернего набора строк document. Посредством задания параметров filter.doctypeid, filter.ndoc и filter.ddoc введенные пользователем значения набора строк фильтра передаются в контроллер набора строк document. Атрибут skipempty=«1» означает, что если соответствующее поле фильтра не задано и, следовательно, значение параметра пусто, то параметр передавать на сервер не надо.

Корректировка описания набора строк

Корректировка заголовка

Чаще всего, при корректировке заголовка набора строк в секции rowsets, возникает необходимость настраивать доступность набора строк для правки и описывать параметры работы пагинатра.

Например:

<rowsets>

  <rowset name="document" paginator.count="300">
    <rowset name="item" js_readonly="get('document.state')!='edit'">
      <param name="filter.documentid" js_value="get('document.id')"/>
    </rowset>
  </rowset>
  
</rowsets>

В этом примере набор строк document работает в режиме пагинации. В каждом запросе серверу на начитку данных добавляются параметры пагинатора: paginator.from и paginator.count. Контроллер набора строк на сервере должен уметь их обрабатывать, и возвращать в ответе только соответствующие параметрам пагинации строки. А у набора строк item задано динамическое условие на доступность набора строк только на чтение.

Другая интересная возможность - можно задать id строки, на которую набор строк должен спозиционироваться при открытии экранной формы:

<rowsets>

  <rowset name="document" paginator.count="300" row.focus.id="243">
  </rowset>
  
</rowsets>

В этом примере, при первой перечитке набора строк, при открытии экранной формы, на сервер будет передан дополнительный параметр:

<param name="row.focus.id" value="243"/>

Контроллер набора строк на сервере должен этот параметр корректно отработать:

Корректировка полей

Описание набора строк состоит из описания поддерживаемых им запросов и описаний его полей. В секции rowsets можно вносить изменения в универсальное, не зависящее от экранной формы, описание списка полей набора строк. Там можно осуществлять привязку описания полей к контексту использования. Для поля, в секции rowsets, можно задавать значения атрибутов js_readonly, js_visible, caption, len, stretch и т.д. Для справочников можно модифицировать параметры, передаваемые при начитке допустимых строк справочника.

Например:

<rowsets>

  <rowset name="document">
    <rowset name="item">
      <param name="filter.documentid" js_value="get('document.id')"/>
      <fields>
        <field name="itemtypeid" type="ref" js_readonly="get('document.mode')=='specialMode'">
          <ref datasource="itemtype">
            <param name="filter.doctypeid" js_value="get('document.doctypeid')" skipempty="1"/>
          </ref>
        </field>
      </fields>
    </rowset>
  </rowset>
  
</rowsets>

В этом примере модифицировано описание поля справочника itemtypeid набора строк item. Для него:

Корректировка запросов

Описание набора строк состоит из описания поддерживаемых им запросов и описаний его полей. В описание запросов можно вносить изменения, позволяющие привязать работу набора строк к экранной форме. Можно:

Например:

<rowsets>

  <rowset name="document">
    <rowset name="item">
      <requests>
        <param name="filter.documentid" js_value="get('document.id')"/>
        
        <request name="mark"/>
        <request name="delete" js_enabled="get('document.mode')=='specialMode'"/>
        <request name="append" js_enabled="get('document.mode')=='specialMode'">
          <param name="documentMode" js_value="get('document.mode')" skipempty="1"/>
        </request>
      </requests>
    </rowset>
  </rowset>
  
</rowsets>

В этом примере внесены изменения в описания запросов набора строк item:

Этот пример можно записать компактнее, опустив группирующий элемент requests:

<rowsets>

  <rowset name="document">
    <rowset name="item">
      <param name="filter.documentid" js_value="get('document.id')"/>
        
      <request name="mark"/>
      <request name="delete" js_enabled="get('document.mode')=='specialMode'"/>
      <request name="append" js_enabled="get('document.mode')=='specialMode'">
        <param name="documentMode" js_value="get('document.mode')" skipempty="1"/>
      </request>
    </rowset>
  </rowset>
  
</rowsets>