diff --git a/API/audit.md b/API/audit.md
index 973a142f..b07489e7 100644
--- a/API/audit.md
+++ b/API/audit.md
@@ -93,9 +93,9 @@ eventTypeFilter(data: string | number | (string | number)[]): this;
- `string` — название типа события,
-- `number` — [`longId`](./views.md#long-id) типа события,
+- `number` — [`longId`](./common.md#long-id) типа события,
-- `(string | number)[]` — массив (возможно, смешанный) названий и [`longId`](./views.md#long-id) типов событий.
+- `(string | number)[]` — массив (возможно, смешанный) названий и [`longId`](./common.md#long-id) типов событий.
Возвращает `this`.
diff --git a/API/common.md b/API/common.md
index 9e1b4106..883edd66 100644
--- a/API/common.md
+++ b/API/common.md
@@ -145,7 +145,7 @@ interface CellBuffer {
```js
set(cell: Cell | CubeCell, value: number | string | boolean | null): this;
```
-Устанавливает значение `value` в клетку `cell` в буфере. Возвращает `this`.
+Устанавливает значение `value` в клетку `cell` в буфере. В качестве значения `value` можно передать то же, что и для метода [`Cell.setValue()`](./readingGrid.md#cell.set-value). Возвращает `this`.
@@ -400,7 +400,7 @@ recalculate(): boolean;
```js
backup(path?: string): EntityInfo | boolean;
```
-Сохраняет резервную копию в логах модели: в интерфейсе Optimacros на вкладке `Центр безопастности`->`Логи`->`Резервные копии`. Если указан путь `path`, после создания копии вызовется функция `export()` и вернётся её результат типа `boolean`. Если `path` не указан, возвращает сущность резервной копии в виде [`EntityInfo`](./views.md#entity-info).
+Сохраняет резервную копию в логах модели: в интерфейсе Optimacros на вкладке `Центр безопастности`->`Логи`->`Резервные копии`. Если указан путь `path`, после создания копии вызовется функция `export()` и вернётся её результат типа `boolean`. Если `path` не указан, возвращает сущность резервной копии в виде [`EntityInfo`](#entity-info).
@@ -587,7 +587,7 @@ interface UserInfo {
```js
getEntity(): EntityInfo;
```
-Возвращает сущность пользователя в виде [`EntityInfo`](./views.md#entity-info).
+Возвращает сущность пользователя в виде [`EntityInfo`](#entity-info).
@@ -615,7 +615,7 @@ getLastName(): string;
```js
getRole(): EntityInfo;
```
-Возвращает сущность роли пользователя в виде [`EntityInfo`](./views.md#entity-info).
+Возвращает сущность роли пользователя в виде [`EntityInfo`](#entity-info).
@@ -653,6 +653,82 @@ setProperty(name: string, value: any): this;
+### Интерфейс EntityInfo (Label)
+```ts
+interface Label {
+ longId(): number;
+ name(): string;
+ code(): string | null;
+ alias(): string;
+ label(): string;
+ parentLongId(): number;
+ hierarchyLongId(): number;
+}
+
+```
+Интерфейс сущности. Как правило, представляет собой один из заголовков строки или столбца.
+
+
+
+
+```js
+longId(): number;
+```
+Возвращает внутренний идентификатор сущности в системе, уникальный в пределах модели.
+
+
+
+
+```js
+name(): string;
+```
+Возвращает имя сущности.
+
+
+
+
+```js
+code(): string;
+```
+Возвращает код сущности.
+
+
+
+
+```js
+alias(): string;
+```
+Возвращает отображаемое имя.
+
+Если `this` является сущностью элемента справочника, в настройках которого задано некоторое свойство в качестве отображаемого имени (колонка `Отображаемое имя` на вкладке `Справочники`), и для этой сущности задано значение этого свойства, то возвращает значение этого свойства.
+
+Иначе возвращает [`name()`](#name).
+
+
+
+```js
+label(): string;
+```
+То же, что и [`alias()`](#alias).
+
+
+
+```js
+parentLongId(): number;
+```
+Если сущность является элементом, у которого есть родительский элемент, то возвращает [`longId`](#long-id) сущности родителя.
+
+Если родительской сущности нет, возвращает `-1`.
+
+
+
+```js
+hierarchyLongId(): number;
+```
+Если сущность является элементом или сабсетом справочника (включая справочники времени и версий), возвращает [`longId`](#long-id) самого справочника. Если родительского справочника нет, возвращает `-1`. На данный момент этот метод может некорректно работать в зависимости от способа получения `EntityInfo`, для корректной работы рекомендуется получать сущность с помощью интерфейса [`EntitiesInfo`](#entities-info).
+
+
+
### Интерфейс EntitiesInfo
```ts
interface EntitiesInfo {
@@ -660,21 +736,21 @@ interface EntitiesInfo {
getCollection(longId: number[]): EntityInfo[];
}
```
-Интерфейс для получения сущности по [`longId`](./views.md#long-id).
+Интерфейс для получения сущности по [`longId`](#long-id).
```js
get(longId: number): EntityInfo | null;
```
-Возвращает сущность [`EntityInfo`](./views.md#entity-info) по её [`longId`](./views.md#long-id).
+Возвращает сущность [`EntityInfo`](#entity-info) по её [`longId`](#long-id).
```js
getCollection(longId: number[]): EntityInfo[];
```
-Возвращает массив сущностей [`EntityInfo`](./views.md#entity-info) по массиву их [`longId`](./views.md#long-id). Корректно работает, только если все переданные `longId` корректные (существуют в модели). Иначе возвращает массив меньшей размерности. Использовать с осторожностью. Порядок возвращаемых сущностей `EntityInfo` может отличаться от порядка переданных `longId`.
+Возвращает массив сущностей [`EntityInfo`](#entity-info) по массиву их [`longId`](#long-id). Корректно работает, только если все переданные `longId` корректные (существуют в модели). Иначе возвращает массив меньшей размерности. Использовать с осторожностью. Порядок возвращаемых сущностей `EntityInfo` может отличаться от порядка переданных `longId`.
@@ -703,14 +779,14 @@ interface CopyData {
```js
setSourceLongId(longId: number): this;
```
-Устанавливает [`longId`](./views.md#long-id) элемента-источника *заданного измерения*.
+Устанавливает [`longId`](#long-id) элемента-источника *заданного измерения*.
```js
setDestLongId(longId: number): this;
```
-Устанавливает [`longId`](./views.md#long-id) элемента-приёмника *заданного измерения*.
+Устанавливает [`longId`](#long-id) элемента-приёмника *заданного измерения*.
@@ -731,7 +807,7 @@ enableCustomProperties(): this;
```js
setMulticubeLongIds(longIds: number[]): this;
```
-Предписывает произвести копирование в указанных по [`longId`](./views.md#long-id) мультикубах, которые содержат *заданное измерение*.
+Предписывает произвести копирование в указанных по [`longId`](#long-id) мультикубах, которые содержат *заданное измерение*.
diff --git a/API/cubeCell.md b/API/cubeCell.md
index c2d30fa9..83f9b38a 100644
--- a/API/cubeCell.md
+++ b/API/cubeCell.md
@@ -37,7 +37,7 @@ getDimensionIds(): number[];
```js
getDimensionItems(): EntityInfo[];
```
-Возвращает массив [`EntityInfo`](./views.md#entity-info) элементов измерений куба, которыми определена клетка. Порядок измерений фиксирован и соответствует порядку, в котором их же возвращает функция [`CubeInfo.getDimensions()`](#cube-info.get-dimensions).
+Возвращает массив [`EntityInfo`](./common.md#entity-info) элементов измерений куба, которыми определена клетка. Порядок измерений фиксирован и соответствует порядку, в котором их же возвращает функция [`CubeInfo.getDimensions()`](#cube-info.get-dimensions).
@@ -56,7 +56,7 @@ interface CubeInfo extends EntityInfo {
getDimensions(): EntityInfo[];
}
```
-Интерфейс информации о кубе. Интерфейс наследуется от [`EntityInfo`](./views.md#entity-info).
+Интерфейс информации о кубе. Интерфейс наследуется от [`EntityInfo`](./common.md#entity-info).
@@ -78,7 +78,7 @@ getFormatInfo(): CubeFormatInfo;
```js
getDimensions(): EntityInfo[];
```
-Возвращает массив [`EntityInfo`](./views.md#entity-info) измерений куба.
+Возвращает массив [`EntityInfo`](./common.md#entity-info) измерений куба.
@@ -96,7 +96,7 @@ interface CubeFormatInfo {
```js
getFormatTypeEntity(): EntityInfo;
```
-Возвращает сущность [`EntityInfo`](./views.md#entity-info) формата куба. Возможные форматы: `'Number'`, `'Text'`, `'Boolean'`, `'Date'`, `'Entity'`, `'Time Entity'`, `'Version'`, `'Line Item Subset'`, `'None'`.
+Возвращает сущность [`EntityInfo`](./common.md#entity-info) формата куба. Возможные форматы: `'Number'`, `'Text'`, `'Boolean'`, `'Date'`, `'Entity'`, `'Time Entity'`, `'Version'`, `'Line Item Subset'`, `'None'`.
diff --git a/API/dimensions.md b/API/dimensions.md
index 7887860d..1e26213d 100644
--- a/API/dimensions.md
+++ b/API/dimensions.md
@@ -348,7 +348,7 @@ interface TimeOptionsTab extends Tab {
applyForm(): Object;
}
```
-Вкладка `Время`. Интерфейс наследуется от [`Tab`](./views.md#tab). Является [`плоской таблицей`](../appendix/constraints.md#flat-table). Кроме того, является формой, аналогичной форме HTML: после изменения значений ячейки/ячеек требуется ещё вызвать функцию `applyForm()` для применения новых данных к модели.
+Вкладка `Время`. Интерфейс наследуется от [`Tab`](./views.md#tab). Является [`плоской таблицей`](../appendix/constraints.md#labelless-table). Кроме того, является формой, аналогичной форме HTML: после изменения значений ячейки/ячеек требуется ещё вызвать функцию `applyForm()` для применения новых данных к модели.
diff --git a/API/elementsManipulator.md b/API/elementsManipulator.md
index 456a9d55..363855dc 100644
--- a/API/elementsManipulator.md
+++ b/API/elementsManipulator.md
@@ -43,14 +43,14 @@ interface BaseElementsCreator {
```js
setPositionAfter(relativeLongId: number): this;
```
-Устанавливает позицию добавления после [`relativeLongId`](./views.md#long-id). Возвращает `this`.
+Устанавливает позицию добавления после [`relativeLongId`](./common.md#long-id). Возвращает `this`.
```js
setPositionBefore(relativeLongId: number): this;
```
-Устанавливает позицию добавления до [`relativeLongId`](./views.md#long-id). Возвращает `this`.
+Устанавливает позицию добавления до [`relativeLongId`](./common.md#long-id). Возвращает `this`.
@@ -72,14 +72,14 @@ setPositionEnd(): this;
```js
setPositionChildOf(parentLongId: number): this;
```
-Устанавливает позицию добавления элемента как дочернего для [`parentLongId`](./views.md#long-id). Возвращает `this`.
+Устанавливает позицию добавления элемента как дочернего для [`parentLongId`](./common.md#long-id). Возвращает `this`.
```js
create(): number[];
```
-Добавляет элементы и возвращает массив их [`longId`](./views.md#long-id).
+Добавляет элементы и возвращает массив их [`longId`](./common.md#long-id).
@@ -131,7 +131,7 @@ interface ElementsDeleter {
```js
appendIdentifier(identifier: number): this;
```
-Добавляет в буфер элемент, чей [`longId`](./views.md#long-id) равен `identifier`. Повторное добавление элемента в очередь **не** приводит к ошибкам. Возращает `this`.
+Добавляет в буфер элемент, чей [`longId`](./common.md#long-id) равен `identifier`. Повторное добавление элемента в очередь **не** приводит к ошибкам. Возращает `this`.
@@ -160,7 +160,7 @@ interface ElementsReorder {
```js
append(longId: number, relativeLongId?: number, position?: string): this;
```
-Добавляет в очередь данные о [`longId`](./views.md#long-id) элемента, который впоследствии будет позиционирован относительно элемента `relativeLongId` (значение по умолчанию: `-1`). Возвращает `this`. Способ позиционирования задаёт аргумент `position` (регистр имеет значение):
+Добавляет в очередь данные о [`longId`](./common.md#long-id) элемента, который впоследствии будет позиционирован относительно элемента `relativeLongId` (значение по умолчанию: `-1`). Возвращает `this`. Способ позиционирования задаёт аргумент `position` (регистр имеет значение):
`'Before'` — непосредственно перед `relativeLongId`;
diff --git a/API/readingGrid.md b/API/readingGrid.md
new file mode 100644
index 00000000..7b3586e3
--- /dev/null
+++ b/API/readingGrid.md
@@ -0,0 +1,389 @@
+# Интерфейсы для чтения представления в виде таблицы
+
+## Интерфейс GridRangeChunk
+```ts
+interface GridRangeChunk {
+ cells(): Cells;
+ rows(): Labels;
+ columns(): Labels;
+}
+```
+Интерфейс для обработки части строк [`GridRange`](./views.md#grid-range) — чанка. Содержит информацию о заголовках (возможно многоуровневых) и ячейках двумерной таблицы.
+
+
+
+```ts
+cells(): Cells;
+```
+Возвращает ссылку на набор ячеек [`Cells`](#cells) текущего чанка.
+
+
+
+```ts
+rows(): Labels;
+```
+Возвращает интерфейс [`Labels`](#labels), представляющий заголовки строк.
+
+
+
+```ts
+columns(): Labels;
+```
+Возвращает интерфейс [`Labels`](#labels), представляющий заголовки столбцов.
+
+
+
+### Интерфейс Labels
+```ts
+interface Labels {
+ start(): number;
+ count(): number;
+ all(): LabelsGroup[];
+ get(index: number): LabelsGroup | null;
+ chunkInstance(): GridRangeChunk;
+ findLabelByLongId(longId: number): Label | null;
+}
+```
+Интерфейс, представляющий набор объектов [`LabelsGroup`](#labels-group), то есть набор заголовков строк/столбцов с их возможно многоуровневой структурой. Как правило, его можно получить функциями интерфейса [`GridRangeChunk`](#grid-range-chunk).
+
+
+
+```ts
+start(): number;
+```
+Возвращает номер первой строки/столбца текущего [`GridRangeChunk`](#grid-range-chunk) в таблице [`Grid`](./views.md#grid).
+
+
+
+```ts
+count(): number;
+```
+Возвращает количество строк/столбцов в наборе.
+
+Если `this` относится к строкам, то это значение, которое было посчитано в функции [`GridRange`](./views.md#grid-range).[`generator(size)`](./views.md#generator) на основе аргумента `size`.
+
+Если `this` относится к столбцам, то это в точности значение аргумента `columnCount` функции [`Grid`](./views.md#grid).[`range(rowStart, rowCount, columnStart, columnCount)`](./views.md#range).
+
+
+
+```ts
+all(): LabelsGroup[];
+```
+Возвращает массив объектов заголовков каждой строки/столбца [`LabelsGroup`](#labels-group).
+
+
+
+```ts
+get(index: number): LabelsGroup | null;
+```
+Аналог `all()[index]`. В случае некорректного индекса возвращает `null`.
+
+
+
+```ts
+chunkInstance(): GridRangeChunk;
+```
+Возвращает обратную ссылку на [`GridRangeChunk`](#grid-range-chunk), из которого был получен `this`.
+
+
+
+```ts
+findLabelByLongId(longId: number): Label | null;
+```
+Возвращает объект [`Label`](#label) по его [`longId`](./common.md#long-id), если он присутствует в `this`, иначе — `null`.
+
+
+
+## Интерфейс LabelsGroup
+```ts
+interface LabelsGroup {
+ all(): Label[];
+ first(): Label;
+ cells(): Cells;
+}
+```
+Интерфейс, представляющий многоуровневый набор заголовков конкретной строки или столбца.
+
+
+
+```ts
+all(): Label[];
+```
+Возвращает массив конкретных заголовков [`Label`](#label).
+
+
+
+```ts
+first(): Label;
+```
+Аналог `all()[0]`.
+
+
+
+```ts
+cells(): Cells;
+```
+Возвращает интерфейс [`Cells`](#cells), предоставляющий доступ к ячейкам данной строки или столбца.
+
+
+
+### Интерфейс Label
+```ts
+interface Label = EntityInfo;
+```
+Интерфейс сущности, полученный при чтении грида (таблицы). Как правило, представляет собой один из заголовков строки или столбца. Должен быть идентичен интерфейсу [`EntitiesInfo`](./common.md#entities-info), но может отличаться. Поэтому рекомендуется получить [`longId`](./common.md#long-id) сущности с помощью этого интерфейса, а затем получить [`EntitiesInfo`](./common.md#entities-info) с помощью метода [`EntitiesInfo.get()`](./common.md#entities-info).
+
+
+
+### Интерфейс Cells
+```ts
+interface Cells {
+ all(): Cell[];
+ first(): Cell | null;
+ setValue(value: number | string | boolean | null): this;
+ count(): number;
+ chunkInstance(): GridRangeChunk;
+ getByIndexes(indexes: number[]): Cells;
+}
+```
+Интерфейс, представляющий (как правило, прямоугольный) набор клеток таблицы.
+
+
+
+```ts
+all(): Cell[];
+```
+Возвращает одномерный массив всех клеток [`Cell`](#cell).
+
+
+
+```ts
+first(): Cell | null;
+```
+Аналог `all()[0]`. Возвращает `null`, если массив клеток пустой.
+
+
+
+
+```ts
+setValue(value: number | string | boolean | null): this;
+```
+Устанавливает одно и то же значение для всех клеток. Отрабатывает в момент вызова и мгновенно приводит к пересчёту зависимых от них клеток. Поэтому ***не*** рекомендуется к использованию в больших мультикубах. Возвращает `this`.
+
+
+
+```ts
+count(): number;
+```
+Возвращает количество клеток в наборе.
+
+
+
+
+```ts
+chunkInstance(): GridRangeChunk;
+```
+Возвращает обратную ссылку на [`GridRangeChunk`](#grid-range-chunk), из которого был получен `this`.
+
+
+
+```ts
+getByIndexes(indexes: number[]): Cells;
+```
+Производит выборку из одномерного представления клеток объекта `this` по индексам `indexes` и возвращает новый объект [`Cells`](#cells). В этом случае функция [`chunkInstance()`](#chunk-instance) для нового объекта будет возвращать ссылку на тот же самый объект [`GridRangeChunk`](#grid-range-chunk), что и для `this`. Это *единственный* способ создать непрямоугольный объект [`Cells`](#cells).
+
+
+
+### Интерфейс Cell
+```ts
+interface Cell {
+ setValue(value: number | string | boolean | null): this;
+
+ getValue(): number | string | null;
+ getVisualValue(): string | null;
+ getNativeValue(): number | string | null;
+ getContextValue(): string | null;
+
+ definitions(): number[];
+ columns(): LabelsGroup | null;
+ rows(): LabelsGroup | null;
+
+ dropDown(): Labels;
+ dropDownSelector(): DropDownSelector;
+ getFormatType(): string;
+ isEditable(): boolean;
+}
+```
+Интерфейс, представляющий клетку таблицы.
+
+
+
+
+```ts
+setValue(value: number | string | boolean | null): this;
+```
+Устанавливает значение клетки. Отрабатывает в момент вызова и мгновенно приводит к пересчёту зависимых клеток. Поэтому ***не*** рекомендуется к использованию в больших мультикубах. В случае клетки формата справочника в качестве значения можно использовать [имя элемента](./common.md#name), его [код](./common.md#code), [`longId`](./common.md#long-id) или [пару `отображаемое-имя||имя`](cell.get-context-value). Возвращает `this`.
+
+
+
+
+```ts
+getValue(): number | string | null;
+```
+Возвращает значение клетки, которое видит пользователь. Если клетка имеет логический формат, то возвращается строковое значение `'true'` или `'false'`.
+
+
+
+```ts
+getVisualValue(): string | null;
+```
+Возвращает отображаемое значение в ячейке, если куб в формате даты или справочника, для других форматов куба возвращает `null`.
+
+
+
+
+```ts
+getNativeValue(): number | string | null;
+```
+Возвращает самородное значение клетки, зависящее от формата. Если клетка имеет формат справочника, то возвращается [`longId`](./common.md#long-id).
+
+В противном случае возвращает то же, что и [`getValue()`](#cell.get-value).
+
+
+
+
+```ts
+getContextValue(): string | null;
+```
+Если ячейка имеет формат справочника, в настройках которого задано некоторое свойство `prop` в качестве отображаемого имени (опция `Отображение`), и для этой ячейки задано значение этого свойства, то возвращает строку, состоящую из имени, двойной вертикальной черты и значения свойства `prop`. Например, для отображамого имени `Берлин` и имени элемента `#5` — `'Берлин||#5'`.
+
+В противном случае возвращает `null`.
+
+
+
+```ts
+definitions(): number[];
+```
+То же, что и [`CubeCell.definitions()`](./cubeCell.md#cube-cell.definitions).
+
+
+
+```ts
+columns(): LabelsGroup | null;
+```
+Возвращает многоуровневый набор заголовков [`LabelsGroup`](#labels-group) конкретного столбца, или `null`, если у клетки нет измерений на столбцах.
+
+
+
+```ts
+rows(): LabelsGroup | null;
+```
+Возвращает многоуровневый набор заголовков [`LabelsGroup`](#labels-group) конкретной строки, или `null`, если у клетки нет измерений на строках.
+
+
+
+
+```ts
+dropDown(): Labels;
+```
+Этот метод признан устаревшим. Вместо него стоит использовать метод [`dropDownSelector()`](#cell.dropdown-selector).
+
+Возвращает набор заголовков строк [`Labels`](#labels) выпадающего списка, который в интерфейсе пользователя `Optimacros` можно получить кликом по треугольнику внутри ячейки. Эта функция считается неэффективной, так как выгружает справочник целиком. Лучше зайти в нужный справочник и итерироваться по нему.
+
+
+
+
+```ts
+dropDownSelector(): DropDownSelector;
+```
+Позволяет постранично читать набор опций выпадающего списка значений клетки. Требует наличия `SHARED` блокировки для всех случаев, кроме колонки `Api Service Model` [таблицы веб-сервисов воркспейса](./apiServicesAdministration.md), которая требует отсутствия блокировок — `UNLOCK` (чтение опций клеток колонки `Api Service Script` требует `SHARED` блокировки, так как список скриптов без чтения модели получить не выйдет). Вызов на клетке, не содержащей выпадающего списка, приведёт к ошибке. Возвращает ссылку на интерфейс [`DropDownSelector`](#dropdown-selector) выпадающего списка, который в интерфейсе пользователя `Optimacros` можно получить кликом по треугольнику внутри ячейки.
+
+
+
+```ts
+getFormatType(): string;
+```
+Возвращает строку с форматом клетки. Возможные значения: `'NUMBER'`, `'BOOLEAN'`,
+`'ENTITY'`, `'TIME_ENTITY'`, `'LINE_ITEM_SUBSET'`, `'VERSION'`, `'TEXT'`, `'DATE'`, `'NONE'`.
+
+
+
+
+```ts
+isEditable(): boolean;
+```
+Возвращает признак возможности редактирования ячейки пользователем.
+
+
+
+### Интерфейс DropDownSelector
+
+```ts
+interface DropDownSelector {
+ totalCount(): number;
+ generator(chunkSize: number | null): IterableIterator;
+}
+```
+
+Интерфейс постраничного получения опций выпадающего списка для клеток формата сущности — `'ENTITY'`, `'TIME_ENTITY'`, `'VERSION'`, который должен во всех случаях совпадать со списком, доступным пользователю через `web`-интерфейс (со всеми применимыми фильтрациями).
+
+Для клеток, доступных только для чтения, список опций всё равно доступен, хотя изменение значения клетки невозможно. Чтобы понять, можно ли изменять клетку, стоит обратиться к методу [`Cell.isEditable()`](#cell.is-editable). Если недоступно даже чтение значения клетки, попытка получения данного интерфейса приведёт к ошибке.
+
+По неизвестной науке причине с помощью этого интерфейса также **возможно** чтение списка доступных пользовательских измерений мультикуба в колонке `User Lists` на вкладке `Multicubes`. По той же причине, если в справочнике типа `Cube Link` не установлено значение мультикуба в колонке `Multicube Link`, то у клетки пропадает выпадающий список полностью и она становится нередактируемой, а значит, попытка чтения опций кубов в колонке `Cube Link` приведёт к ошибке. Эта же причина влияет и на то, что если в справочнике создать свойство с форматом этого же или родительского справочника и применить зависимый контекст по измерению, то в `web`-интерфейсе фильтрация **не будет** работать, но интерфейс `DropDownSelector` **будет** работать с фильтрацией.
+
+Для получения новых страниц требуется блокировка того же уровня, что и для получения ссылки на сам интерфейс с помощью [`Cell.dropDownSelector`](#cell.dropdown-selector).
+
+Также стоит отметить, что наличие опции в выпадающем списке не гарантирует, что данное значение может быть установлено.
+
+
+
+```ts
+totalCount(): number;
+```
+Возвращает общее количество опций выпадающего списка.
+
+
+
+```ts
+generator(chunkSize: number | null): IterableIterator;
+```
+Метод получения итератора для постраничного чтения опций выпадающего списка. Аргумент `chunkSize` — максимальное количество опций на одной странице итератора в интервале от 500 до 5000 (по умолчанию 1000). Влияние параметра `chunkSize` на скорость работы итератора достаточно не изучено и это предстоит устанавливать в каждом конкретном случае. Возвращает итерируемый объект для чтения страниц опций выдающего списка [`DropDownSelectorChunk`](#dropdown-selector-chunk).
+
+
+
+### Интерфейс DropDownSelectorChunk
+```ts
+interface DropDownSelectorChunk {
+ start(): number;
+ count(): number;
+ all(): Label[];
+}
+```
+Интерфейс, содержащий одну страницу опций выпадающего списка возможных значений клетки.
+
+
+
+```ts
+start(): number;
+```
+Возвращает номер первой опции текущей страницы выдающего списка, начиная отсчёт с 0.
+
+
+
+```ts
+count(): number;
+```
+Возвращает общее число опций на текущей странице.
+
+
+
+```ts
+all(): Label[];
+```
+Возвращает список сущностей [Label](#label) опций выпадающего списка.
+
+
+
+[API Reference](API.md)
+
+[Оглавление](../README.md)
diff --git a/API/scriptChains.md b/API/scriptChains.md
index 835d42f8..0f13a594 100644
--- a/API/scriptChains.md
+++ b/API/scriptChains.md
@@ -18,7 +18,7 @@ interface ResultActionsInfo {
```js
makeMacrosAction(identifier: string | number): ResultMacrosAction;
```
-Создаёт и возвращает действие [`ResultMacrosAction`](#result-macros-action) запуска существующего в модели скрипта. Аргумент `identifier` означает имя или [`longId`](./views.md#long-id) скрипта.
+Создаёт и возвращает действие [`ResultMacrosAction`](#result-macros-action) запуска существующего в модели скрипта. Аргумент `identifier` означает имя или [`longId`](./common.md#long-id) скрипта.
@@ -32,28 +32,28 @@ makeCodeExecutionAction(code: string): CodeExecutionAction;
```js
makeDashboardOpenAction(identifier: string | number): ResultOpenAction;
```
-Создаёт и возвращает действие [`ResultOpenAction`](#result-open-action) открытия существующего в модели дашборда. Аргумент `identifier` означает имя или [`longId`](./views.md#long-id) дашборда.
+Создаёт и возвращает действие [`ResultOpenAction`](#result-open-action) открытия существующего в модели дашборда. Аргумент `identifier` означает имя или [`longId`](./common.md#long-id) дашборда.
```js
makeContextTableOpenAction(identifier: string | number): ResultOpenAction;
```
-Создаёт и возвращает действие [`ResultOpenAction`](#result-open-action) открытия существующей в модели контекстной таблицы. Аргумент `identifier` означает имя или [`longId`](./views.md#long-id) контекстной таблицы.
+Создаёт и возвращает действие [`ResultOpenAction`](#result-open-action) открытия существующей в модели контекстной таблицы. Аргумент `identifier` означает имя или [`longId`](./common.md#long-id) контекстной таблицы.
```js
makeMulticubeViewOpenAction(multicube: string | number, view?: string | number | null): ResultOpenAction;
```
-Создаёт и возвращает действие [`ResultOpenAction`](#result-open-action) открытия существующего в модели мультикуба. Аргумент `identifier` означает имя или [`longId`](./views.md#long-id) мультикуба, `view` означает имя или [`longId`](./views.md#long-id) представления.
+Создаёт и возвращает действие [`ResultOpenAction`](#result-open-action) открытия существующего в модели мультикуба. Аргумент `identifier` означает имя или [`longId`](./common.md#long-id) мультикуба, `view` означает имя или [`longId`](./common.md#long-id) представления.
```js
makeListViewOpenAction(list: string | number, view?: string | number | null): ResultOpenAction;
```
-Создаёт и возвращает действие [`ResultOpenAction`](#result-open-action) открытия существующего в модели справочника. Аргумент `identifier` означает имя или [`longId`](./views.md#long-id) справочника, `view` означает имя или [`longId`](./views.md#long-id) представления.
+Создаёт и возвращает действие [`ResultOpenAction`](#result-open-action) открытия существующего в модели справочника. Аргумент `identifier` означает имя или [`longId`](./common.md#long-id) справочника, `view` означает имя или [`longId`](./common.md#long-id) представления.
diff --git a/API/scripts.om.d.ts b/API/scripts.om.d.ts
index 10f73722..498db23a 100644
--- a/API/scripts.om.d.ts
+++ b/API/scripts.om.d.ts
@@ -22,11 +22,27 @@ export interface Cell {
columns(): LabelsGroup | null;
rows(): LabelsGroup | null;
+ /** DEPRECATED */
dropDown(): Labels;
+ dropDownSelector(): DropDownSelector;
getFormatType(): string;
isEditable(): boolean;
}
+export interface DropDownSelector {
+ totalCount(): number;
+ /**
+ * @param chunkSize Default: 1000
+ */
+ generator(chunkSize: number | null): IterableIterator;
+}
+
+export interface DropDownSelectorChunk {
+ start(): number;
+ count(): number;
+ all(): Label[];
+}
+
export interface Cells {
all(): Cell[];
first(): Cell | null;
diff --git a/API/variables.md b/API/variables.md
index 29a644c9..f6c3a0f2 100644
--- a/API/variables.md
+++ b/API/variables.md
@@ -31,7 +31,7 @@ interface Variable {
```js
isEntity(): boolean;
```
-Возвращает `true`, если значение переменной - объект [`EntityInfo`](./views.md#entity-info), и `false` в противном случае.
+Возвращает `true`, если значение переменной - объект [`EntityInfo`](./common.md#entity-info), и `false` в противном случае.
diff --git a/API/views.md b/API/views.md
index 5294b541..b9c4ea13 100644
--- a/API/views.md
+++ b/API/views.md
@@ -113,7 +113,7 @@ cleanCellsData(cubesIdentifiers?: number[]): this;
```js
cubeCellSelector(identifier: string | number): CubeCellSelectorBuilder;
```
-Возвращает интерфейс [`CubeCellSelectorBuilder`](./cubeCell.md#cube-cell-selector-builder) выборки клеток для куба `identifier`. `identifier` должен быть именем или [`longId`](#long-id) куба. При указании некорректного `identifier` выбрасывается исключение.
+Возвращает интерфейс [`CubeCellSelectorBuilder`](./cubeCell.md#cube-cell-selector-builder) выборки клеток для куба `identifier`. `identifier` должен быть именем или [`longId`](./common.md#long-id) куба. При указании некорректного `identifier` выбрасывается исключение.
@@ -121,14 +121,14 @@ cubeCellSelector(identifier: string | number): CubeCellSelectorBuilder;
cubeCellUpdater(identifier: string | number): CubeCellUpdaterBuilder;
```
-Возвращает интерфейс [`CubeCellUpdaterBuilder`](./cubeCell.md#cube-cell-updater-builder) обновления клеток куба с именем или идентификатором `identifier` по формуле. `identifier` должен быть именем или [`longId`](#long-id) куба. При указании некорректного `identifier` выбрасывается исключение.
+Возвращает интерфейс [`CubeCellUpdaterBuilder`](./cubeCell.md#cube-cell-updater-builder) обновления клеток куба с именем или идентификатором `identifier` по формуле. `identifier` должен быть именем или [`longId`](./common.md#long-id) куба. При указании некорректного `identifier` выбрасывается исключение.
```js
getCubeInfo(identifier: string | number): CubeInfo;
```
-Возвращает интерфейс [`CubeInfo`](./cubeCell.md#cube-info) для получения информации о кубе `identifier`. `identifier` должен быть именем или [`longId`](#long-id) куба. При указании некорректного `identifier` выбрасывается исключение.
+Возвращает интерфейс [`CubeInfo`](./cubeCell.md#cube-info) для получения информации о кубе `identifier`. `identifier` должен быть именем или [`longId`](./common.md#long-id) куба. При указании некорректного `identifier` выбрасывается исключение.
@@ -217,9 +217,9 @@ rowsFilter(data: string | string[] | number | number[]): this;
`string[]` — массив названий строк;
-`number` — [`longId`](#long-id) строки;
+`number` — [`longId`](./common.md#long-id) строки;
-`number[]` — массив [`longId`](#long-id) строк.
+`number[]` — массив [`longId`](./common.md#long-id) строк.
Возвращает `this`.
@@ -235,7 +235,7 @@ columnsFilter(data: string | string[] | number | number[]): this;
```js
withoutValues(): this;
```
-Устанавливает признак загрузки с сервера данных без значений ячеек. В этом случае функции интерфейса [`Cell`](#cell) [`getValue()`](#cell.get-value), [`getNativeValue()`](#cell.get-native-value) и [`getContextValue()`](#get-context-value) будут возвращать `null`, однако функции [`Cell`](#cell).[`setValue()`](#cell.set-value), [`Cells`](#cells).[`setValue()`](#cells.set-value) и [`CellBuffer`](./common.md#cell-buffer).[`apply()`](./common.md#cell-buffer.apply) не теряют свою магическую силу. Возвращает `this`.
+Устанавливает признак загрузки с сервера данных без значений ячеек. В этом случае функции интерфейса [`Cell`](./readingGrid.md#cell) [`getValue()`](./readingGrid.md#cell.get-value), [`getNativeValue()`](./readingGrid.md#cell.get-native-value) и [`getContextValue()`](./readingGrid.md#get-context-value) будут возвращать `null`, однако функции [`Cell`](./readingGrid.md#cell).[`setValue()`](./readingGrid.md#cell.set-value), [`Cells`](./readingGrid.md#cells).[`setValue()`](./readingGrid.md#cells.set-value) и [`CellBuffer`](./common.md#cell-buffer).[`apply()`](./common.md#cell-buffer.apply) не теряют свою магическую силу. Возвращает `this`.
Эта функция существенно ускоряет работу в тех случаях, когда нужно записать данные, но не читать их.
@@ -245,11 +245,11 @@ withoutValues(): this;
```js
addDependentContext(identifier: number): this;
```
-Добавляет в фильтр по строкам весь зависимый контекст переданного [`longId`](#long-id) `identifier`: материнские и дочерние элементы всех уровней.
+Добавляет в фильтр по строкам весь зависимый контекст переданного [`longId`](./common.md#long-id) `identifier`: материнские и дочерние элементы всех уровней.
Если эта функция многократно вызывается с аргументами, один из которых является потомком остальных (порядок вызовов не имеет значения), то это считается уточнением запроса, и результат будет равносилен однократному вызову с этим аргументом.
-Если для полученного [`Grid`](#grid) установлен фильтр [`GridPageSelector`](#grid-page-selector) (или несколько), а `identifier` — это [`longId`](#long-id) элемента измерения одного из этих фильтров, то в соответствующем фильтре будет программно установлен этот элемент.
+Если для полученного [`Grid`](#grid) установлен фильтр [`GridPageSelector`](#grid-page-selector) (или несколько), а `identifier` — это [`longId`](./common.md#long-id) элемента измерения одного из этих фильтров, то в соответствующем фильтре будет программно установлен этот элемент.
Возвращает `this`.
@@ -455,9 +455,9 @@ cellCount(): number;
```js
generator(size?: number): IterableIterator;
```
-Возвращает генератор, при каждом обращении возвращающий интерфейс [`GridRangeChunk`](#grid-range-chunk) размером *не более* `size` ячеек, позволяющий обрабатывать `GridRange` покусочно.
+Возвращает генератор, при каждом обращении возвращающий интерфейс [`GridRangeChunk`](./readingGrid.md#grid-range-chunk) размером *не более* `size` ячеек, позволяющий обрабатывать `GridRange` покусочно.
-Каждый возвращаемый [`GridRangeChunk`](#grid-range-chunk) содержит целое количество строк, т. е. все колонки `GridRange`, а количество строк в нём определяется по формуле `size / columnCount()`. Здесь используется целочисленное деление с округлением в большую сторону. Например, если в таблице `14` столбцов, а параметр `size` равен `1500`, то генератор вернёт [`GridRangeChunk`](#grid-range-chunk) из `1500 / 14 = 107.14 ≈ 108` строк, в котором будет `14 * 108 = 1512` ячеек.
+Каждый возвращаемый [`GridRangeChunk`](./readingGrid.md#grid-range-chunk) содержит целое количество строк, т. е. все колонки `GridRange`, а количество строк в нём определяется по формуле `size / columnCount()`. Здесь используется целочисленное деление с округлением в большую сторону. Например, если в таблице `14` столбцов, а параметр `size` равен `1500`, то генератор вернёт [`GridRangeChunk`](./readingGrid.md#grid-range-chunk) из `1500 / 14 = 107.14 ≈ 108` строк, в котором будет `14 * 108 = 1512` ячеек.
Значение аргумента `size` ограничено снизу значением `500` и сверху значением `5000`, поэтому в скриптах 1.0 [`невозможно`](../appendix/constraints.md#generator) работать с `GridRange` с б*О*льшим количеством столбцов. Значение по умолчанию: `1500`.
@@ -481,379 +481,6 @@ for (const chunk of range.generator(1000)) {
-### Интерфейс GridRangeChunk
-```ts
-interface GridRangeChunk {
- cells(): Cells;
- rows(): Labels;
- columns(): Labels;
-}
-```
-Интерфейс для обработки куска [`GridRange`](#grid-range).
-
-
-
-```js
-cells(): Cells;
-```
-Возвращает ссылку на набор ячеек [`Cells`](#cells) текущего куска.
-
-
-
-```js
-rows(): Labels;
-```
-Возвращает интерфейс [`Labels`](#labels), представляющий заголовки строк.
-
-
-
-```js
-columns(): Labels;
-```
-Возвращает интерфейс [`Labels`](#labels), представляющий заголовки столбцов.
-
-
-
-### Интерфейс Labels
-```ts
-interface Labels {
- start(): number;
- count(): number;
- all(): LabelsGroup[];
- get(index: number): LabelsGroup | null;
- chunkInstance(): GridRangeChunk;
- findLabelByLongId(longId: number): Label | null;
-}
-```
-Интерфейс, представляющий набор объектов [`LabelsGroup`](#labels-group), то есть набор заголовков строк/столбцов с их возможно многоуровневой структурой. Как правило, его можно получить функциями интерфейса [`GridRangeChunk`](#grid-range-chunk).
-
-
-
-```js
-start(): number;
-```
-Возвращает номер первой строки/столбца текущего [`GridRangeChunk`](#grid-range-chunk) в таблице [`Grid`](#grid).
-
-
-
-```js
-count(): number;
-```
-Возвращает количество строк/столбцов в наборе.
-
-Если `this` относится к строкам, то это значение, которое было посчитано в функции [`GridRange`](#grid-range).[`generator(size)`](#generator) на основе аргумента `size`.
-
-Если `this` относится к столбцам, то это в точности значение аргумента `columnCount` функции [`Grid`](#grid).[`range(rowStart, rowCount, columnStart, columnCount)`](#range).
-
-
-
-```js
-all(): LabelsGroup[];
-```
-Возвращает массив объектов заголовков каждой строки/столбца [`LabelsGroup`](#labels-group).
-
-
-
-```js
-get(index: number): LabelsGroup | null;
-```
-Аналог `all()[index]`. В случае некорректного индекса возвращает `null`.
-
-
-
-```js
-chunkInstance(): GridRangeChunk;
-```
-Возвращает обратную ссылку на [`GridRangeChunk`](#grid-range-chunk), из которого был получен `this`.
-
-
-
-```js
-findLabelByLongId(longId: number): Label | null;
-```
-Возвращает объект [`Label`](#label) по его [`longId`](#long-id), если он присутствует в `this`, иначе — `null`.
-
-
-
-## Интерфейс LabelsGroup
-```ts
-interface LabelsGroup {
- all(): Label[];
- first(): Label;
- cells(): Cells;
-}
-```
-Интерфейс, представляющий многоуровневый набор заголовков конкретной строки или столбца.
-
-
-
-```js
-all(): Label[];
-```
-Возвращает массив конкретных заголовков [`Label`](#label).
-
-
-
-```js
-first(): Label;
-```
-Аналог `all()[0]`.
-
-
-
-```js
-cells(): Cells;
-```
-Возвращает интерфейс [`Cells`](#cells), предоставляющий доступ к ячейкам данной строки или столбца.
-
-В случае плоской таблицы [`возвращает`](../appendix/constraints.md#flat-table) `null`.
-
-
-
-### Интерфейс EntityInfo (Label)
-```ts
-interface Label {
- longId(): number;
- name(): string;
- code(): string | null;
- alias(): string;
- label(): string;
- parentLongId(): number;
- hierarchyLongId(): number;
-}
-
-interface EntityInfo = Label;
-```
-Интерфейс сущности. Как правило, представляет собой один из заголовков строки или столбца.
-
-
-
-
-```js
-longId(): number;
-```
-Возвращает внутренний идентификатор сущности в системе, уникальный в пределах модели.
-
-
-
-
-```js
-name(): string;
-```
-Возвращает имя сущности.
-
-
-
-```js
-code(): string;
-```
-Возвращает код сущности. В Optimacros всего две сущности могут иметь код: элементы справочников и кубы.
-
-
-
-
-```js
-alias(): string;
-```
-Возвращает отображаемое имя.
-
-Если `this` является сущностью элемента справочника, в настройках которого задано некоторое свойство в качестве отображаемого имени (опция `Отображение`), и для этой сущности задано значение этого свойства, то возвращает значение этого свойства.
-
-Иначе возвращает [`name()`](#label.name).
-
-
-
-```js
-label(): string;
-```
-То же, что и [`alias()`](#alias).
-
-
-
-```js
-parentLongId(): number;
-```
-Если сущность является элементом, у которого есть родительский элемент, то возвращает [`longId`](#long-id) сущности родителя.
-
-Если родительской сущности нет, возвращает `-1`.
-
-
-
-```js
-hierarchyLongId(): number;
-```
-Если сущность является элементом или сабсетом справочника (включая справочники времени и версий), возвращает [`longId`](#long-id) самого справочника. Если родительского справочника нет, возвращает `-1`. На данный момент этот метод может некорректно работать в зависимости от способа получения `EntityInfo`, для корректной работы рекомендуется получать сущность с помощью интерфейса [`EntitiesInfo`](./common.md#entities-info).
-
-
-
-### Интерфейс Cells
-```ts
-interface Cells {
- all(): Cell[];
- first(): Cell | null;
- setValue(value: number | string | boolean | null): this;
- count(): number;
- chunkInstance(): GridRangeChunk;
- getByIndexes(indexes: number[]): Cells;
-}
-```
-Интерфейс, представляющий (как правило, прямоугольный) набор клеток таблицы.
-
-
-
-```js
-all(): Cell[];
-```
-Возвращает одномерный массив всех клеток [`Cell`](#cell).
-
-
-
-```js
-first(): Cell | null;
-```
-Аналог `all()[0]`. Возвращает `null`, если массив клеток пустой.
-
-
-
-
-```js
-setValue(value: number | string | boolean | null): this;
-```
-Устанавливает одно и то же значение для всех клеток. Отрабатывает в момент вызова и мгновенно приводит к пересчёту зависимых от них клеток. Поэтому ***не*** рекомендуется к использованию в больших мультикубах. Возвращает `this`.
-
-
-
-```js
-count(): number;
-```
-Возвращает количество клеток в наборе.
-
-
-
-
-```js
-chunkInstance(): GridRangeChunk;
-```
-Возвращает обратную ссылку на [`GridRangeChunk`](#grid-range-chunk), из которого был получен `this`.
-
-
-
-```js
-getByIndexes(indexes: number[]): Cells;
-```
-Производит выборку из одномерного представления клеток объекта `this` по индексам `indexes` и возвращает новый объект [`Cells`](#cells). В этом случае функция [`chunkInstance()`](#chunk-instance) для нового объекта будет возвращать ссылку на тот же самый объект [`GridRangeChunk`](#grid-range-chunk), что и для `this`. Это *единственный* способ создать непрямоугольный объект [`Cells`](#cells).
-
-
-
-### Интерфейс Cell
-```ts
-interface Cell {
- setValue(value: number | string | boolean | null): this;
-
- getValue(): number | string | null;
- getVisualValue(): string | null;
- getNativeValue(): number | string | null;
- getContextValue(): string | null;
-
- definitions(): number[];
- columns(): LabelsGroup | null;
- rows(): LabelsGroup | null;
-
- dropDown(): Labels;
- getFormatType(): string;
- isEditable(): boolean;
-}
-```
-Интерфейс, представляющий клетку таблицы.
-
-
-
-
-```js
-setValue(value: number | string | boolean | null): this;
-```
-Устанавливает значение клетки. Отрабатывает в момент вызова и мгновенно приводит к пересчёту зависимых клеток. Поэтому ***не*** рекомендуется к использованию в больших мультикубах. Возвращает `this`.
-
-
-
-
-```js
-getValue(): number | string | null;
-```
-Возвращает значение клетки, которое видит пользователь. Если клетка имеет логический формат, то возвращается строковое значение `'true'` или `'false'`.
-
-
-
-```js
-getVisualValue(): string | null;
-```
-Возвращает отображаемое значение в ячейке, если куб в формате даты или справочника, для других форматов куба возвращает `null`.
-
-
-
-
-```js
-getNativeValue(): number | string | null;
-```
-Возвращает самородное значение клетки, зависящее от формата. Если клетка имеет формат справочника, то возвращается [`longId`](#long-id).
-
-В противном случае возвращает то же, что и [`getValue()`](#cell.get-value).
-
-
-
-
-```js
-getContextValue(): string | null;
-```
-Если ячейка имеет формат справочника, в настройках которого задано некоторое свойство `prop` в качестве отображаемого имени (опция `Отображение`), и для этой ячейки задано значение этого свойства, то возвращает строку, состоящую из имени, двойной вертикальной черты и значения свойства `prop`, например, `'#5||Берлин'`.
-
-В противном случае возвращает `null`.
-
-
-
-```js
-definitions(): number[];
-```
-То же, что и [`CubeCell.definitions()`](./cubeCell.md#cube-cell.definitions).
-
-
-
-```js
-columns(): LabelsGroup | null;
-```
-Возвращает многоуровневый набор заголовков [`LabelsGroup`](#labels-group) конкретного столбца, или `null`, если у клетки нет измерений на столбцах.
-
-
-
-```js
-rows(): LabelsGroup | null;
-```
-Возвращает многоуровневый набор заголовков [`LabelsGroup`](#labels-group) конкретной строки, или `null`, если у клетки нет измерений на строках.
-
-
-
-```js
-dropDown(): Labels;
-```
-Возвращает набор заголовков строк [`Labels`](#labels) выпадающего списка, который в интерфейсе пользователя Optimacros можно получить кликом по треугольнику внутри ячейки. Эта функция считается неэффективной, так как выгружает справочник целиком. Лучше зайти в нужный справочник и итерироваться по нему.
-
-
-
-```js
-getFormatType(): string;
-```
-Возвращает строку с форматом клетки. Возможные значения: `'NUMBER'`, `'BOOLEAN'`,
-`'ENTITY'`, `'TIME_ENTITY'`, `'LINE_ITEM_SUBSET'`, `'VERSION'`, `'TEXT'`, `'DATE'`, `'NONE'`.
-
-
-
-```js
-isEditable(): boolean;
-```
-Возвращает признак возможности редактирования ячейки пользователем.
-
-
-
[API Reference](API.md)
[Оглавление](../README.md)
diff --git a/appendix/constraints.md b/appendix/constraints.md
index 0e668916..f4684393 100644
--- a/appendix/constraints.md
+++ b/appendix/constraints.md
@@ -7,50 +7,22 @@
-
-## Плоские таблицы
+
+## Таблицы без строк и/или столбцов
-Если в сводной таблице на столбцах нет измерений (в этом случае в интерфейсе отображается один столбец), то к ячейкам невозможно получить доступ через функцию [`LabelsGroup`](../API/views.md#labels-group).`cells()`. В этой ситуации она возвращает `null`:
+Если в сводной таблице в строках или столбцах нет измерений, система скриптов создаёт виртуальное измерение, к которому можно получить доступ стандартным способом, и вызов
```js
-for (const chunk of generator) {
- const rowsCells = chunk.rows().all()[0].cells(); // null
-}
-```
-
-В этом случае система скриптов создаёт виртуальное измерение, к которому можно получить доступ стандартным способом, и вызов
-
-```js
-definitionInfo.getColumnDimensions()[0]getDimensionEntity().name();
+definitionInfo.getColumnDimensions()[0].getDimensionEntity().name();
```
вернёт специальное значение `'Empty 1 0'`.
-Характерный пример плоской таблицы – [`вкладка`](../API/dimensions.md#time-options-tab) настроек времени.
+Характерный пример такой таблицы – [`вкладка`](../API/dimensions.md#time-options-tab) настроек времени.
-Для решения этой проблемы следует использовать функцию [`GridRangeChunk`](../API/views.md#grid-range-chunk).`cells()`, которая возвращает линейный массив, параллельный массиву [`GridRangeChunk`](../API/views.md#grid-range-chunk).`rows()`. Пример кода, который в настройках времени устанавливает нужное значение в ячейку `Current Month`, используя такой подход:
-
-```js
-for (const chunk of generator) {
- let currentMonthIndex = null;
-
- chunk.rows().all().forEach((rowLabels, index) => {
- const name = rowLabels.first().name();
- if (name === 'Current Month') {
- currentMonthIndex = index;
- }
- });
-
- if (currentMonthIndex === null) {
- throw new Error(`Option 'Current Month' not found`);
- }
-
- const cells = chunk.cells().all();
- cells[currentMonthIndex].setValue(newCurrentMonthValue);
-}
-```
+Такое измерение не содержит заголовков и вызов [`LabelsGroup`](../API/readingGrid.md#labels-group).`all()` вернёт пустой массив.
-Если в сводной таблице нет измерений на *строках*, ситуация полностью аналогична описанной.
+Если таблица не содержит ни строк, ни колонок, то доступ к единственной ячейке возможет только с помощью метода [`GridRangeChunk`](../API/readingGrid.md#grid-range-chunk).`cells()`.
diff --git a/changelog.md b/changelog.md
index 2bee5524..cab1b0a1 100644
--- a/changelog.md
+++ b/changelog.md
@@ -2,6 +2,7 @@
| Дата релиза | Тег релиза | Версия ScriptAPI | Версии MiddleWork | Версия приложения | Изменения |
| --- | --- | --- | --- | --- | --- |
+| xx.xx.xxxx | [v9.300](https://github.com/optimacros/scripts_documentation/tree/v9.300) | — | | | - Интерфейсы доступа к содержимому грида — заголовкам и ячейкам — были вынесены в отдельный файл — [readingGrid.md](./API/readingGrid.md)
- Добавлен интерфейс постраничного получения списка опций значений клетки [DropDownSelector](./API/readingGrid.md#dropdown-selector) и метод для получения доступа к нему — [`Cell.dropDownSelector()`](./API/readingGrid.md#cell.dropdown-selector)
- Метод получения списка опций значений клетки [`Cell.dropDown()`](./API/readingGrid.md#cell.dropdown) признан устаревшим
|
| 24.03.2025 | [v9.300](https://github.com/optimacros/scripts_documentation/tree/v9.300) | — | | | - В интерфейсе [Filesystem](./API/fs.md#filesystem) изменены декларации функций `delete()`, `rename()`, `copy()`, `createDir()`, `deleteDir()`, `getSize()`
- В интерфейс [CellBuffer](./API/common.md#cell-buffer) добавлена функция `lastApplyErrors()`
- В интерфейсе [Importer](./API/exportImport.md#importer) исправлены исключения, которые могут бросать функции
|
| 16.12.2024 | [v9.?00.x.x](https://github.com/optimacros/scripts_documentation/tree/v9.?00.x.x) | — | | | - Интерфейс работы с лицензиями воркспейса `EnterpriseLicenseManager` заменён на новый интерфейс работы с данными договора о параметрах воркспейса [EnterpriseContractManager](./API/common.md#enterprise-contract-manager)
|
| 15.11.2024 | [9.200.x.13](https://github.com/optimacros/scripts_documentation/tree/v9.200.x.13) | — | | | - В интерфейс [Filesystem](./API/fs.md#filesystem) добавлен метод для изменения кодировки файла `changeTextFileCharset()`
|
diff --git a/cookBook/rowsColumnsFilters.md b/cookBook/rowsColumnsFilters.md
index fff4a93f..1a2d0df4 100644
--- a/cookBook/rowsColumnsFilters.md
+++ b/cookBook/rowsColumnsFilters.md
@@ -228,7 +228,7 @@ console.log(`Filter dimensions: ${pageSelectedNames.join(', ')} \n`);

-Необходимо заметить, что в выводе измерений столбцов `Column dimensions` появилось измерение `'Empty 1 0'`, хотя в представлении МК измерений на столбцах нет. Подробнее про это можно прочитать [здесь](../appendix/constraints.md#flat-table).
+Необходимо заметить, что в выводе измерений столбцов `Column dimensions` появилось измерение `'Empty 1 0'`, хотя в представлении МК измерений на столбцах нет. Подробнее про это можно прочитать [здесь](../appendix/constraints.md#labelless-table).
[Курс молодого бойца](cookBook.md)
diff --git a/publish/contents.json b/publish/contents.json
index b2bf8873..5e27cd9b 100644
--- a/publish/contents.json
+++ b/publish/contents.json
@@ -9,6 +9,7 @@
"env.md",
"variables.md",
"views.md",
+ "readingGrid.md",
"cubeCell.md",
"dimensions.md",
"elementsManipulator.md",