====== Подробное описание секции наборов строк ======
[[start:|lss]] | [[form-definition]]
===== Введение =====
[[rowset-definition|Наборы строк]] содержат отображаемые [[form-definition|экранной формы]] данные. Эти данные отображаются в визуальных элементах экранного интерфейса - панелях. Именно [[rowset-definition|наборы строк]] манипулируют данными на клиенте - отвечают за правку данных и взаимодействие с сервером.
Используемые в [[form-definition|экранной форме]] [[rowset-definition|наборы строк]] должны быть объявлены в секции **rowsets**.
Тут есть хитрость: у [[rowset-definition|набора строк]] на стороне сервера есть контроллер. Этот контроллер умеет возвращать описание своего [[rowset-definition|набора строк]] по [[request|запросу]] **definition**. А описания в секции **rowsets** позволяют подстроить типовое унифицированное описание [[rowset-definition|набора строк]] под нужды конкретной [[form-definition|экранной формы]].
===== Родительский и дочерние наборы строк =====
На уровне [[form-definition|экранной формы]] [[rowset-definition|наборы строк]] можно выстроить в иерархию: родительский - дочерний. При смене текущей строки в родительском [[rowset-definition|наборе строк]] его дочерние [[rowset-definition|наборы строк]] автоматически перечитываются. Задача программиста описать в дочерних [[rowset-definition|наборах строк]] фильтры так, что бы после перечитки содержимое дочернего [[rowset-definition|набора строк]] соответствовало текущей строке родительского [[rowset-definition|набора строк]].
Пример:
В этом примере описаны 2 [[rowset-definition|набора строк]]: **document** и **item**. Их подробное описание в секции **rowsets** отсутствует, так как размещенные на сервере контроллеры [[rowset-definition|наборов строк]] вернут [[form-definition|экранной форме]] их унифицированные описания, по [[request|запросу]] **definition**.
[[rowset-definition|Набор строк]] **document** объявлен родительским. [[rowset-definition|Набор строк]] **item** для него описан как дочерний. Предполагается, что на сервере контроллер [[rowset-definition|набора строк]] **item** понимает параметр **filter.documnentid** и воспринимает его как фильтр - возвращает только строки, относящиеся к заданному значению **documentid**. Соответственно, при смене текущей строки в [[rowset-definition|наборе строк]] **document** автоматически произойдет перечитка дочернего к нему [[rowset-definition|набора строк]] **item**. А благодаря правильно настроенному фильтру - параметру **filter.documentid** перечитка вернет только данные, относящиеся к текущей строке [[rowset-definition|набора строк]] **document**.
Этот пример можно записать компактнее:
===== Набор строк фильтра =====
Есть типовая задача - [[form-definition|экранная форма]] должна отображать не все данные, а только интересующую пользователя часть, причем пользователь может задавать фильтруемые значения. Для хранения и правки данных фильтра в LSS используется специальный [[rowset-definition|набор строк]] - фильтр. Он задается параметром **filter="1"**.
У этого [[rowset-definition|набора строк]] есть несколько особенностей:
* У [[rowset-definition|набора строк]] фильтра нет контроллера на сервере. У каждой [[form-definition|экранной формы]] фильтры свои, и универсальный контроллер фильтра смысла не имеет. Соответственно, [[rowset-definition|набор строк]] фильтра полностью описывается в [[form-definition|экранной форме]], в секции **rowsets**. Так как нет контроллера, то нет и отправляемых контроллеру [[request|запросов]]. Соответственно, описание [[rowset-definition|набора строк]] фильтра - это только описание его полей.
* Данные [[rowset-definition|набора строк]] фильтра всегда одна и только одна строка. У нее нет id, ее нельзя удалить, нельзя добавить новую. Содержимое этой строки нельзя начитать с сервера - нет контроллера. Начальные значения полей фильтра следует задавать посредством атрибута **default**.
* По умолчанию каждое изменение пользователем значения фильтра приводит к автоматической перечитке дочерних к нему [[rowset-definition|наборов строк]].
* Нестандартное поведение [[rowset-definition|набора строк]] фильтра следует реализовывать в контроллере [[form-definition|экранной формы]], так как для [[rowset-definition|набора строк]] фильтра своего контроллера нет.
Пример:
В этом примере [[rowset-definition|набор строк]] с именем **filter** объявлен как фильтр посредством атрибута **filter="1"**. В секции **fields** описаны его поля. У полей **doctypeid** и **doctype_name** с помощью атрибута **default** заданы начальные значения.
[[rowset-definition|Набор строк]] **document** описан как дочерний к нему. Каждое изменение пользователем значения поля [[rowset-definition|набора строк]] фильтра автоматически вызовет перечитку дочернего [[rowset-definition|набора строк]] **document**. Посредством задания параметров **filter.doctypeid**, **filter.ndoc** и **filter.ddoc** введенные пользователем значения [[rowset-definition|набора строк]] фильтра передаются в контроллер [[rowset-definition|набора строк]] **document**. Атрибут **skipempty="1"** означает, что если соответствующее поле фильтра не задано и, следовательно, значение параметра пусто, то параметр передавать на сервер не надо.
===== Корректировка описания набора строк =====
==== Корректировка заголовка ====
Чаще всего, при корректировке заголовка [[rowset-definition|набора строк]] в секции **rowsets**, возникает необходимость настраивать доступность [[rowset-definition|набора строк]] для правки и описывать параметры работы **пагинатра**.
Например:
В этом примере [[rowset-definition|набор строк]] **document** работает в режиме **пагинации**. В каждом [[request|запросе]] серверу на начитку данных добавляются параметры пагинатора: **paginator.from** и **paginator.count**. Контроллер [[rowset-definition|набора строк]] на сервере должен уметь их обрабатывать, и возвращать в ответе только соответствующие параметрам пагинации строки.
А у [[rowset-definition|набора строк]] item задано динамическое условие на доступность [[rowset-definition|набора строк]] только на чтение.
Другая интересная возможность - можно задать id строки, на которую [[rowset-definition|набор строк]] должен спозиционироваться при открытии [[form-definition|экранной формы]]:
В этом примере, при первой перечитке [[rowset-definition|набора строк]], при открытии [[form-definition|экранной формы]], на сервер будет передан дополнительный параметр:
Контроллер [[rowset-definition|набора строк]] на сервере должен этот параметр корректно отработать:
* если включен режим пагинации, то найти и вернуть в ответе ту порцию данных, в которой размещена строка с заданным **id**
* пометить эту строку признаком **row.focus="1"**
==== Корректировка полей ====
Описание [[rowset-definition|набора строк]] состоит из описания поддерживаемых им [[request|запросов]] и описаний его полей.
В секции **rowsets** можно вносить изменения в универсальное, не зависящее от [[form-definition|экранной формы]], описание списка полей [[rowset-definition|набора строк]]. Там можно осуществлять привязку описания полей к контексту использования.
Для поля, в секции **rowsets**, можно задавать значения атрибутов **js_readonly**, **js_visible**, **caption**, **len**, **stretch** и т.д. Для справочников можно модифицировать параметры, передаваемые при начитке допустимых строк справочника.
Например:
[
]
В этом примере модифицировано описание поля справочника **itemtypeid** [[rowset-definition|набора строк]] **item**.
Для него:
* Выписано динамическое выражение, описывающее доступность поля для правки - **js_readonly**.
* Внесены изменения в начитку строк справочника: при раскрытии диалога выбора строки справочника происходит начитка **itemtype**. При этом контроллеру **itemtype** на сервер отправляется дополнительный параметр **filter.doctypeid**, контроллер должен его корректно обработать, и вернуть только подходящие строки.
* Группирующий элемент **fields** не обязателен, его можно опустить. Тогда элементы **field** можно размещать непосредственно в узле **rowset**.
==== Корректировка запросов ====
Описание [[rowset-definition|набора строк]] состоит из описания поддерживаемых им [[request|запросов]] и описаний его полей. В описание [[request|запросов]] можно вносить изменения, позволяющие привязать работу
[[rowset-definition|набора строк]] к [[form-definition|экранной форме]]. Можно:
* Задавать доступность/запрет выполнения [[request|запроса]] в зависимости от контекста, посредством параметра **js_enable**
* Подстраивать передаваемые [[request|запросу]] параметры
* Включать поддержку [[request|запроса]] пометки строки **mark**. Обычно этот [[request|запрос]] отрабатывает на клиенте, без обращения к серверу. А список помеченных строк можно передать на сервер параметром [[request|запроса]], используя функцию **get('rowset.mark')**.
Например:
В этом примере внесены изменения в описания [[request|запросов]] [[rowset-definition|набора строк]] **item**:
* Добавлен параметр **filter.documentid**. В результате, значение этого параметра передается в каждый [[request|запрос]], отправляемый [[rowset-definition|набором строк]] **item** на сервер.
* Добавлена поддержка [[request|запроса]] **mark**. Это возможность на клиенте помечать строки.
* Для поддерживаемых [[rowset-definition|набором строк]] [[request|запросов]] **append** и **delete**, добавлено динамически вычисляемое условие доступности выполнения [[request|запроса]].
* Для [[request|запроса]] **append** добавлен параметр **documentMode**, передаваемый на сервер только при выполнении этого [[request|запроса]].
Этот пример можно записать компактнее, опустив группирующий элемент **requests**: