diff --git a/API/API.md b/API/API.md index a1d80112..5c4524f8 100644 --- a/API/API.md +++ b/API/API.md @@ -5,7 +5,7 @@ * выполнение скрипта: информация об окружении и управление выводом/действиями после завершения работы (см. `Common`, `Environment`, `Optimization`); * взаимодействие с моделью, как сущностью: создание бэкапа, пересчёт всей модели (см. `Common.ModelInfo`, `Users`); * взаимодействие с данными и метаданными модели (см. `Multicubes`, `Times`, `Versions`, `Lists`, `Common.CopyData`); -* взаимодействие с внешним миром (см. `Common.ApiService`, `Filesystems`, `Connectors`, `Notifications`); +* взаимодействие с внешним миром (см. `Common.ApiService`, `Filesystems`, `Connectors`, `Notifications`, `Secrets`); * административное: настройка API-сервисов (`ApiServices`), работа с аудитом (`Audit`); * функции, напрямую не связанные с Оптимакросом, функции помощники — интерфейс `Crypto`. @@ -33,6 +33,7 @@ 1. [Аудит](audit.md) 1. [Криптография, хэширование и вспомогательные функции](crypto.md) 1. [Пользователи](users.md) +1. [Секреты](secrets.md) ## Интерфейс OM ```ts @@ -52,6 +53,7 @@ interface OM { readonly audit: Audit; readonly crypto: Crypto; readonly users: Users; + readonly secrets: Secrets; } var om: OM; @@ -165,4 +167,11 @@ readonly users: Users;   +```js +readonly secrets: Secrets; +``` +Ссылка на интерфейс [`Secrets`](./secrets.md). + +  + [Оглавление](../README.md) diff --git a/API/apiService.md b/API/apiService.md index 45948f9e..4e015f7c 100644 --- a/API/apiService.md +++ b/API/apiService.md @@ -159,7 +159,7 @@ interface RequestFileInfos { getAll(): RequestFileInfo[]; } ``` -Интерфейс для получения информации о загруженных клиентом файлах. +Интерфейс для получения информации о загруженных клиентом файлах. Если требуется загрузить несколько файлов в одном ключе, в запросе для каждого файла нужно указывать одинаковый ключ-массив вида `key[]`.   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/clickhouse.md b/API/clickhouse.md new file mode 100644 index 00000000..5d23effd --- /dev/null +++ b/API/clickhouse.md @@ -0,0 +1,359 @@ +# Clickhouse + +## Интерфейс ClickhouseConnectorBuilder +```ts +interface ClickhouseConnectorBuilder { + setHost(value: string | SecretValue): this; + setPort(value: number | SecretValue): this; + setUsername(value: string | SecretValue): this; + setPassword(value: string | SecretValue): this; + setDatabase(value: string | SecretValue): this; + setHttps(value: boolean): this; + load(): ClickhouseConnection; +} +``` +Интерфейс, реализующий шаблон проектирования [`строитель`](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)), базовый интерфейс [`коннекторов`](../appendix/glossary.md#connector) для настройки подключения к базе данных [`Clickhouse`](https://ru.wikipedia.org/wiki/ClickHouse). Функции для установки параметров подключения поддерживают [секреты](./secrets.md). + +  + +```js +setHost(value: string | SecretValue): this; +``` +Устанавливает адрес подключения. Возвращает `this`. + +  + +```js +setPort(value: number | SecretValue): this; +``` +Устанавливает номер порта для подключения. Возвращает `this`. + +  + +```js +setUsername(value: string | SecretValue): this; +``` +Устанавливает имя пользователя. Возвращает `this`. + +  + +```js +setPassword(value: string | SecretValue): this; +``` +Устанавливает пароль. Возвращает `this`. + +  + +```js +setDatabase(value: string | SecretValue): this; +``` +Устанавливает имя базы данных. Возвращает `this`. + +  + +```js +setHttps(value: boolean): this; +``` +Устанавливает флаг `https`. Если он равен `true`, то выполнять подключение по протоколу [HTTPS](https://ru.wikipedia.org/wiki/HTTPS), иначе по протоколу [HTTP](https://ru.wikipedia.org/wiki/HTTP). Значение по умолчанию: `false`. Возвращает `this`. + +  + +```js +load(): ClickhouseConnection; +``` +Соединяется с БД и возвращает объект соединения [`ClickhouseConnection`](#clickhouse-connection). + +  + +## Интерфейс ClickhouseConnection +```ts +interface ClickhouseConnection { + qb(): ClickhouseQueryBuilder; +} +``` +Объект соединения с базой данных [`Clickhouse`](https://ru.wikipedia.org/wiki/ClickHouse). + +  + +```js +qb(): ClickhouseQueryBuilder; +``` +Возвращает интерфейс [`ClickhouseQueryBuilder`](#clickhouse-query-builder) построения запроса к базе данных. + +  + +## Интерфейс ClickhouseQueryBuilder +```ts +interface ClickhouseQueryBuilder { + select(columns?: string[]): this; + addSelect(column: string): this; + addSelectRaw(expression: string): this; + distinct(columns?: string[]): this; + + setFrom(table: string, alias?: string | null): this; + setTable(table: string, alias?: string | null): this; + + where(column: string, operator: string, value: any[] | any, concatOperator?: string): this; + orWhere(column: string, operator: string, value: any[] | any): this; + whereIn(column: string, values: any[], concatOperator?: string, not?: boolean): this; + whereBetween(column: string, minValue: string | number, maxValue: string | number, concatOperator?: string, not?: boolean): this; + orWhereBetween(column: string, minValue: string | number, maxValue: string | number): this; + + orderBy(column: string, direction?: string): this; + orderByDesc(column: string): this; + groupBy(column: string): this; + limit(count: number, offset?: number): this; + + exists(): boolean; + count(): number; + sum(column: string): number; + + truncate(): boolean; + insert(values: Object[] | Object): boolean; + + get(): ClickhouseQueryResult; + exportToCsv(path: string, ignoreHeader?: boolean): number; +} +``` +Интерфейс построения запроса к базе данных. + +  + +```js +select(columns?: string[]): this; +``` +Устанавливает к выборке набор колонок `columns`. Заменяет установленные ранее колонки/выражения. +Значение по умолчанию: `['*']` - выбрать все колонки. Возвращает `this`. + +  + +```js +addSelect(column: string): this; +``` +Добавляет к выборке колонку `column`. Возвращает `this`. + +  + +```js +addSelectRaw(expression: string): this; +``` +Добавляет к выборке выражение `expression`, полезно для использования функций. Возвращает `this`. + +  + +```js +distinct(columns?: string[]): this; +``` +Позволяет выбрать только уникальные строки для указанных колонок `columns`. Заменяет собой установленные ранее колонки вызовом метода `select()`. Возможно добавление колонок к выборке через методы `addSelect()` или `addSelectRaw()`. Значение по умолчанию: `['*']` - выбрать все колонки. Возвращает `this`. + +  + +```js +setFrom(table: string, alias?: string | null): this; +``` +Устанавливает таблицу, из которой будет производиться выборка. Для создания псевдонима используется `alias` (по умолчанию: `null`). Возвращает `this`. + +Вызов `setFrom('table1', 't1')` в запросе будет преобразован в `table1 AS t1`. + +  + +```js +setTable(table: string, alias?: string | null): this; +``` +Алиас для метода `setFrom()`. + +  + +```js +where(column: string, operator: string, value: any[] | any, concatOperator?: string): this; +``` +Добавляет условие вида `column operator value`. Возвращает `this`. + +Например, для вызова `where('columnName', '=', 5)` будет сформировано условие `columnName = 5`. + +К ранее заданному условию добавляется через оператор конкатенации `concatOperator`. Допустимые значения: `AND`, `OR`. Значение по умолчанию: `AND`. + +  + +```js +orWhere(column: string, operator: string, value: any[] | any): this; +``` +Аналогично вызову метода `where(column, operator, value, 'OR')`. + +  + +```js +whereIn(column: string, values: any[], concatOperator?: string, not?: boolean): this; +``` +Добавляет условие с оператором `IN` вида `column IN (values[0], values[1], ...)`. Возвращает `this`. + +К ранее заданному условию добавляется через оператор конкатенации `concatOperator`. Допустимые значения: `AND`, `OR`. Значение по умолчанию: `AND`. + +Флаг `not` устанавливает отрицание операции. Если значение `true`, то получим условие вида `column NOT IN (values[0], values[1], ...)`. Значение по умолчанию: `false`. + +  + +```js +whereBetween(column: string, minValue: string | number, maxValue: string | number, concatOperator?: string, not?: boolean): this; +``` +Добавляет условие с оператором `BETWEEN` вида `column BETWEEN minValue AND maxValue`. Возвращает `this`. + +К ранее заданному условию добавляется через оператор конкатенации `concatOperator`. Допустимые значения: `AND`, `OR`. Значение по умолчанию: `AND`. + +Флаг `not` устанавливает отрицание операции. Если значение `true`, то получим условие вида `column NOT BETWEEN minValue AND maxValue`. Значение по умолчанию: `false`. + +  + +```js +orWhereBetween(column: string, minValue: string | number, maxValue: string | number): this; +``` +Аналогично вызову метода `whereBetween(column, minValue, maxValue, 'OR')`. + +  + +```js +orderBy(column: string, direction?: string): this; +``` +Устанавливает сортировку по колонке `column`. Возвращает `this`. + +Направление сортировки задается аргументом `direction`. Допустимые значения: `ASC` - по возрастанию, `DESC` - по убыванию. Значение по умолчанию: `ASC`. + +  + +```js +orderByDesc(column: string): this; +``` +Устанавливает сортировку по убыванию по колонке `column`. Возвращает `this`. + +  + +```js +groupBy(column: string): this; +``` +Устанавливает группировку по колонке `column`. Возвращает `this`. + +  + +```js +limit(count: number, offset?: number): this; +``` +Устанавливает максимальное количество строк в выборке и количество строк, которое надо пропустить, прежде чем начать выборку. По умолчанию выборка начинается с первой строки (аргумент `offset` равен `0`). Возвращает `this`. + +  + +```js +exists(): boolean; +``` +Проверяет наличие строк для сформированного запроса. Возвращает `true`, если результат непустой, иначе `false`. + +  + +```js +count(): number; +``` +Возвращает количество найденных строк для сформированного запроса. + +  + +```js +sum(column: string): number; +``` +Суммирует значения в колонке `column` и возвращает полученную сумму. + +  + +```js +truncate(): boolean; +``` +Очищает таблицу запросом `TRUNCATE`. В случае успешного выполнения операции возвращает `true`, иначе `false`. + +  + +```js +insert(values: Object[] | Object): boolean; +``` +Вставляет значения `values` в таблицу, заданную методом `setTable()`. В случае успешного выполнения операции возвращает `true`, иначе `false`. + +Значения могут быть переданы в виде объекта (ключом является название колонки): +```js +insert({id: 1, name: 'Apple', count: 10}) +``` +Или массива объектов: +```js +insert([ + {id: 1, name: 'Apple', count: 10}, + {id: 2, name: 'Orange', count: 15}, + {id: 3, name: 'Banana', count: 18}, + {id: 4, name: 'Peach', count: 12}, + {id: 5, name: 'Lemon', count: 15}, +]) +``` + +  + +```js +get(): ClickhouseQueryResult; +``` +Конструирует SQL-запрос, передаёт его на исполнение в СУБД и возвращает интерфейс [`ClickhouseQueryResult`](#clickhouse-query-result) доступа к результатам запроса. + +  + +```js +exportToCsv(path: string, ignoreHeader?: boolean): number; +``` +Конструирует SQL-запрос, передаёт его на исполнение в СУБД и сохраняет результат в CSV формате в [`рабочей директории скрипта`](../appendix/glossary.md#script-dir) в файл `path`. Аргумент `ignoreHeader` устанавливает флаг игнорирования заголовка (`false` по умолчанию). Возвращает количество полученных строк. + +  + +## Интерфейс ClickhouseQueryResult +```ts +interface ClickhouseQueryResult { + count(): number; + generator(): IterableIterator; + all(): Object[]; + first(): Object | null; + column(columnName: string): any[]; +} +``` +Интерфейс доступа к результатам запроса. + +  + +```js +count(): number; +``` +Возвращает количество выбранных строк. + +  + +```js +generator(): IterableIterator; +``` +Возвращает генератор для работы со строками запроса. + +  + +```js +all(): Object[]; +``` +Возвращает все выбранные строки. + +  + +```js +first(): Object | null; +``` +Возвращает первую строку запроса. + +  + +```js +column(columnName: string): any[]; +``` +Выбирает и возвращает в виде массива значения столбца `columnName`. + +  + +[API Reference](API.md) + +[Оглавление](../README.md) diff --git a/API/common.md b/API/common.md index 82b8cf43..adf1da4c 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`.   @@ -211,6 +211,9 @@ interface RequestManager { log(message: string, print?: boolean): this; logStatusMessage(message: string, print?: boolean): this; setStatusMessage(message: string): this; + getRequestId(): string | null; + getScriptName(): string | null; + getScriptLongId(): string | null; } ``` Интерфейс для записи в лог (устаревший функционал) и работы со статусными сообщениями. Все функции возвращают `this`. @@ -244,6 +247,27 @@ setStatusMessage(message: string): this;   +```js +getRequestId(): string | null; +``` +Каждый запуск скрипта должен существовать в рамках пользовательского или системного [запроса](../appendix/glossary.md#request). Метод возвращает идентификатор текущего запроса. Предполагает возможность вернуть `null`, но такое поведение можно смело считать багом системы запуска скриптов. По идентификатору можно найти запись о запуске скрипта в истории запуска скриптов в web-интерфейсе на вкладке `Macros` -> `Scripts` -> `Launch History` и в панели администратора на вкладке `Requests` -> `History`, если запрос на запуск скрипта был сделан пользователем. Скрипты, запущенные по расписанию или через систему API сервисов считаются системными. + +  + +```js +getScriptName(): string | null; +``` +Возвращает имя сущности текущего исполняемого скрипта. В случае запуска сниппета кода с помощью метода [`ResultActionsInfo.makeCodeExecutionAction()`](./scriptChains.md#make-code-execution-action) возвращает `null`. + +  + +```js +getScriptLongId(): string | null; +``` +Возвращает [`longId`](#long-id) сущности текущего исполняемого скрипта. В случае запуска сниппета кода с помощью метода [`ResultActionsInfo.makeCodeExecutionAction()`](./scriptChains.md#make-code-execution-action) возвращает `null`. + +  + ### Интерфейс ExportObfuscationState ```ts interface ExportObfuscationState { @@ -400,7 +424,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 +611,7 @@ interface UserInfo { ```js getEntity(): EntityInfo; ``` -Возвращает сущность пользователя в виде [`EntityInfo`](./views.md#entity-info). +Возвращает сущность пользователя в виде [`EntityInfo`](#entity-info).   @@ -615,7 +639,7 @@ getLastName(): string; ```js getRole(): EntityInfo; ``` -Возвращает сущность роли пользователя в виде [`EntityInfo`](./views.md#entity-info). +Возвращает сущность роли пользователя в виде [`EntityInfo`](#entity-info).   @@ -655,6 +679,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 { @@ -662,21 +762,22 @@ 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[]; +getCollection(longId: number[]): (EntityInfo | null)[]; ``` -Возвращает массив сущностей [`EntityInfo`](./views.md#entity-info) по массиву их [`longId`](./views.md#long-id). Корректно работает, только если все переданные `longId` корректные (существуют в модели). Иначе возвращает массив меньшей размерности. Использовать с осторожностью. Порядок возвращаемых сущностей `EntityInfo` может отличаться от порядка переданных `longId`. +Возвращает массив сущностей [`EntityInfo`](#entity-info), параллельный массиву их [`longId`](#long-id). Если сущность не найдена, на её месте будет возвращёно значение `null`.   @@ -705,14 +806,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) элемента-приёмника *заданного измерения*.   @@ -733,7 +834,7 @@ enableCustomProperties(): this; ```js setMulticubeLongIds(longIds: number[]): this; ``` -Предписывает произвести копирование в указанных по [`longId`](./views.md#long-id) мультикубах, которые содержат *заданное измерение*. +Предписывает произвести копирование в указанных по [`longId`](#long-id) мультикубах, которые содержат *заданное измерение*.   diff --git a/API/connectors.md b/API/connectors.md index 0b77ded4..99583b14 100644 --- a/API/connectors.md +++ b/API/connectors.md @@ -12,6 +12,7 @@ interface Connectors { http(): Http.HttpManager; winAgent(builtIn?: boolean): WinAgent.WinAgentBuilder; verticaViaPgsqlDriver(): PgsqlDrivenVerticaConnectorBuilder; + clickhouse(): ClickhouseConnectorBuilder; } ``` Интерфейс, группирующий [`коннекторы`](../appendix/glossary.md#connector) к различным внешним системам. @@ -84,6 +85,13 @@ verticaViaPgsqlDriver(): PgsqlDrivenVerticaConnectorBuilder;   +```js +clickhouse(): ClickhouseConnectorBuilder; +``` +Возвращает коннектор [`ClickhouseConnectorBuilder`](./clickhouse.md#clickhouse-connector-builder) для подключения к базе данных [`Clickhouse`](https://ru.wikipedia.org/wiki/ClickHouse). + +  + [API Reference](API.md) [Оглавление](../README.md) diff --git a/API/crypto.md b/API/crypto.md index 7af38cdd..9489675e 100644 --- a/API/crypto.md +++ b/API/crypto.md @@ -5,9 +5,9 @@ ## Интерфейс Crypto ```ts interface Crypto { - sha1(data: string): string; - hash(algo: string, data: string, binary?: boolean): string | BinaryData; - hmac(algo: string, data: string, key: string | BinaryData, binary?: boolean): string | BinaryData; + sha1(data: string | SecretValue): string; + hash(algo: string, data: string | SecretValue, binary?: boolean): string | BinaryData; + hmac(algo: string, data: string | SecretValue, key: string | BinaryData, binary?: boolean): string | BinaryData; getHashAlgorithms(): string[]; getHmacHashAlgorithms(): string[]; } @@ -17,9 +17,9 @@ interface Crypto {   ```js -sha1(data: string): string; +sha1(data: string | SecretValue): string; ``` -Возвращает [`SHA1-хэш`](https://en.wikipedia.org/wiki/SHA-1) строки `data` (переданной в кодировке `UTF-8`), вычисленный по алгоритму `US Secure Hash Algorithm 1` в виде `40`-символьного шестнадцатеричного числа. +Возвращает [`SHA1-хэш`](https://en.wikipedia.org/wiki/SHA-1) строки `data` (переданной в кодировке `UTF-8`), вычисленный по алгоритму `US Secure Hash Algorithm 1` в виде `40`-символьного шестнадцатеричного числа. Поддерживает [секреты](./secrets.md). Пример использования: @@ -34,9 +34,9 @@ console.log(   ```js -hash(algo: string, data: string, binary?: boolean): string | BinaryData; +hash(algo: string, data: string | SecretValue, binary?: boolean): string | BinaryData; ``` -Метод для получения хэша строки `data` (переданной в кодировке `UTF-8`) по указанному алгоритму `algo`. Полный список доступных алгоритмов может быть получен с помощью метода `getHashAlgorithms()`. +Метод для получения хэша строки `data` (переданной в кодировке `UTF-8`) по указанному алгоритму `algo`. Поддерживает [секреты](./secrets.md). Полный список доступных алгоритмов может быть получен с помощью метода `getHashAlgorithms()`. Если `binary = false` (по умолчанию), то хэш возвращается в виде строки, использующей шестнадцатеричное кодирование в нижнем регистре ([`hexits`](https://en.wiktionary.org/wiki/hexit)). @@ -54,9 +54,9 @@ console.log(   ```js -hmac(algo: string, data: string, key: string | BinaryData, binary?: boolean): string | BinaryData; +hmac(algo: string, data: string | SecretValue, key: string | BinaryData, binary?: boolean): string | BinaryData; ``` -Метод для получения подписи [`HMAC (Hash-based Message Authentication Code)`](https://ru.wikipedia.org/wiki/HMAC) для строки `data` (переданной в кодировке `UTF-8`) с использованием ключа `key` и алгоритма хэширования `algo`. +Метод для получения подписи [`HMAC (Hash-based Message Authentication Code)`](https://ru.wikipedia.org/wiki/HMAC) для строки `data` (переданной в кодировке `UTF-8`) с использованием ключа `key` и алгоритма хэширования `algo`. Поддерживает [секреты](./secrets.md). Ключ `key` может быть передан в виде строки в кодировке `UTF-8` или в бинарном виде — инкапсулированным в объект [`BinaryData`](#binarydata). Аналогично методу `hash()`, полный список доступных алгоритмов хэширования `algo` может быть получен с помощью метода `getHmacHashAlgorithms()`. 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 8d98d45b..164cc1cc 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,7 +72,7 @@ setPositionEnd(): this; ```js setPositionChildOf(parentLongId: number): this; ``` -Устанавливает позицию добавления элемента как дочернего для [`parentLongId`](./views.md#long-id). Возвращает `this`. +Устанавливает позицию добавления элемента как дочернего для [`parentLongId`](./common.md#long-id). Возвращает `this`.   @@ -80,7 +80,7 @@ setPositionChildOf(parentLongId: number): this; ```js create(): number[]; ``` -Добавляет элементы и возвращает массив их [`longId`](./views.md#long-id). +Добавляет элементы и возвращает массив их [`longId`](./common.md#long-id).   @@ -132,7 +132,7 @@ interface ElementsDeleter { ```js appendIdentifier(identifier: number): this; ``` -Добавляет в буфер элемент, чей [`longId`](./views.md#long-id) равен `identifier`. Повторное добавление элемента в очередь **не** приводит к ошибкам. Возращает `this`. +Добавляет в буфер элемент, чей [`longId`](./common.md#long-id) равен `identifier`. Повторное добавление элемента в очередь **не** приводит к ошибкам. Возращает `this`.   @@ -161,7 +161,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/exportImport.md b/API/exportImport.md index a5e49842..550e25ee 100644 --- a/API/exportImport.md +++ b/API/exportImport.md @@ -20,8 +20,10 @@ interface Exporter { setDelimiter(delimiter: string): this; setEnclosure(enclosure: string): this; setEscape(escape: string): this; + setDecimalSeparator(decimalSeparator: string): this; setShowAliasesWithoutNames(showAliasesWithoutNames: boolean): this; setUseCodeLikeLabels(useCodeLikeLabels: boolean): this; + setSaveVisualSettings(saveVisualSettings: boolean): this; export(): ExportResult; } ``` @@ -107,6 +109,15 @@ setEscape(escape: string): this;   +```js +setDecimalSeparator(decimalSeparator: string): this; +``` +Устанавливает десятичный разделитель. Допустимые значения: `,`, `.`. По умолчанию: `.`. + +Для форматов `'xls'` и `'xlsx'` нужно устанавливать разделитель `.`, иначе Excel трактует значение как текст. Отображаемый разделитель в Excel зависит от системных настроек компьютера и настроек самого Excel. + +  + ```js setShowAliasesWithoutNames(showAliasesWithoutNames: boolean): this; ``` @@ -121,6 +132,19 @@ setUseCodeLikeLabels(useCodeLikeLabels: boolean): this;   +```js +setSaveVisualSettings(saveVisualSettings: boolean): this; +``` +Устанавливает флаг сохранения визуальных настроек для формата `'xlsx'`, без учета `CV`. + +- Ширина заголовка колонок в XLSX файле - соответствует установленной в веб-интерфейсе. +- Уровни иерархии справочников выделены жирным шрифтом по аналогии с веб-интерфейсом. +- Уровни иерархии справочников визуально выделяются "лесенкой" по аналогии с веб-интерфейсом. Импорт такого файла с итоговыми строками обратно в OM на данный момент недоступен. +- Процентные показатели в XLSX файле – отображены в виде процентов. +- Выгружается выбранное количество значащих десятичных разрядов. + +  + ```js export(): ExportResult; @@ -134,10 +158,8 @@ export(): ExportResult; interface StorageExporter extends Exporter { setFormat(format: string): this; setDelimiter(delimiter: string): this; - setLineDelimiter(lineDelimiter: string): this; setFilterFormula(filterFormula: string): this; - setDecimalSeparator(decimalSeparator: string): this; setDateFormat(dateFormat: string): this; setBooleanCubeIdentifier(booleanCubeIdentifier: number): this; } @@ -175,13 +197,6 @@ setFilterFormula(filterFormula: string): this;   -```js -setDecimalSeparator(decimalSeparator: string): this; -``` -Устанавливает десятичный разделитель. Допустимые значения: `,`, `.`. По умолчанию: `.`. - -  - ```js setDateFormat(dateFormat: string): this; diff --git a/API/fs.md b/API/fs.md index a9a206b1..16e07ff7 100644 --- a/API/fs.md +++ b/API/fs.md @@ -322,17 +322,17 @@ load(): Filesystem; ### Интерфейс FTPAdapter ```ts interface FTPAdapter extends BaseAdapter { - setHost(host: string): this; - getHost(): string; + setHost(host: string | SecretValue): this; + getHost(): string | SecretValue; - setPort(port: number): this; - getPort(): number; + setPort(port: number | SecretValue): this; + getPort(): number | SecretValue; - setUsername(username: string): this; - getUsername(): string | null; + setUsername(username: string | SecretValue): this; + getUsername(): string | SecretValue | null; - setPassword(password: string): this; - getPassword(): string | null; + setPassword(password: string | SecretValue): this; + getPassword(): string | SecretValue | null; setRoot(root: string): this; getRoot(): string; @@ -354,61 +354,61 @@ interface FTPAdapter extends BaseAdapter { } ``` -Интерфейс, реализующий шаблон проектирования [`строитель`](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)), для соединения с сервером [`FTP`](https://ru.wikipedia.org/wiki/FTP). Наследуется от интерфейса [`BaseAdapter`](#base-adapter). +Интерфейс, реализующий шаблон проектирования [`строитель`](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)), для соединения с сервером [`FTP`](https://ru.wikipedia.org/wiki/FTP). Наследуется от интерфейса [`BaseAdapter`](#base-adapter). Функции поддерживают [секреты](./secrets.md).   ```js -setHost(host: string): this; +setHost(host: string | SecretValue): this; ``` Устанавливает адрес хоста. По умолчанию: `''`. Возвращает `this`.   ```js -getHost(): string; +getHost(): string | SecretValue; ``` Возвращает адрес хоста.   ```js -setPort(port: number): this; +setPort(port: number | SecretValue): this; ``` Устанавливает номер порта. По умолчанию: `21`. Возвращает `this`.   ```js -getPort(): number; +getPort(): number | SecretValue; ``` Возвращает номер порта.   ```js -setUsername(username: string): this; +setUsername(username: string | SecretValue): this; ``` Устанавливает имя пользователя. Возвращает `this`.   ```js -getUsername(): string | null; +getUsername(): string | SecretValue | null; ``` Возвращает имя пользователя.   ```js -setPassword(password: string): this; +setPassword(password: string | SecretValue): this; ``` Устанавливает пароль. Возвращает `this`.   ```js -getPassword(): string | null; +getPassword(): string | SecretValue | null; ``` Возвращает пароль. diff --git a/API/http.md b/API/http.md index d5d7fc37..ef52816f 100644 --- a/API/http.md +++ b/API/http.md @@ -67,7 +67,7 @@ interface Params { clear(): boolean; } ``` -Интерфейс, представляющий набор параметров и их значений. +Интерфейс, представляющий набор параметров и их значений. Позволяет устанавливать значение [`SecretValue`](./secrets.md#secret-value). Секрет передаётся по сети в виде JSON строки, **не раскрывая** секретное значение.   @@ -274,39 +274,39 @@ fileBody(): FileRequestBody; ### Интерфейс Url ```ts interface Url { - setUrl(url: string): boolean; + setUrl(url: string | SecretValue): boolean; getUrl(): string; - setUrlPath(path: string): boolean; - getUrlPath(): string; + setUrlPath(path: string | SecretValue): boolean; + getUrlPath(): string | SecretValue; - setUrlScheme(scheme: string): boolean; - getUrlScheme(): string; + setUrlScheme(scheme: string | SecretValue): boolean; + getUrlScheme(): string | SecretValue; - setHost(host: string): boolean; - getHost(): string; + setHost(host: string | SecretValue): boolean; + getHost(): string | SecretValue; - setPort(port: number | string): boolean; - getPort(): number | null; + setPort(port: number | string | SecretValue): boolean; + getPort(): number | SecretValue | null; - setUser(user: string): boolean; - getUser(): string | null; + setUser(user: string | SecretValue): boolean; + getUser(): string | SecretValue | null; - setPassword(password: string): boolean; - getPassword(): string | null; + setPassword(password: string | SecretValue): boolean; + getPassword(): string | SecretValue | null; - setFragment(fragment: string): boolean; - getFragment(): string | null; + setFragment(fragment: string | SecretValue): boolean; + getFragment(): string | SecretValue | null; params(): UrlParams; } ``` -Интерфейс построения [`URL`](https://ru.wikipedia.org/wiki/URL). +Интерфейс построения [`URL`](https://ru.wikipedia.org/wiki/URL). Функции поддерживают [секреты](./secrets.md).   ```js -setUrl(url: string): boolean; +setUrl(url: string | SecretValue): boolean; ``` Устанавливает URL целиком. Возвращает `true`. @@ -315,103 +315,103 @@ setUrl(url: string): boolean; ```js getUrl(): string; ``` -Возвращает URL. +Возвращает URL или выбрасывает исключение `This interface call was denied for JS context`, если хотя бы одна из частей URL является секретом.   ```js -setUrlPath(path: string): boolean; +setUrlPath(path: string | SecretValue): boolean; ``` Устанавливает путь на сервере. Значение по умолчанию: `'\'`. Возвращает `true`.   ```js -getUrlPath(): string; +getUrlPath(): string | SecretValue; ``` Возвращает путь на сервере.   ```js -setUrlScheme(scheme: string): boolean; +setUrlScheme(scheme: string | SecretValue): boolean; ``` Устанавливает схему URL (протокол). Значение по умолчанию: `'http'`. Возвращает `true`.   ```js -getUrlScheme(): string; +getUrlScheme(): string | SecretValue; ``` Возвращает схему URL (протокол).   ```js -setHost(host: string): boolean; +setHost(host: string | SecretValue): boolean; ``` Устанавливает имя или адрес хоста. Значение по умолчанию: `''`. Возвращает `true`.   ```js -getHost(): string; +getHost(): string | SecretValue; ``` Возвращает имя или адрес хоста, установленное в URL.   ```js -setPort(port: number | string): boolean; +setPort(port: number | string | SecretValue): boolean; ``` Устанавливает номер порта. Возвращает `true`.   ```js -getPort(): number | null; +getPort(): number | SecretValue | null; ``` Возвращает номер порта или `null`, если он не установлен.   ```js -setUser(user: string): boolean; +setUser(user: string | SecretValue): boolean; ``` Устанавливает имя пользователя. Возвращает `true`.   ```js -getUser(): string | null; +getUser(): string | SecretValue | null; ``` Возвращает имя пользователя или `null`, если оно не установлено.   ```js -setPassword(password: string): boolean; +setPassword(password: string | SecretValue): boolean; ``` Устанавливает пароль. Возвращает `true`.   ```js -getPassword(): string | null; +getPassword(): string | SecretValue | null; ``` Возвращает пароль или `null`, если он не установлен.   ```js -setFragment(fragment: string): boolean; +setFragment(fragment: string | SecretValue): boolean; ``` Устанавливает идентификатор якоря. Возвращает `true`.   ```js -getFragment(): string | null; +getFragment(): string | SecretValue | null; ``` Возвращает идентификатор якоря или `null`, если он не установлен. @@ -520,25 +520,25 @@ getProtocols(): string[]; ### Интерфейс HttpAuth ```ts interface HttpAuth { - setUser(user: string): this; - setPassword(password: string): this; + setUser(user: string | SecretValue): this; + setPassword(password: string | SecretValue): this; setType(type: string): this; setStatus(status: boolean): this; } ``` -Интерфейс, реализующий шаблон проектирования [`строитель`](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)), для настроек аутентификации HTTP. Все функции возвращают `this`. +Интерфейс, реализующий шаблон проектирования [`строитель`](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)), для настроек аутентификации HTTP. Все функции возвращают `this`. Функции поддерживают [секреты](./secrets.md).   ```js -setUser(user: string): this; +setUser(user: string | SecretValue): this; ``` Устанавливает имя пользователя.   ```js -setPassword(password: string): this; +setPassword(password: string | SecretValue): this; ``` Устанавливает пароль. diff --git a/API/mongoDB.md b/API/mongoDB.md index 9eb1e886..154caa3a 100644 --- a/API/mongoDB.md +++ b/API/mongoDB.md @@ -7,24 +7,24 @@ ## Интерфейс ConnectorBuilder ```ts interface ConnectorBuilder { - setDSN(value: string): this; - setDatabase(value: string): this; + setDSN(value: string | SecretValue): this; + setDatabase(value: string | SecretValue): this; load(): Connection; } ``` -Интерфейс, реализующий шаблон проектирования [`строитель`](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)), для настройки подключения к [`MongoDB`](https://ru.wikipedia.org/wiki/MongoDB). +Интерфейс, реализующий шаблон проектирования [`строитель`](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)), для настройки подключения к [`MongoDB`](https://ru.wikipedia.org/wiki/MongoDB). Функции для установки параметров подключения поддерживают [секреты](./secrets.md).   ```js -setDSN(value: string): this; +setDSN(value: string | SecretValue): this; ``` Устанавливает [`DSN`](https://www.mongodb.com/docs/manual/reference/connection-string/) для подключения. См. [документацию](https://docs.mongodb.com/bi-connector/master/tutorial/create-system-dsn/) по созданию DSN. Возвращает `this`.   ```js -setDatabase(value: string): this; +setDatabase(value: string | SecretValue): this; ``` Устанавливает имя базы данных. Возвращает `this`. diff --git a/API/pic/secret_json_mode.png b/API/pic/secret_json_mode.png new file mode 100644 index 00000000..2ac20820 Binary files /dev/null and b/API/pic/secret_json_mode.png differ 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/relationalDB.md b/API/relationalDB.md index 6399c13a..5b61bcc2 100644 --- a/API/relationalDB.md +++ b/API/relationalDB.md @@ -130,48 +130,48 @@ qb(): SqlQueryBuilder; ### Интерфейс SqlConnectorBuilder ```ts interface SqlConnectorBuilder { - setHost(value: string): this; - setPort(value: number): this; - setUsername(value: string): this; - setPassword(value: string): this; - setDatabase(value: string): this; + setHost(value: string | SecretValue): this; + setPort(value: number | SecretValue): this; + setUsername(value: string | SecretValue): this; + setPassword(value: string | SecretValue): this; + setDatabase(value: string | SecretValue): this; load(): SqlConnection; } ``` -Интерфейс, реализующий шаблон проектирования [`строитель`](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)), базовый интерфейс [`коннекторов`](../appendix/glossary.md#connector) для подключения к реляционной базе данных. +Интерфейс, реализующий шаблон проектирования [`строитель`](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)), базовый интерфейс [`коннекторов`](../appendix/glossary.md#connector) для подключения к реляционной базе данных. Функции для установки параметров подключения поддерживают [секреты](./secrets.md).   ```js -setHost(value: string): this; +setHost(value: string | SecretValue): this; ``` Устанавливает адрес подключения. Возвращает `this`.   ```js -setPort(value: number): this; +setPort(value: number | SecretValue): this; ``` Устанавливает номер порта для подключения. Возвращает `this`.   ```js -setUsername(value: string): this; +setUsername(value: string | SecretValue): this; ``` Устанавливает имя пользователя. Возвращает `this`.   ```js -setPassword(value: string): this; +setPassword(value: string | SecretValue): this; ``` Устанавливает пароль. Возвращает `this`.   ```js -setDatabase(value: string): this; +setDatabase(value: string | SecretValue): this; ``` Устанавливает имя базы данных. Возвращает `this`. @@ -289,32 +289,32 @@ loadBulkCopyBuilder(): SqlBulkCopyBuilder; ### Интерфейс OracleConnectorBuilder ```ts interface OracleConnectorBuilder extends SqlConnectorBuilder { - setServiceName(value: string): this; - setSchema(value: string): this; - setTNS(value: string): this; + setServiceName(value: string | SecretValue): this; + setSchema(value: string | SecretValue): this; + setTNS(value: string | SecretValue): this; loadImportBuilder(): OracleImportBuilder; } ``` -[`Коннектор`](../appendix/glossary.md#connector) для подключения к базе данных [`Oracle`](https://ru.wikipedia.org/wiki/Oracle_Database). Все функции возвращают `this`. Интерфейс наследуется от [`SqlConnectorBuilder`](#sql-connector-builder). +[`Коннектор`](../appendix/glossary.md#connector) для подключения к базе данных [`Oracle`](https://ru.wikipedia.org/wiki/Oracle_Database). Все функции возвращают `this`. Интерфейс наследуется от [`SqlConnectorBuilder`](#sql-connector-builder). Функции для установки параметров подключения поддерживают [секреты](./secrets.md).   ```js -setServiceName(value: string): this; +setServiceName(value: string | SecretValue): this; ``` Устанавливает имя службы (SERVICE_NAME). SERVICE_NAME определяет одно или ряд имен для подключения к одному экземпляру базы данных. Возможные значения SERVICE_NAME указываются в сетевых установках Oracle и регистрируются в качестве службы БД процессом listener.   ```js -setSchema(value: string): this; +setSchema(value: string | SecretValue): this; ``` Устанавливает [`схему`](https://docs.oracle.com/cd/E11882_01/server.112/e10897/schema.htm).   ```js -setTNS(value: string): this; +setTNS(value: string | SecretValue): this; ``` Устанавливает имя службы TNS. Протокол TNS (Transparent Network Substrate) — уровень связи, используемый базами данных Oracle. Имя службы TNS — это имя, с которым экземпляр базы данных Oracle представлен в сети. Имя службы TNS назначается при настройке подключений к базе данных Oracle. @@ -330,28 +330,28 @@ loadImportBuilder(): OracleImportBuilder; ### Интерфейс SnowflakeConnectorBuilder ```ts interface SnowflakeConnectorBuilder extends SqlConnectorBuilder { - setAccount(account: string): this; - setRegion(region: string): this; + setAccount(account: string | SecretValue): this; + setRegion(region: string | SecretValue): this; setInsecure(insecure: boolean): this; - setWarehouse(warehouse: string): this; - setSchema(schema: string): this; - setRole(role: string): this; + setWarehouse(warehouse: string | SecretValue): this; + setSchema(schema: string | SecretValue): this; + setRole(role: string | SecretValue): this; setProtocol(protocol: string): this; } ``` -[`Коннектор`](../appendix/glossary.md#connector) для подключения к базе данных [`Snowflake`](https://en.wikipedia.org/wiki/Snowflake_Inc%2E) (для подключения используется [PHP PDO Driver](https://docs.snowflake.com/en/user-guide/php-pdo-driver.html)). Все функции возвращают `this`. Интерфейс наследуется от [`SqlConnectorBuilder`](#sql-connector-builder). +[`Коннектор`](../appendix/glossary.md#connector) для подключения к базе данных [`Snowflake`](https://en.wikipedia.org/wiki/Snowflake_Inc%2E) (для подключения используется [PHP PDO Driver](https://docs.snowflake.com/en/user-guide/php-pdo-driver.html)). Все функции возвращают `this`. Интерфейс наследуется от [`SqlConnectorBuilder`](#sql-connector-builder). Функции поддерживают [секреты](./secrets.md).   ```js -setAccount(account: string): this; +setAccount(account: string | SecretValue): this; ``` Устанавливает [`имя аккаунта`](https://docs.snowflake.com/en/sql-reference/account-usage.html).   ```js -setRegion(region: string): this; +setRegion(region: string | SecretValue): this; ``` Устанавливает [`имя региона`](https://docs.snowflake.com/en/user-guide/admin-account-identifier.html). Опциональный. @@ -365,21 +365,21 @@ setInsecure(insecure: boolean): this;   ```js -setWarehouse(warehouse: string): this; +setWarehouse(warehouse: string | SecretValue): this; ``` Устанавливает [`название хранилища`](https://docs.snowflake.com/en/user-guide/warehouses-overview.html). Опциональный.   ```js -setSchema(value: string): this; +setSchema(value: string | SecretValue): this; ``` Устанавливает [`схему`](https://docs.snowflake.com/en/sql-reference/info-schema.html). Опциональный, по умолчанию `public`.   ```js -setRole(role: string): this; +setRole(role: string | SecretValue): this; ``` Устанавливает [`имя роли`](https://docs.snowflake.com/en/user-guide/security-access-control-overview.html#roles). Опциональный. @@ -610,7 +610,7 @@ getStats(): Object; ```js interface PostgresqlImportBuilder { setTable(name: string): this; - setSchema(name: string): this; + setSchema(name: string | SecretValue): this; setDelimiter(delimiter: string): this; setEnclosure(enclosure: string): this; setEscape(escape: string): this; @@ -632,9 +632,9 @@ setTable(name: string): this;   ```js -setSchema(name: string): this; +setSchema(name: string | SecretValue): this; ``` -Устанавливает [схему](https://www.postgresql.org/docs/current/ddl-schemas.html). +Устанавливает [схему](https://www.postgresql.org/docs/current/ddl-schemas.html). Поддерживает [секреты](./secrets.md).   @@ -724,11 +724,11 @@ getCommand(): string; ### Интерфейс SqlBulkCopyBuilder ```ts interface SqlBulkCopyBuilder { - setServerName(value: string): this; - setPort(value: number): this; - setUsername(value: string): this; - setPassword(value: string): this; - setDatabase(value: string): this; + setServerName(value: string | SecretValue): this; + setPort(value: number | SecretValue): this; + setUsername(value: string | SecretValue): this; + setPassword(value: string | SecretValue): this; + setDatabase(value: string | SecretValue): this; setQuery(value: string): this; setPacketSize(size: number): this; setBatchSize(size: number): this; @@ -760,7 +760,7 @@ interface SqlBulkCopyBuilder { format(path: string, xml: boolean): SqlBulkCopyResult; } ``` -Интерфейс, реализующий шаблон проектирования [`строитель`](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)), для импорта в СУБД MS SQL из файла CSV с помощью утилиты [*bcp*](https://docs.microsoft.com/ru-ru/sql/tools/bcp-utility). Все функции, начинающиеся с `set...()`, возвращают `this`. +Интерфейс, реализующий шаблон проектирования [`строитель`](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)), для импорта в СУБД MS SQL из файла CSV с помощью утилиты [*bcp*](https://docs.microsoft.com/ru-ru/sql/tools/bcp-utility). Все функции, начинающиеся с `set...()`, возвращают `this`. Функции для установки параметров подключения поддерживают [секреты](./secrets.md). Порядок полей в файле CSV и таблице должен строго совпадать, даже при импорте в таблицу с полем [`IDENTITY`](https://docs.microsoft.com/ru-ru/sql/t-sql/statements/create-table-transact-sql-identity-property), так как в утилите *bcp* имеется баг, из-за которого работоспособность функций [`setFormatFile()`](#sql-bulk-copy-builder.set-format-file) и [`format()`](#sql-bulk-copy-builder.format) не гарантирована. @@ -768,34 +768,34 @@ interface SqlBulkCopyBuilder { ```js -setServerName(value: string): this; +setServerName(value: string | SecretValue): this; ``` Устанавливает экземпляр SQL Server, к которому устанавливается подключение; [`опция`](https://docs.microsoft.com/ru-ru/sql/tools/bcp-utility#S) *bcp*: *-S*.   ```js -setPort(value: number): this; +setPort(value: number | SecretValue): this; ``` Устанавливает номер порта соединения. По умолчанию: `1433`.   ```js -setUsername(value: string): this; +setUsername(value: string | SecretValue): this; ``` Устанавливает имя пользователя; [`опция`](https://docs.microsoft.com/ru-ru/sql/tools/bcp-utility#U) *bcp*: *-U*.   ```js -setPassword(value: string): this; +setPassword(value: string | SecretValue): this; ``` -Устанавливает имя пользователя; [`опция`](https://docs.microsoft.com/ru-ru/sql/tools/bcp-utility#P) *bcp*: *-P*. +Устанавливает пароль пользователя; [`опция`](https://docs.microsoft.com/ru-ru/sql/tools/bcp-utility#P) *bcp*: *-P*.   ```js -setDatabase(value: string): this; +setDatabase(value: string | SecretValue): this; ``` Устанавливает имя БД, к которой произойдёт подключение; [`опция`](https://docs.microsoft.com/ru-ru/sql/tools/bcp-utility#d) *bcp*: *-d*. diff --git a/API/scriptChains.md b/API/scriptChains.md index 835d42f8..5777e1a9 100644 --- a/API/scriptChains.md +++ b/API/scriptChains.md @@ -18,10 +18,11 @@ 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) скрипта.   + ```js makeCodeExecutionAction(code: string): CodeExecutionAction; ``` @@ -32,28 +33,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) представления.   @@ -154,6 +155,8 @@ appendAfter(): this; В такой ситуации скрипты исполнятся в следующем порядке: `3 -> 4 -> 5 -> 1 -> 2`. +Запущенный таким образом скрипт унаследует идентификатор [запроса](../appendix/glossary.md#request) от своего родителя. +   ```js @@ -290,7 +293,15 @@ setTaskDescription(description: string): this; ```js run(): TaskPromise | null; ``` -Запускает скрипт с помощью асинхронного механизма выполнения. Вызов метода породит задачу, которая не будет дожидаться завершения текущей задачи, а будет выполняться сразу. Так как родительская задача не завершается и может работать параллельно с дочерней, то важно следить за совместимостью режимов блокировок родительской и дочерней задач (иначе можно попасть в `dead lock`). На данный момент существует защита от погружения в бесконечную рекурсию и задача, запущенная через `run()`, не может сама использовать этот метод. Если до запуска скрипта был вызван метод `withPromise(true)`, возвращает [`TaskPromise`](#task-promise), иначе — `null`. +Запускает скрипт с помощью асинхронного механизма выполнения. Вызов метода породит задачу, которая не будет дожидаться завершения текущей задачи, а будет выполняться сразу. + +Так как родительская задача не завершается и может работать параллельно с дочерней, то важно следить за совместимостью режимов блокировок родительской и дочерней задач (иначе можно попасть в `dead lock`). + +На данный момент существует защита от погружения в бесконечную рекурсию и задача, запущенная через `run()`, не может сама использовать этот метод. + +Запущенный таким образом скрипт будет считаться порождённым системой и получит системный идентификатор [запроса](../appendix/glossary.md#request), даже если родительский скрипт был запущен пользователем. + +Если до запуска скрипта был вызван метод `withPromise(true)`, возвращает [`TaskPromise`](#task-promise), иначе — `null`.   @@ -310,7 +321,7 @@ interface CodeExecutionAction extends BaseCodeExecutionAction { setTimeLimit(value: number): this; } ``` -Интерфейс действия запуска динамического кода. Наследуется от [`BaseCodeExecutionAction`](#base-code-execution-action). +Интерфейс действия запуска динамического кода. Наследуется от [`BaseCodeExecutionAction`](#base-code-execution-action). Скрипты, порождённые этим интерфейсом, не имеют имени и [`longId`](./common.md#long-id).   diff --git a/API/scripts.om.d.ts b/API/scripts.om.d.ts index ffe60e50..b1bc1375 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; @@ -125,8 +141,10 @@ export interface Exporter { setDelimiter(delimiter: string): this; setEnclosure(enclosure: string): this; setEscape(escape: string): this; + setDecimalSeparator(decimalSeparator: string): this; setShowAliasesWithoutNames(showAliasesWithoutNames: boolean): this; setUseCodeLikeLabels(useCodeLikeLabels: boolean): this; + setSaveVisualSettings(saveVisualSettings: boolean): this; export(): ExportResult; } @@ -228,7 +246,6 @@ export interface CubeInfo extends EntityInfo { export interface StorageExporter extends Exporter { setLineDelimiter(lineDelimiter: string): this; setFilterFormula(filterFormula: string): this; - setDecimalSeparator(decimalSeparator: string): this; setDateFormat(dateFormat: string): this; setBooleanCubeIdentifier(booleanCubeIdentifier: number): this; } @@ -565,6 +582,9 @@ export interface RequestManager { log(message: string, print?: boolean): this; logStatusMessage(message: string, print?: boolean): this; setStatusMessage(message: string): this; + getRequestId(): string | null; + getScriptName(): string | null; + getScriptLongId(): string | null; } export interface UserInfo { @@ -767,7 +787,7 @@ export interface ResultInfo { export interface EntitiesInfo { get(longId: number): EntityInfo | null; - getCollection(longId: number[]): EntityInfo[]; + getCollection(longId: number[]): (EntityInfo | null)[]; } export interface CopyData { @@ -787,20 +807,20 @@ export interface BinaryData { } export interface Crypto { - sha1(data: string): string; + sha1(data: string | SecretValue): string; /** * * @param algo available values can be retrieved by getHashAlgorithms() * @param binary defaults to false */ - hash(algo: string, data: string, binary?: boolean): string | BinaryData; + hash(algo: string, data: string | SecretValue , binary?: boolean): string | BinaryData; /** * * @param algo available values can be retrieved by getHmacHashAlgorithms() * @param binary defaults to false */ - hmac(algo: string, data: string, key: string | BinaryData, binary?: boolean): string | BinaryData; + hmac(algo: string, data: string | SecretValue, key: string | BinaryData, binary?: boolean): string | BinaryData; getHashAlgorithms(): string[]; getHmacAlgorithms(): string[]; @@ -872,17 +892,17 @@ export interface BaseAdapter { } export interface FTPAdapter extends BaseAdapter { - setHost(host: string): this; - getHost(): string; + setHost(host: string | SecretValue): this; + getHost(): string | SecretValue; - setPort(port: number): this; - getPort(): number; + setPort(port: number | SecretValue): this; + getPort(): number | SecretValue; - setUsername(username: string): this; - getUsername(): string | null; + setUsername(username: string | SecretValue): this; + getUsername(): string | SecretValue | null; - setPassword(password: string): this; - getPassword(): string | null; + setPassword(password: string | SecretValue): this; + getPassword(): string | SecretValue | null; setRoot(root: string): this; getRoot(): string; @@ -981,11 +1001,11 @@ export interface SqlConnection { } export interface SqlConnectorBuilder { - setHost(value: string): this; - setPort(value: number): this; - setUsername(value: string): this; - setPassword(value: string): this; - setDatabase(value: string): this; + setHost(value: string | SecretValue): this; + setPort(value: number | SecretValue): this; + setUsername(value: string | SecretValue): this; + setPassword(value: string | SecretValue): this; + setDatabase(value: string | SecretValue): this; load(): SqlConnection; } @@ -1001,31 +1021,31 @@ export interface SqlBulkCopyBuilder { * -S * @param value */ - setServerName(value: string): this; + setServerName(value: string | SecretValue): this; /** * Port is part of server name * @param value */ - setPort(value: number): this; + setPort(value: number | SecretValue): this; /** * -U * @param value */ - setUsername(value: string): this; + setUsername(value: string | SecretValue): this; /** * -P * @param value */ - setPassword(value: string): this; + setPassword(value: string | SecretValue): this; /** * -d * @param value */ - setDatabase(value: string): this; + setDatabase(value: string | SecretValue): this; /** * Query for export or table query string for import @@ -1211,9 +1231,9 @@ export interface OracleImportBuilder { } export interface OracleConnectorBuilder extends SqlConnectorBuilder { - setServiceName(value: string): this; - setSchema(value: string): this; - setTNS(value: string): this; + setServiceName(value: string | SecretValue): this; + setSchema(value: string | SecretValue): this; + setTNS(value: string | SecretValue): this; loadImportBuilder(): OracleImportBuilder; } @@ -1323,8 +1343,8 @@ export namespace Mongodb { } export interface ConnectorBuilder { - setDSN(value: string): this; - setDatabase(value: string): this; + setDSN(value: string | SecretValue): this; + setDatabase(value: string | SecretValue): this; load(): Connection; } } @@ -1391,29 +1411,29 @@ export namespace Http { } export interface Url { - setUrl(url: string): boolean; + setUrl(url: string | SecretValue): boolean; getUrl(): string; - setUrlPath(path: string): boolean; - getUrlPath(): string; + setUrlPath(path: string | SecretValue): boolean; + getUrlPath(): string | SecretValue; - setUrlScheme(scheme: string): boolean; - getUrlScheme(): string; + setUrlScheme(scheme: string | SecretValue): boolean; + getUrlScheme(): string | SecretValue; - setHost(host: string): boolean; - getHost(): string; + setHost(host: string | SecretValue): boolean; + getHost(): string | SecretValue; - setPort(port: number | string): boolean; - getPort(): number | null; + setPort(port: number | string | SecretValue): boolean; + getPort(): number | SecretValue | null; - setUser(user: string): boolean; - getUser(): string | null; + setUser(user: string | SecretValue): boolean; + getUser(): string | SecretValue | null; - setPassword(password: string): boolean; - getPassword(): string | null; + setPassword(password: string | SecretValue): boolean; + getPassword(): string | SecretValue | null; - setFragment(fragment: string): boolean; - getFragment(): string | null; + setFragment(fragment: string | SecretValue): boolean; + getFragment(): string | SecretValue | null; params(): UrlParams; } @@ -1454,8 +1474,8 @@ export namespace Http { } export interface HttpAuth { - setUser(user: string): this; - setPassword(password: string): this; + setUser(user: string | SecretValue): this; + setPassword(password: string | SecretValue): this; /** * @param type basic|digest|ntlm */ @@ -1584,8 +1604,8 @@ export namespace WinAgent { } export interface WinAgentBuilder { - setCommandUrl(url: string): this; - setDownloadUrl(url: string): this; + setCommandUrl(url: string | SecretValue): this; + setDownloadUrl(url: string | SecretValue): this; auth(): Http.HttpAuth; setConnectTimeout(sec: number): this; setRequestTimeout(sec: number): this; @@ -1631,7 +1651,7 @@ export interface MysqlImportBuilder { export interface PostgresqlImportBuilder { setTable(name: string): this; - setSchema(name: string): this; + setSchema(name: string | SecretValue): this; setDelimiter(delimiter: string): this; setEnclosure(enclosure: string): this; setEscape(escape: string): this; @@ -1654,20 +1674,104 @@ export interface PgsqlDrivenVerticaConnectorBuilder extends PostgresqlConnectorB } export interface SnowflakeConnectorBuilder extends SqlConnectorBuilder { - setAccount(account: string): this; - setRegion(region: string): this; + setAccount(account: string | SecretValue): this; + setRegion(region: string | SecretValue): this; /** * Configuring OCSP Checking * Default is false * @param insecure */ setInsecure(insecure: boolean): this; - setWarehouse(warehouse: string): this; - setSchema(schema: string): this; - setRole(role: string): this; + setWarehouse(warehouse: string | SecretValue): this; + setSchema(schema: string | SecretValue): this; + setRole(role: string | SecretValue): this; setProtocol(protocol: string): this; } +export interface ClickhouseConnectorBuilder { + setHost(value: string | SecretValue): this; + setPort(value: number | SecretValue): this; + setUsername(value: string | SecretValue): this; + setPassword(value: string | SecretValue): this; + setDatabase(value: string | SecretValue): this; + setHttps(value: boolean): this; + load(): ClickhouseConnection; +} + +export interface ClickhouseConnection { + qb(): ClickhouseQueryBuilder; +} + +export interface ClickhouseQueryBuilder { + /** + * @param columns Default is ['*'] + */ + select(columns?: string[]): this; + addSelect(column: string): this; + addSelectRaw(expression: string): this; + /** + * @param columns Default is ['*'] + */ + distinct(columns?: string[]): this; + /** + * @param table + * @param alias Default is null + */ + setFrom(table: string, alias?: string | null): this; + /** + * @param table + * @param alias Default is null + */ + setTable(table: string, alias?: string | null): this; + /** + * @param column + * @param operator + * @param value + * @param concatOperator 'AND'|'OR'; Default is 'AND' + */ + where(column: string, operator: string, value: any[] | any, concatOperator?: string): this; + orWhere(column: string, operator: string, value: any[] | any): this; + /** + * @param column + * @param values + * @param concatOperator 'AND'|'OR'; Default is 'AND' + * @param not Default is false + */ + whereIn(column: string, values: any[], concatOperator?: string, not?: boolean): this; + /** + * @param column + * @param minValue + * @param maxValue + * @param concatOperator 'AND'|'OR'; Default is 'AND' + * @param not Default is false + */ + whereBetween(column: string, minValue: string | number, maxValue: string | number, concatOperator?: string, not?: boolean): this; + orWhereBetween(column: string, minValue: string | number, maxValue: string | number): this; + /** + * @param column + * @param direction 'ASC'|'DESC'; Default is 'ASC' + */ + orderBy(column: string, direction?: string): this; + orderByDesc(column: string): this; + groupBy(column: string): this; + limit(count: number, offset?: number): this; + exists(): boolean; + count(): number; + sum(column: string): number; + truncate(): boolean; + insert(values: Object[] | Object): boolean; + get(): ClickhouseQueryResult; + exportToCsv(path: string, ignoreHeader?: boolean): number; +} + +export interface ClickhouseQueryResult { + count(): number; + generator(): IterableIterator; + all(): Object[]; + first(): Object | null; + column(columnName: string): any[]; +} + export interface Connectors { mysql(): MysqlConnectorBuilder; postgresql(): PostgresqlConnectorBuilder; @@ -1682,6 +1786,7 @@ export interface Connectors { */ winAgent(builtIn?: boolean): WinAgent.WinAgentBuilder; verticaViaPgsqlDriver(): PgsqlDrivenVerticaConnectorBuilder; + clickhouse(): ClickhouseConnectorBuilder; } export namespace Notifications { @@ -1776,6 +1881,21 @@ export interface WorkspaceUsersTab extends Tab { export interface ModelUsersTab extends Tab { } +export interface Secrets { + getStorage(vaultId: string): SecretStorage; +} + +export interface SecretStorage { + getSecret(path: string, key: string): SecretValue; +} + +export interface SecretValue { + getStorageIdentifier(): string; + getPath(): string; + getKey(): string; + toJson(): Object; +} + export interface OM { readonly common: Common; readonly environment: Environment; @@ -1792,6 +1912,7 @@ export interface OM { readonly audit: Audit; readonly crypto: Crypto; readonly users: Users; + readonly secrets: Secrets; } export var om: OM; diff --git a/API/secrets.md b/API/secrets.md new file mode 100644 index 00000000..80cfbf5c --- /dev/null +++ b/API/secrets.md @@ -0,0 +1,163 @@ +# Секреты + +Для хранения чувствительных данных (логины, пароли, хеши) пользователи могут воспользоваться сервисом защищённого хранилища секретов. Поддерживаются решения [OpenBao](https://openbao.org/) и [Hashicorp Vault](https://www.vaultproject.io/). OpenBao поставляется с дистрибутивом. У сервиса есть UI: `workspace_url/openbao/ui`. К хранилищу Hashicorp Vault можно настроить удаленный доступ. К воркспейсу могут быть подключены сразу несколько хранилищ. Доступ настраивается в манифесте воркспейса администратором. + +Клиенты записывают в защищённое хранилище важные данные, чтобы затем использовать в скриптах. Такие данные называются **секретами**. Они бывают разных видов. В данный момент приложением поддерживается один тип - `ключ-значение`. + +**Важно!** Запись в хранилище данных в формате, отличном от строкового (например, порт подключения является числом), необходимо выполнять в режиме JSON, иначе они будут трактоваться как строка. + +![Режим JSON в хранилище секретов](./pic/secret_json_mode.png) + +  + +## Интерфейс Secrets +```ts +interface Secrets { + getStorage(vaultId: string): SecretStorage; +} +``` +Интерфейс для доступа к секретам. + +  + +```js +getStorage(vaultId: string): SecretStorage; +``` +Возвращает хранилище [`SecretStorage`](#secret-storage) с идентификатором `vaultId`. + +Список подключенных хранилищ и их идентификаторы `id` можно посмотреть в панели администратора воркспейса в разделе `Secrets`. В одном скрипте можно обращаться к любому из них или сразу к нескольким. + +  + +## Интерфейс SecretStorage +```ts +interface SecretStorage { + getSecret(path: string, key: string): SecretValue; +} +``` +Интерфейс для работы с защищённым хранилищем секретов. + +  + +```js +getSecret(path: string, key: string): SecretValue; +``` +Возвращает секрет [`SecretValue`](#secret-value). + +Секреты в хранилищах хранятся в иерархиях. +``` +/secret/path-to-secrets +|--- secret-key-1 +|--- secret-key-2 +``` + +Получить секрет можно, зная путь `path`, по которому он лежит в хранилище, и название ключа секрета `key`. + +  + +## Интерфейс SecretValue +```ts +interface SecretValue { + getStorageIdentifier(): string; + getPath(): string; + getKey(): string; + toJson(): Object; +} +``` +Объект секрета. **Обратите внимание, что значения секрета в объекте нет.** Он только содержит информацию о секрете. Так сделано для безопасности. Значения считываются из хранилища только внутри приложения Optimacros. Этот объект нужно передавать в методы API скриптов, которые поддерживают секреты, вместо простых типов данных. Приложение само сделает запрос в хранилище и подставит значение секрета. + +Опознать методы с поддержкой секретов можно по сигнатуре `setPassword(password: string | SecretValue): this;`. Появляется выбор - использовать простой тип данных или секрет. Проверка типа значения также работает на секретах. Если тип не совпадет с тем, который ожидается методом, выбрасывается ошибка. + +  + +```js +getStorageIdentifier(): string; +``` +Возвращает идентификатор хранилища. + +  + +```js +getPath(): string; +``` +Возвращает название папки, в которой находится секрет. + +  + +```js +getKey(): string; +``` +Возвращает название ключа секрета. + +  + +```js +toJson(): Object; +``` +Возвращает JSON-объект секрета вида +```ts +{ + "secret": true, + "params": { + "key": "secret-key", + "path": "secret-path", + "storageIdentifier": "vault-id", + }, +} +``` +Такой JSON-объект также можно передавать в методы с поддержкой секретов. Наличие ключа `secret` определяет объект как секрет вне зависимости от его значения. В текущей реализации для этого ключа необходимо всегда указывать значение `true`, иначе будет выбрасываться ошибка валидации объекта как секрета при передаче его в метод. + +  + +## Примеры + +Получение секрета из хранилища и передача его в метод API скриптов +```ts +const secret = om.secrets.getStorage('openbao-vault').getSecret('ftp-connection', 'host'); + +const ftp = om.filesystems.ftp(); + +ftp.setHost(secret); +``` + +  + +Самостоятельное создание JSON-объекта секрета и передача его в метод API скриптов +```ts +const secret = { + "secret": true, + "params": { + "key": "host", + "path": "ftp-connection", + "storageIdentifier": "openbao-vault", + }, +}; + +const ftp = om.filesystems.ftp(); + +ftp.setHost(secret); +``` + +  + +Передача секрета в дочерний скрипт в составе JSON-oбъекта +```ts +const secret = om.secrets.getStorage('openbao-vault').getSecret('secret-path', 'secret-key'); + +const ENV = { + SECRET: secret.toJson(), +}; + +om.common.resultInfo() + .actionsInfo() + .makeMacrosAction('next script') + .appendAfter() + .environmentInfo() + .set('ENV', ENV); +``` + +  + +[API Reference](./API.md) + +[Оглавление](../README.md) \ No newline at end of file diff --git a/API/users.md b/API/users.md index 40ab7515..3ee1472b 100644 --- a/API/users.md +++ b/API/users.md @@ -31,7 +31,7 @@ interface ModelUsersTab extends Tab { } ``` Вкладка `Пользователи модели`. Содержит пользователей модели и их настройки. Интерфейс наследуется от [`Tab`](./views.md#tab). -При изменении роли пользователя на `No Access` пользователь будет перемещен на вкладку `Другие пользователи сервера`, но изменение других полей этого же пользователя можно сделать в рамках того же генератора, в котором была изменена его роль. +При изменении роли пользователя на `No Access` или удалении всех его ролей пользователь будет перемещен на вкладку `Другие пользователи сервера`, но изменение других полей этого же пользователя можно сделать в рамках того же генератора, в котором была изменена его роль. [`Grid`](./views.md#grid) данного [`Tab`](./views.md#tab) доступен только пользователям с правами моделера. Со слов разработчиков [`Grid`](./views.md#grid) построен на том же справочнике, который находится в колонках настрек `UAM` пользлвательских справочников. Но `longId` этих измерений, полученные методами данного `API`, могут не совпадать. @@ -60,7 +60,7 @@ interface WorkspaceUsersTab extends Tab { Данный интерфейс и его [`Pivot`](./views.md#интерфейс-pivot) доступны только пользователям с правами администратора. -При изменение роли пользователя на любую кроме `No Acsess` пользователь будет перемещен на вкладку `Пользователи модели`, но изменение других полей этого же пользователя можно сделать в рамках того же генератора, в котором была изменена его роль. +При изменение роли пользователя на любую кроме `No Access` пользователь будет перемещен на вкладку `Пользователи модели`, но изменение других полей этого же пользователя можно сделать в рамках того же генератора, в котором была изменена его роль. [`Pivot`](./views.md#интерфейс-pivot) данного [`Tab`](./views.md#tab) построен на системном справочнике `User Workspace`, который аналогичен вкладке `Users` в панели администратора воркспейса и содержит всех пользователей воркспейса кроме тех, у кого есть доступ к данной модели. У данной таблицы есть только представление по умолчанию (доступно через вызов `pivot()` без аргументов или с аргументом `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 915ced19..5b6b587e 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,11 +217,11 @@ 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) строк. -Максимальный размер фильтра: `50000` строк. Если передать в фильтре большее количество строк, то метод не выбрасывает ошибку, но грид будет отфильтрован только по первым `50000` строкам в фильтре. +Максимальный размер фильтра: `50000` строк. Если передать в фильтре большее количество строк, то метод не выбрасывает ошибку, но грид будет отфильтрован только по первым `50000` строкам фильтра. Возвращает `this`. @@ -237,7 +237,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`. Эта функция существенно ускоряет работу в тех случаях, когда нужно записать данные, но не читать их. @@ -247,11 +247,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`. @@ -457,9 +457,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`. @@ -483,379 +483,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/API/winAgent.md b/API/winAgent.md index ec1b4315..16681e3d 100644 --- a/API/winAgent.md +++ b/API/winAgent.md @@ -13,8 +13,8 @@ WinAgent – сервис создания отчётов MS Word и Excel, ра ## Интерфейс WinAgentBuilder ```js interface WinAgentBuilder { - setCommandUrl(url: string): this; - setDownloadUrl(url: string): this; + setCommandUrl(url: string | SecretValue): this; + setDownloadUrl(url: string | SecretValue): this; auth(): Http.HttpAuth; setConnectTimeout(sec: number): this; setRequestTimeout(sec: number): this; @@ -22,19 +22,19 @@ interface WinAgentBuilder { makeRunMacrosAction(): RunMacroAction; } ``` -Интерфейс, реализующий шаблон проектирования [`строитель`](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)), для настройки доступа к WinAgent. +Интерфейс, реализующий шаблон проектирования [`строитель`](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)), для настройки доступа к WinAgent. Функции для установки параметров подключения поддерживают [секреты](./secrets.md).   ```js -setCommandUrl(url: string): this; +setCommandUrl(url: string | SecretValue): this; ``` Устанавливает [`URL`](https://ru.wikipedia.org/wiki/URL) агента, на который будут подаваться команды из скрипта. Возвращает `this`.   ```js -setDownloadUrl(url: string): this; +setDownloadUrl(url: string | SecretValue): this; ``` Устанавливает [`URL`](https://ru.wikipedia.org/wiki/URL), по которому можно будет скачивать результирующие документы. Возвращает `this`. 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/appendix/glossary.md b/appendix/glossary.md index 69ddbd89..b2cf87fa 100644 --- a/appendix/glossary.md +++ b/appendix/glossary.md @@ -13,6 +13,18 @@ ***Рабочая директория скрипта*** – временная папка на сервере, которая является рабочей директорией скрипта. Скрипт ***НЕ*** может выйти за её пределы. Перед запуском скрипта создаётся эта папка, скрипт запускает команду [`chroot`](https://ru.wikipedia.org/wiki/chroot) в неё, исполняется сам, после чего папка удаляется. + +***Запрос*** – последовательность операций, запущенных пользователем или системой. Запрос чтения и модификации данных создаёт контекст, который содержит: + +- идентификатор запроса, время поступления и время завершения, +- сам исходный запрос, идентификатор пользователя, модель, в контексте которой он выполняется, +- список агентов (воркеров), которые назначены для выполнения запроса, +- список шагов выполнения запроса, +- результат запроса (ответ на запрос). + +Запросы могут быть порождены пользователями, тогда они имеют идентификаторы вида `%латинские буквы и цифры%-%число, отличное от нуля%`. Если запрос порождён системой, то он будет иметь идентификатор вида `%латинские буквы и цифры%-0`. Скрипты, запущенные по расписанию или через систему API сервисов считаются системными. + +Запрос регистрируется в системе и может быть отменён, а также запрос логируется в системные журналы. Список активных запросов можно увидеть в панели администратора в разделе `Requests` на вкладке `Requests`. Рядом находится вкладка `History` с историей **пользовательских** запросов (системных запросов там нет). Системные запросы скриптов можно увидеть в web-интерфейсе Optimacros на вкладке `Macros` -> `Scripts` -> `Launch History`. [Приложения](appendix.md) diff --git a/changelog.md b/changelog.md index c3267c60..5053e0e4 100644 --- a/changelog.md +++ b/changelog.md @@ -2,7 +2,11 @@ | Дата релиза | Тег релиза | Версия ScriptAPI | Версии MiddleWork | Версия приложения | Изменения | | --- | --- | --- | --- | --- | --- | -| — | [v9.300](https://github.com/optimacros/scripts_documentation/tree/v9.300) | — |
  • 9.300
