diff --git a/README.md b/README.md
index b24a5cc..3b402a8 100644
--- a/README.md
+++ b/README.md
@@ -111,9 +111,10 @@ git clone https://git.citpb.ru/CITKParus/P8-Panels.git
При компиляции учитывайте следующее:
-- объекты `PKG_P8PANELS`, `PKG_P8PANELS_BASE`, `PKG_P8PANELS_VISUAL` и `P8PNL_SELECTLIST` - обязательны к компиляции. **Это ядро серверной части расширения. Без этих объектов его работа невозможна. Все остальные, перечисленные ниже объекты серверной части - прикладные, не обязательны к компиляции и на функционирование непосредственно фреймворка влияния не оказывают.**
+- объекты `PKG_P8PANELS`, `PKG_P8PANELS_BASE`, `PKG_P8PANELS_VISUAL`, `PKG_P8PANELS_SETTINGS`, `P8PNL_SETTINGS` и `P8PNL_SELECTLIST` и - обязательны к компиляции. **Это ядро серверной части расширения. Без этих объектов его работа невозможна. Все остальные, перечисленные ниже объекты серверной части - прикладные, не обязательны к компиляции и на функционирование непосредственно фреймворка влияния не оказывают.**
- объекты `PKG_P8PANELS_SAMPLES`, `P8PNL_SMPL_CYCLOGRAM` и `P8PNL_SMPL_GANTT` - обеспечивают работу панели "Samples" ("Примеры для разработчиков"). Это абстрактный набор примеров применения фреймворка, не привязанный жестко к комплектации Системы. Должен откомпилироваться практически в любой комплектации Системы (единственное требование - наличие словаря "Контрагенты").
- объекты `PKG_P8PANELS_PROJECTS`, `P8PNL_JB_JOBS`, `P8PNL_JB_JOBSPREV`, `P8PNL_JB_PERIODS`, `P8PNL_JB_PRJCTS` и `P8PNL_JB_PRMS` - могут быть откомпилированы в Системе, имеющей в комлектации приложения "Планирование и учёт в проектах" и "Управление закупками, складом и реализацией". Эти объекты отвечают за работу панелей группы "Планирование и учёт в проектах" ("PrjFin" - "Экономика проектов", "PrjJobs" - "Работы проектов", "PrjGraph" - "Графики проектов", "PrjInfo" - "Информация о проектах"). Компилируйте только если комлектация Системы включает указанные приложения.
+- объекты `I_P8PNL_*` - содержат индексы для загружаемых таблиц, **перед созданием индексов необходимо заменить в тексте файла шаблон `<ИМЯ_ИНДЕКСНОГО_ТАБЛИЧНОГО_ПРОСТРАНСТВА>` на имя индексного табличного пространства экземпляра БД**.
- объект `PKG_P8PANELS_CLNTTSKBRD` - может быть откомпилирован в Системе, имеющей в комлектации приложение "Управление деловыми процессами". Этот объект отвечает за работу панелей группы "Управление деловыми процессами" ("ClntTaskBoard" - "Доски задач"). Компилируйте только если комлектация Системы включает указанное приложение.
- объект `PKG_P8PANELS_MECHREC` - может быть откомпилирован в Системе, имеющей в комлектации приложение "Планирование и учёт в дискретном производстве". Этот объект отвечает за работу панелей группы "Планирование и учёт в дискретном производстве" ("MechRecCostProdPlans" - "Производственная программа", "MechRecDeptCostProdPlans" - "Производственный план цеха", "MechRecCostJobsManage" - "Выдача сменного задания", "MechRecCostJobsManageMP" - "Выдача сменного задания на участок", "MechRecDeptCostJobs" - "Загрузка цеха", "MechRecAssemblyMon" - "Мониторинг сборки изделий"). Компилируйте только если комлектация Системы включает указанное приложение.
- объект `PKG_P8PANELS_EQUIPSRV` - может быть откомпилирован в Системе, имеющей в комлектации приложение "Управление техническим обслуживанием и ремонтами". Этот объект отвечает за работу панелей группы "Управление техническим обслуживанием и ремонтами" ("EqsPrfrm" - "Выполнение работ по ТОиР"). Компилируйте только если комлектация Системы включает указанное приложение.
@@ -986,6 +987,397 @@ const P8Online = ({ title }) => {
```
+### API для взаимодействия с параметрами фреймворка
+
+Для работы с параметрами панелей в составе расширения предусмотрен специальный API. Его подключение к компоненте панели осуществляется через контекст `SettingsCtx` ("app/context/settings.js"). Данный контекст обеспечивает инициализацию, считывание и обновление параметров различных видов (системные, панельные, пользовательские).
+
+В состав API входят:
+
+- `SETTINGS_KINDS` - объект с константами видов параметров
+- `initSettings` - функция, инициализация параметров панелей
+- `getSettings` - функция, считывание параметров
+- `putSettings` - функция, добавление/обновление параметров
+- `showSettingsDialog` - функция, отображение диалога настройки параметров
+
+#### `SETTINGS_KINDS`
+
+Объект, содержащий константы видов параметров:
+
+```
+{
+ SYSTEM: 0,
+ PANEL: 1,
+ USER: 2
+}
+```
+
+- `SYSTEM` - Системные параметры, общие для всех панелей. Не требуют указания панели при работе.
+- `PANEL` - Параметры конкретной панели. Требуют указания панели (`panel`).
+- `USER` - Пользовательские параметры. Требуют указания панели (`panel`).
+
+#### `async Object initSettings(Object)`
+
+Инициализирует параметры панелей в БД Системы. Если параметры с указанными ключами уже существуют - будут перезаписаны.
+
+**Входные параметры:**
+
+```
+{
+ kind,
+ settings,
+ panel = null,
+ full = false,
+ loader = true
+}
+```
+
+`kind` - обязательный, число, вид параметров (`SETTINGS_KINDS.SYSTEM`, `SETTINGS_KINDS.PANEL` или `SETTINGS_KINDS.USER`)\
+`settings` - обязательный, объект, параметры для инициализации вида `{ "МНЕМОКОД_ПАРАМЕТРА": { name: <НАИМЕНОВАНИЕ>, dataType: <ТИП_ДАННЫХ>, value: <ЗНАЧЕНИЕ>, desc: <ОПИСАНИЕ>, options: {...} }, ... }`\
+`panel` - необязательный, строка, имя панели (требуется для `PANEL` и `USER`, игнорируется для `SYSTEM`)\
+`full` - необязательный, логический, признак возврата полного ответа сервера (по умолчанию `false`)\
+`loader` - необязательный, логический, признак отображения типового индикатора процесса
+
+**Результат:** объект с инициализированными параметрами (если `full = false`) или полный типовой ответ сервера (если `full = true`).
+
+**Особенности:**
+
+- Для вида `SYSTEM` параметр `panel` не требуется и игнорируется
+- Для видов `PANEL` и `USER` параметр `panel` обязателен, иначе будет выведена ошибка
+- Параметр `options` является необязательным, но если указан, то должен быть объект вида `{<КЛЮЧ>:<ЗНАЧЕНИЕ>, ...}`. Параметры поддерживают привязку к разделам системы, для этого требуется указать следующие `options` `{unitcode: <МНЕМОКОД_РАЗДЕЛА>, showMethod: <МЕТОД_РАЗДЕЛА>, inParameter: <ИМЯ_ВХОДНОГО_ПАРАМЕТРА>, outParameter: <ИМЯ_ВЫХОДНОГО_ПАРАМЕТРА>}`, все параметры являются обязательными
+- Функция выполняет обновление существующих параметров, обновляемые значения: `options`, `name`, `desc` и анализирует необходимость обновления значения, если `dataType` не соответствует инициализируемому - обновляет значение `value`, в ином случае значение не обновляется
+
+**Пример:**
+
+```
+import React, { useContext } from "react";
+import { SettingsCtx } from "../../context/settings";
+import { P8P_DATA_TYPES } from "../../core/data_types";
+
+//Инициализируемые параметры
+const INIT_SETTINGS = {
+ INFO: {
+ name: "Дополнительная информация",
+ dataType: P8P_DATA_TYPES.STR,
+ value: "Необходима проверка документов.",
+ desc: "Дополнительная информация для контрагента"
+ },
+ COUNT_DOCS: {
+ name: "Количество отображаемых документов",
+ dataType: P8P_DATA_TYPES.NUMB,
+ value: 10,
+ desc: ""
+ },
+ START_DATE: {
+ name: "Дата начала",
+ dataType: P8P_DATA_TYPES.DATE,
+ value: "2026-02-15",
+ desc: "Дата начала по умолчанию"
+ },
+ AGENT: {
+ name: "Выбранный контрагент",
+ dataType: P8P_DATA_TYPES.STR,
+ value: "",
+ desc: "Мнемокод выбранного контрагента",
+ options: {
+ unitcode: "AGNLIST",
+ showMethod: "main",
+ inParameter: "in_AGNABBR",
+ outParameter: "out_AGNABBR"
+ }
+ }
+};
+
+const MyPanel = () => {
+ //Собственное состояние - параметры
+ const [state, setState] = useState({});
+ //Подключение к контексту параметров
+ const { initSettings, SETTINGS_KINDS } = useContext(SettingsCtx);
+
+ //Инициализация параметров
+ const initializeSettings = async () => {
+ // Инициализация пользовательских параметров
+ const res = await initSettings({
+ kind: SETTINGS_KINDS.USER,
+ panel: "PanelName",
+ settings: INIT_SETTINGS
+ });
+ //Устанавливаем параметры
+ setState({ ...res });
+ };
+
+ return
...
;
+};
+```
+
+#### `async Object getSettings(Object)`
+
+Считывает параметры панелей из БД Системы.
+
+**Входные параметры:**
+
+```
+{
+ kind,
+ code = null,
+ panel = null,
+ full = false,
+ loader = true
+}
+```
+
+`kind` - обязательный, число, вид параметров (`SETTINGS_KINDS.SYSTEM`, `SETTINGS_KINDS.PANEL` или `SETTINGS_KINDS.USER`)\
+`code` - необязательный, строка, мнемокод параметра для отбора, при пустом значении считывает все доступные параметры\
+`panel` - необязательный, строка, имя панели (требуется для `PANEL` и `USER`, игнорируется для `SYSTEM`)\
+`full` - необязательный, логический, признак возврата полного ответа сервера с информацией о параметре (по умолчанию `false`)\
+`loader` - необязательный, логический, признак отображения типового индикатора процесса
+
+**Результат:** объект с считанными параметрами вида `{ <МНЕМОКОД_ПАРАМЕТРА>: <ЗНАЧЕНИЕ>, ... }` (если `full = false`) или полный ответ сервера (если `full = true`).
+
+**Особенности:**
+
+- Для вида `SYSTEM` параметр `panel` не требуется и игнорируется
+- Для видов `PANEL` и `USER` параметр `panel` рекомендуется указать для получения параметров конкретной панели
+- Возвращает только значения параметров, без метаданных (если `full = false`)
+
+**Пример:**
+
+```
+import React, { useContext, useState, useEffect } from "react";
+import { SettingsCtx } from "../../context/settings";
+
+const MyPanel = () => {
+ //Собственное состояние - параметры
+ const [state, setState] = useState({});
+ //Подключение к контексту параметров
+ const { getSettings, SETTINGS_KINDS } = useContext(SettingsCtx);
+
+ //Загрузка параметров пользователя
+ const handleLoadSettings = async () => {
+ // Считывание параметров панели
+ const settings = await getSettings({
+ kind: SETTINGS_KINDS.USER,
+ panel: "PanelName"
+ });
+ //Устанавливаем параметры
+ setState({ ...settings });
+ };
+
+ return
...
;
+};
+```
+
+#### `async Object putSettings(Object)`
+
+Добавляет или обновляет параметры панелей в БД Системы.
+
+**Входные параметры:**
+
+```
+{
+ kind,
+ settings,
+ panel = null,
+ loader = true
+}
+```
+
+`kind` - обязательный, число, вид параметров (`SETTINGS_KINDS.SYSTEM`, `SETTINGS_KINDS.PANEL` или `SETTINGS_KINDS.USER`)\
+`settings` - обязательный, объект, параметры для добавления/обновления вида `{ <МНЕМОКОД_ПАРАМЕТРА>: { name: <НАИМЕНОВАНИЕ>, dataType: <ТИП_ДАННЫХ>, value: <ЗНАЧЕНИЕ>, desc: <ОПИСАНИЕ>, options: {...} }, ... }`\
+`panel` - необязательный, строка, имя панели (требуется для `PANEL` и `USER`, игнорируется для `SYSTEM`)\
+`loader` - необязательный, логический, признак отображения типового индикатора процесса
+
+**Результат:** функция не возвращает значимого результата.
+
+**Особенности:**
+
+- Для вида `SYSTEM` параметр `panel` не требуется и игнорируется
+- Для видов `PANEL` и `USER` параметр `panel` обязателен, иначе будет выведена ошибка и функция вернётся без выполнения
+- При обновлении параметра обновляются следующие значения: `options`, `name`, `desc`, `dataType`, `value`
+
+**Пример:**
+
+```
+import React, { useContext } from "react";
+import { SettingsCtx } from "../../context/settings";
+import { formatDateJSONDateOnly } from "../../core/utils";
+
+//Инициализируемые параметры
+const PUT_SETTINGS = {
+ LAST_UPDATE: {
+ name: "Дата последнего обновления",
+ dataType: "DATE",
+ value: formatDateJSONDateOnly(new Date()),
+ desc: ""
+ },
+ COUNT_DOCS: {
+ name: "Количество отображаемых документов",
+ dataType: P8P_DATA_TYPES.NUMB,
+ value: 15,
+ desc: ""
+ }
+};
+
+const MyPanel = () => {
+ //Собственное состояние - параметры
+ const [state, setState] = useState({});
+ //Подключение к контексту параметров
+ const { putSettings, SETTINGS_KINDS } = useContext(SettingsCtx);
+
+ //Добавление/обновление параметров пользователя
+ const handlePutSettings = async () => {
+ //Обновление системных параметров
+ await putSettings({
+ kind: SETTINGS_KINDS.USER,
+ panel: "PanelName",
+ settings: PUT_SETTINGS
+ });
+ };
+
+ return
...
;
+};
+```
+
+#### `async undefined showSettingsDialog(Object)`
+
+Отображает диалог настройки параметров пользователя. Диалог позволяет пользователю изменить значения параметров.
+
+**Входные параметры:**
+
+```
+{
+ panel = null,
+ onOk = null,
+ onCancel = null
+}
+```
+
+`panel` - необязательный, строка, имя панели (если не указан - открываются все параметры с разделением по панелям)\
+`onOk` - необязательный, функция вида `f({ settings })`, будет вызвана при нажатии "ОК" в диалоге. В параметр `settings` передаются изменённые параметры\
+`onCancel` - необязательный, функция вида `f()`, будет вызвана при нажатии "Отмена" или закрытии диалога
+
+**Результат:** функция возвращает следующие объекты:\
+
+- `settings` - объект, содержащий информацию о всех параметрах с учетом изменений
+- `isChanged` - признак изменений данных (`true` - параметры были изменены, `false` - изменений не было)
+
+**Особенности:**
+
+- Диалог реализован компонентом `P8PSettingsDialog` ("app/components/p8p_settings_dialog.js")
+- При нажатии "ОК" параметры автоматически сохраняются через `putSettings`
+- При нажатии "Отмена" параметры не сохраняются
+- Диалог закрывается автоматически после обработки нажатий
+
+**Пример:**
+
+```
+import React, { useContext } from "react";
+import { SettingsCtx } from "../../context/settings";
+import { Button } from "@mui/material";
+
+const MyPanel = () => {
+ //Подключение к контексту параметров
+ const { showSettingsDialog, SETTINGS_KINDS } = useContext(SettingsCtx);
+
+ //При отображении параметров панели
+ const handleSettingsDialog = async () => {
+ //Отображаем параметры панели
+ showSettingsDialog({
+ panel: "PanelName",
+ onOk: ({ settings }) => {
+ console.log("Параметры сохранены:", { settings, isChanged });
+ },
+ onCancel: () => {
+ console.log("Изменения отменены");
+ }
+ });
+ };
+
+ return (
+