|
|
  • В интерфейсе [Filesystem](./API/fs.md#filesystem) изменены декларации функций `delete()`, `rename()`, `copy()`, `createDir()`, `deleteDir()`, `getSize()`
  • В интерфейс [CellBuffer](./API/common.md#cell-buffer) добавлена функция `lastApplyErrors()`
  • В интерфейсе [Importer](./API/exportImport.md#importer) исправлены исключения, которые могут бросать функции
| +| xx.xx.xxxx | [v9.300](https://github.com/optimacros/scripts_documentation/tree/v9.300) | — |
  • 9.300
|
|
  • В интерфейс экспорта из мультикубов и справочников [Exporter](./API/exportImport.md#exporter) добавлены методы `setDecimalSeparator()` и `setSaveVisualSettings()`
| +| xx.xx.xxxx | [v9.300](https://github.com/optimacros/scripts_documentation/tree/v9.300) | — |
  • 9.300
|
|
  • Добавлен интерфейс [Secrets](./API/secrets.md) для взаимодействия с сервисом защищённого хранилища секретов
  • В интерфейс [Connectors](./API/connectors.md#connectors) добавлен коннектор [`ClickhouseConnectorBuilder`](./clickhouse.md#clickhouse-connector-builder) для подключения к базе данных [`Clickhouse`](https://ru.wikipedia.org/wiki/ClickHouse)
| +| xx.xx.xxxx | [v9.300](https://github.com/optimacros/scripts_documentation/tree/v9.300) | — |
  • 9.300
|
|
  • В интерфейс информации о запросе [RequestManager](./API/common.md#request-manager) добавлены методы для получения информации о текущем исполняемом скрипте: `getRequestId()`, `getScriptName()`, `getScriptLongId()`
| +| xx.xx.xxxx | [v9.300](https://github.com/optimacros/scripts_documentation/tree/v9.300) | — |
  • 9.300
|
|
  • Интерфейсы доступа к содержимому грида — заголовкам и ячейкам — вынесены в отдельный файл [readingGrid.md](./API/readingGrid.md)
  • **Обратно несовместимо** переработан метод [`EntitiesInfo.getCollection()`](./API/common.md#entities-info.get-collection)
  • Добавлен интерфейс постраничного получения списка опций значений клетки [DropDownSelector](./API/readingGrid.md#dropdown-selector) и метод для получения доступа к нему — [`Cell.dropDownSelector()`](./API/readingGrid.md#cell.dropdown-selector)
  • Метод получения списка опций значений клетки [`Cell.dropDown()`](./API/readingGrid.md#cell.dropdown) признан устаревшим
| +| xx.xx.xxxx | [v9.300](https://github.com/optimacros/scripts_documentation/tree/v9.300) | — |
  • 9.300
|
|
  • В интерфейсе [Filesystem](./API/fs.md#filesystem) изменены декларации функций `delete()`, `rename()`, `copy()`, `createDir()`, `deleteDir()`, `getSize()`
  • В интерфейс [CellBuffer](./API/common.md#cell-buffer) добавлена функция `lastApplyErrors()`
  • В интерфейсе [Importer](./API/exportImport.md#importer) исправлены исключения, которые могут бросать функции
| | 11.02.2026 | [v9.200.164.109](https://github.com/optimacros/scripts_documentation/tree/v9.200.164.109) | — |
  • 9.200.164.109
|
  • 9.200.164.313
|
  • Добавлен метод управления проверкой SSL-сертификата при подключении к базе данных MySQL в интерфейсе [MysqlConnectorBuilder](./API/relationalDB.md#mysql-connector-builder)
| | 07.07.2025 | [v9.200](https://github.com/optimacros/scripts_documentation/tree/v9.?00.x.x) | — |
  • 9.200
|
  • 9.200
|
  • Интерфейс работы с лицензиями воркспейса `EnterpriseLicenseManager` заменён на новый интерфейс работы с данными договора о параметрах воркспейса [EnterpriseContractManager](./API/common.md#enterprise-contract-manager)
| | 07.07.2025 | [v9.200](https://github.com/optimacros/scripts_documentation/tree/v9.200.x.13) | — |
  • 9.200
|
  • 9.200
|
  • В интерфейс [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`); ![Измерения в фильтрах МК условия и расчёты 2, скрипт](./pic/rcf_FiltersReady2.png) -Необходимо заметить, что в выводе измерений столбцов `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",