ДП «Таблица» — справочник настроек¶
Полный перечень настроек ДП Таблица с указанием где хранится, что делает, ограничения
Настройки таблицы (ExtParamTableCommonSettings)¶
Вкладка «Дополнительные настройки» в админке ДП.
| Настройка (UI) | Поле БД | Тип | Что делает | Ограничения |
|---|---|---|---|---|
| Ключевой столбец | KeyColumnId |
int FK → ExtParamTableSettings | Столбец для сопоставления строк при импорте и для множественного выбора | Допустимые типы: Текст, Число, Дата, Дата-время, Деньги, Телефон, Lookup, Выпадающий список, RowID. Без ключевого столбца импорт = полная перезапись |
| Использовать RowID как ключ | UseRowIdAsKeyColumn |
bit | При импорте строки сопоставляются по порядковому номеру | |
| Отображать как | DisplayMode |
int | Режим: 0 = Таблица, 1 = Ссылка. Динамический набор полей — отдельный флаг DisplayAsDynamicSetOfFields (bit) |
|
| Максимальная высота (px) | TableMaxHeight |
int | Макс высота области строк; при превышении — вертикальный скролл. По умолчанию высота строк подстраивается автоматически под содержимое ячеек (учитываются переносы текста, превью изображений, кнопки управления). Минимальная высота строки — 150px. При большом числе строк включается постраничное отображение с серверной подгрузкой данных. Предусмотрена кнопка раскрытия таблицы в модальное окно. | |
| Разрешить экспорт | ExportEnabled |
bit | Иконка экспорта в правом верхнем углу таблицы | Экспортируются только столбцы с включённым ExportEnabled |
| Разрешить импорт | ImportEnabled |
bit | Иконка импорта в правом верхнем углу таблицы | Импортируются только столбцы с включённым ImportEnabled; без ключевого столбца -- полная перезапись |
| Загружать файлы в момент вкладывания | UploadWhenFileAttach |
bit | Файл загружается в БД сразу при выборе, а не при сохранении таблицы | |
| Число параллельных загрузок | NumberOfParallelDownloads |
int | Количество одновременных загрузок файлов | |
| Файловый провайдер | FileProviderId |
int FK → FileProviders | Провайдер хранения файлов для файловых колонок | Учитывается только при ручном изменении, смарт-действии «Скачать файл» и LUA. Другие смарт-действия используют провайдер по умолчанию |
| Сохранять строку после редактирования (автосохранение) | AutosaveEnabled |
bit | После Add/Delete/Edit строка сохраняется автоматически; кнопка «Сохранить» скрыта | Tab/Enter не сбрасывает выделение ячейки |
| Создавать строки в модальном окне | AddNewRowModal |
bit | При нажатии «+» открывается модальное окно для ввода значений | |
| Включить секции столбцов | IsSectionsEnabled |
bit | Включает группировку колонок в секции | Требует включённого автосохранения |
| Режим ширины по умолчанию | TableWidthDefault |
int | 0 = По умолчанию, 1 = По размеру экрана, 2 = По содержимому, 3 = По содержимому и заголовкам | |
| Скрыть кнопку добавления строк | HideAddRowsButton |
bit | Кнопка «+» скрыта; строки можно добавлять только через множественный выбор | |
| Хранить html представление | StoreHtmlPresentation |
bit | Сохранение HTML-представления в GZip для отображения в гриде категории | Без этого флага значение не пишется в ExtParamValues.ExtParamValueGZip. Ограничение размера: HTML-снимок ограничен 6900 байт; строки, не поместившиеся в лимит, тихо отбрасываются без предупреждения. Фактическое количество строк в снимке может быть меньше RowsToRender. Данные в таблице сохраняются полностью — ограничение касается только отображения в гриде и Excel-экспорта из грида. В карточке задачи все строки отображаются корректно. |
| Режим Excel | IsExcelMode |
bit | Функция в разработке | |
| Столбец для множественного выбора | MultiselectColumnId |
int FK → ExtParamTableSettings | Ключевой Lookup-столбец для режима multiselect | Тип столбца = Lookup |
Типы столбцов (ExtParamTableSettings.Type)¶
| Тип (UI) | Type (tinyint) | Особенности |
|---|---|---|
| Текст | 0 | Маска, столбец шаблона значения |
| Большой текст без форматирования | 1 | Textarea, без маски |
| Выпадающий список | 2 | Опции в ExtParamTableOptions; или ссылка на ДП через ReferencedExtParamId |
| Текст с маской | 3 | Маска: Email, Phone, кастомные через спецсимволы (0 = цифра, a = буква, * = любой) |
| Деньги | 4 | Поддержка итогов (EnableTotal); диапазон ±922 337 203 685 476.99 |
| Дата и время | 5 | Формат DD-MM-YYYY hh:mm для дефолтного значения |
| Дата | 6 | Формат DD-MM-YYYY для дефолтного значения |
| Телефон | 7 | Форматированное отображение |
| Lookup | 8 | Настройки через ReferencedExtParamId (→ ExtParams) и LookupParamSettingID (→ LookupParamSettings); поддержка смарт-фильтров, каскадных зависимостей |
| Чекбокс | 9 | bool |
| Число | 10 | Поддержка итогов (EnableTotal); диапазон ±99 999 999 999 999; настройки через ReferencedExtParamNumberSettings |
| Файл | 11 | Мультифайл, сканирование, превью, логирование действий; провайдер наследуется от таблицы |
| Виртуальная | 12 | Только для чтения; ссылка на Lookup-столбец + поле категории; наследует настройки Lookup (включая «Отображать как текст»); режим «Невидимая» не поддерживается |
| Шаблонная | 13 | Mustache-подобный шаблон: {{c123.stringValue}}; регистрозависимо; без фильтрации |
| Блок кнопок | 14 | JS-выражение или смарт-пакет; видимость/активность по колонкам или смарт-фильтру; без фильтрации |
| Выбор пользователей | 15 | Настройки через ReferencedExtParamId (→ ExtParams типа Users); перенос строк влияет на множественный выбор |
Настройки столбца (ExtParamTableSettings)¶
Вкладка «Столбцы» в админке ДП.
| Настройка (UI) | Поле БД | Тип | Что делает |
|---|---|---|---|
| ID | ID |
int PK | Идентификатор столбца |
| Имя | Name |
varchar | Название столбца в UI |
| Порядок | OrderID |
int | Порядок расположения; 0 = по порядку создания |
| Тип | Type |
tinyint | Тип данных (см. таблицу выше) |
| Режим | Mode (в DTO) / Locked + IsHidden (в БД) |
— | Необязательно / Обязательно / Только для чтения / Скрытая / Невидимая |
| Значение по умолчанию | DefaultValue |
varchar | Пустое / Фиксированное / Smart-выражение (DefaultValueSmartExpressionId) |
| Смарт-выражение | SmartExpressionId |
int FK | Вычисление значения; вычисляется после сохранения «не-смарт» столбцов; порядок -- по OrderID |
| Маска | Mask |
varchar | Для текстовых столбцов; новая таблица: 0=цифра, a=буква, *=любой |
| Столбец шаблона значения | TemplateColumnId (в ExtParamTableTextColumnSettings) |
int FK | Ссылка на Lookup/Текст столбец с шаблоном RegEx; только для типа Текст |
| Ширина | ColumnWidth |
int | 0 = авто, 1/2/4/6 = диапазон растягивания, другие = px |
| Макс высота | — | — | Устаревшее, не используется |
| Выравнивание | Align |
tinyint | 0=лево, 1=центр, 2=право, 3=ширина (не поддерж. в новой таблице) |
| Прикрепить слева | Locked |
int | Фиксация столбца при горизонтальной прокрутке |
| Итого | EnableTotal |
bit | Строка итогов под таблицей; только Число и Деньги |
| Сортировка по умолчанию | DefaultSort (в DTO) / DefaultGroupingOrder (в БД) |
tinyint | 0=нет, 1=по возрастанию, 2=по убыванию; только один столбец; пересортировка срабатывает автоматически после любого изменения значения в строке (ручное редактирование или смарт-кнопка) |
| Разрешить экспорт | ExportEnabled |
bit | Столбец участвует в экспорте; скрытые не экспортируются |
| Разрешить импорт | ImportEnabled |
bit | Столбец участвует в импорте; скрытые и readonly не импортируются |
| Перенос строк | UseLineBreak (в DTO) |
bit | Текст переносится по ширине вместо обрезки; для Users -- ограничение одним пользователем |
| Название секции | SectionId |
int FK → ExtParamTableSections | Принадлежность к секции |
| Видимость в закрытой секции | IsVisibleInClosedSection (в DTO) |
bit | Столбец виден когда секция свёрнута |
| Видимость в открытой секции | IsVisibleInOpenSection (в DTO) |
bit | Столбец виден когда секция развёрнута |
| Участвует в поиске | IsUsedInSearch (в БД) |
bit | Управляет двумя механизмами: (1) Поиск «в полях» — столбец включается в полнотекстовый поиск по задачам категории в режиме «в полях»; (2) Фильтр «Содержит» на колонке ДП Таблица в гриде категории — поиск ведётся только по строкам столбцов, у которых флаг включён. Если флаг отключён у всех столбцов, фильтр «Содержит» вернёт 0 задач. Фильтры «Нет значения» и «Есть значение» от этого флага не зависят. Troubleshooting: если фильтрация по содержимому ДП Таблица не работает / поиск «в полях» не находит значения из таблицы — первым делом проверить этот флаг. Также требуется настроенный шаблон (ItemTemplate) и StoreHtmlPresentation = true. См. docs/domains/grids/support-guide.md § 1.3. |
| Логировать действия с файлами | IsLogFileReadsAction (в DTO) |
bit | Запись в журнал Диск; только для типа Файл |
| Локализованное название | LocalizedNameId |
int FK → LocalizedBusinessObjects | Перевод названия столбца |
| Ссылка на ДП | ReferencedExtParamId |
int FK → ExtParams | Для Lookup, Select, Users, Number -- ДП-источник настроек |
| Виртуальная: Lookup-столбец | VirtualColumnReferencedLookupColumnId |
int FK | Lookup-столбец, из которого берётся ссылка на задачу |
| Виртуальная: ДП категории | VirtualColumnReferencedExtParamId |
int FK → ExtParams | Поле категории для отображения |
| Настройки Lookup | LookupParamSettingID |
int FK → LookupParamSettings | Полные настройки Lookup (фильтры, каскады, вид) |
| Источник данных | DataSource, DataValueField, DataTextField |
varchar | Для Выпадающего списка -- SQL или набор опций |
| Set of elements as DataSource | SetOfElementsAsDataSource (в DTO) |
bit | Опции берутся из ExtParamTableOptions |
Дополнительные настройки столбцов по типам¶
Lookup¶
Настраивается через создание/выбор ДП типа Lookup (ReferencedExtParamId). Наследует все настройки ДП Lookup: категория, смарт-фильтр, каскадные зависимости, вид.
Выбор пользователей¶
Настраивается через создание/выбор ДП типа Users (ReferencedExtParamId). Настройки: группы, фильтры пользователей.
Выпадающий список¶
Варианты: через ExtParamTableOptions (локальные опции) или через ReferencedExtParamId → ДП типа List.
Файл¶
| Настройка | Описание |
|---|---|
| Разрешить сканирование | Иконка сканирования при добавлении строки |
| Создавать системные копии при акцепте подписи | Системная копия файла при подписании |
| Отображать превью для картинок | Превью с размерами; не работает для мультифайл |
| Мультифайл | Несколько файлов в ячейке |
| Работа с Word | Наследует настройки ДП «Файл» (блок «Работа с файлами Word») |
Число¶
Настраивается через ДП типа Число (ReferencedExtParamId). Диапазон: ±99 999 999 999 999.
Деньги¶
Настраивается через ДП типа Деньги (ReferencedExtParamId). Диапазон: ±922 337 203 685 476.99.
Виртуальная¶
| Настройка | Описание |
|---|---|
| Lookup-столбец | Уже настроенный Lookup-столбец в этой таблице |
| ДП категории | Параметр из категории, на которую смотрит Lookup |
| Превью (для файлового ДП) | Высота/ширина превью, флаг отображения |
Режим: только для чтения. Режим «Невидимая» не поддерживается.
Шаблонная¶
Mustache-подобный шаблон. Синтаксис: {{c123.stringValue}} где 123 = ID столбца. Регистрозависимо. Фильтрация по столбцу невозможна.
Блок кнопок¶
| Настройка | Описание |
|---|---|
| Имя | Текст на кнопке (если нет иконки) или tooltip (если есть) |
| Описание | Tooltip при отсутствии иконки |
| Иконка | Из набора /spa/content-icons |
| JavaScript выражение | JS-код; доступны event.originalEvent, event.data, event.block.reload/freeze/unfreeze |
| Колонка идентификатора (int) | Столбец с ID объекта для смарт-пакета |
| Пакеты действий | Смарт-пакет по нажатию; доступны: ID объекта, JSON строки, ID кнопки, текущий пользователь |
| URL | Смарт-выражение → URL для модального окна после смарт-пакета |
| Колонка видимости (bool) | Столбец, определяющий видимость кнопки |
| Колонка активности (bool) | Столбец, определяющий активность кнопки |
| Сообщение при успехе | Текст после успешного выполнения |
| Сообщение при ошибке | Текст при ошибке |
| Информационное сообщение при нажатии | Подтверждение перед выполнением |
| Режим видимости | Смарт-фильтр: Блокировать (disabled) или Скрыть (hidden) |
JS или смарт-пакет -- взаимоисключающие. Фильтрация по столбцу невозможна. При нажатии все кнопки автоблокируются; разблокировка через event.block.unfreeze().
Секции столбцов (ExtParamTableSections)¶
| Настройка | Поле БД | Описание |
|---|---|---|
| Имя | SectionName |
Название секции |
| Порядок | SectionOrder |
Порядок расположения |
| По умолчанию развёрнуто | IsDefaultExpanded |
Секция развёрнута или свёрнута |
Требования: включён флаг IsSectionsEnabled и AutosaveEnabled в настройках таблицы.
Для каждого столбца: SectionId + IsVisibleInClosedSection + IsVisibleInOpenSection.
Множественный выбор (Multiselect)¶
Настройка: MultiselectColumnId → Lookup-столбец в таблице.
Во вкладке «Настройки множественного выбора»: для каждого столбца -- флаг «Использовать в множественном выборе», ширина, порядок, прикрепление.
Кнопка multiselect не отображается в следующих случаях: - В задаче активны настройки «Ограничить добавление новых строк» или «Ограничить удаление строк» (из настроек ДП в подкатегории). - Таблица открыта в NTF (форме постановки задачи) — кнопка не отображается до момента создания задачи. Это ожидаемое ограничение, не баг.
Права доступа к столбцам¶
По группам пользователей (ExtParamTableSettingsInSubcatGroupPermissions)¶
Настраивается per столбец + per подкатегория. Режим контроля: GroupAccessControlMode.
По статусам задачи (ExtParamTableSettingsInSubcatStatePermissions)¶
Настраивается per столбец + per подкатегория. Включается флагом StateAccessControlEnabled.
AccessType: чтение / запись.
Условное форматирование колонок (ExtParamTableColumnFormattingRules)¶
Появилось в v2.266. Позволяет раскрашивать ячейки таблицы по условиям (по аналогии с Excel): «больше N — красным», «совпадает с X — зелёным», «в диапазоне A..B — жёлтым» и т.п. Правила задаются per колонка ДП Таблица.
Где настраивается: Admin API → ExtParamFormattingAdminController (route /api/admin/extparams/table/{tableId}/formatting-rules). В админке — на странице настроек ДП Таблица (см. ниже «Интерфейс настройки в админке»).
Таблица БД: dbo.ExtParamTableColumnFormattingRules (FK → ExtParamTableSettings.Id).
Интеграция: EpTableColumnSettingsDto.FormattingRules — массив правил приходит вместе с настройками колонки в GET-запросах настроек таблицы.
Интерфейс настройки в админке¶
Редактор правил встроен в страницу настроек ДП (AdministrationExtParamsSettings → AdminExtParamDetailSettings). Когда открыты настройки ДП с типом Таблица, в форме появляется компонент TableFormattingRulesEditorComponent (pages/admin/administration-ext-params-settings/.../table-formatting-rules-editor/). Он же используется как @ViewChild родительской формы — поэтому правила сохраняются вместе с остальными настройками ДП.
Что видит администратор:
- Кнопка «+ Добавить правило» в шапке секции.
- Список карточек-правил (если правил нет — пустое состояние «Правил нет»). Карточки автоматически пересортированы по Priority ASC при изменении приоритета (onPriorityBlur → sortRulesByPriority).
- В каждой карточке: заголовок «Правило N», чекбокс «Активно» и кнопка «Удалить» (с confirm-диалогом; удаление вызывает DELETE сразу).
Поля карточки:
| Поле | Контрол | Поведение |
|---|---|---|
| Колонка | dropdown с поиском | Список только тех колонок, чей тип распознан как форматируемый: Number / Money / NumericValue → числовая; Text → текстовая. Остальные типы колонок (Textarea, MaskedTextBox, Lookup, Date и т.д.) в дропдаун не попадают |
| Тип правила | dropdown с поиском | Состав зависит от типа выбранной колонки: для числовой — 11 опций (GreaterThan...Outside + Min/Max + Duplicates), для текстовой — 7 опций (Contains...TextNotEqual + Duplicates). При смене колонки текущий тип, если несовместим, сбрасывается на первый из доступных |
| Значение X | число (для числовых) / текст (для текстовых) | Скрыто для Min/Max/Duplicates. Обязательное для остальных |
| Значение Y | число / текст | Появляется только для Between/Outside. Обязательное. Доп. валидация: X < Y (иначе ошибка «X должен быть меньше Y» — xGreaterThanY). Заметим: фронт требует строгое X < Y, тогда как бэкенд validateValueRange нормализует через min/max — расхождение в строгости |
| Цвет | dropdown | 12 опций (Default, Primary, Red, …, Grey) |
| Тон | dropdown | 5 опций (None, White, Light, Normal, Dark) |
| Приоритет | число, ≥0 | Обязательное. При blur — автосортировка карточек по новому значению |
Сохранение. При сохранении формы ДП компонент собирает текущее состояние правил и делает диффы относительно originalRules (загруженных при OnInit):
- Правила без id → POST createRule
- Правила с id, которых нет в форме → DELETE deleteRule
- Правила с id, отличающиеся от оригинала по hasRuleChanged (сравнение по columnId/ruleType/valueX/valueY/color/colorTone/priority/isActive) → PUT updateRule
- Операции выполняются последовательно (concatMap). При ошибке любой операции — показывает модальный диалог с сообщением.
HTTP-сервис фронта: TableFormattingRulesHttpService (data/http/table-formatting-rules/) — обёртка над четырьмя endpoint'ами контроллера.
Поля правила (EpTableColumnFormattingRuleDto)¶
| Поле БД | Тип | Описание |
|---|---|---|
Id |
int identity PK | |
ColumnId |
int NOT NULL, FK → ExtParamTableSettings.Id | На какую колонку правило |
RuleType |
tinyint, enum EpTableFormattingRuleType |
Тип правила — см. ниже |
ValueX |
nvarchar(500) NULL | Первое значение условия (число/текст); для Min/Max/Duplicates — не используется |
ValueY |
nvarchar(500) NULL | Второе значение условия (для Between/Outside — верхняя граница); иначе не используется |
Color |
nvarchar(50) NOT NULL | Цвет — см. ниже |
ColorTone |
nvarchar(50) NOT NULL | Тон цвета — см. ниже |
Priority |
int NOT NULL | Приоритет: при пересечении условий первым применяется правило с меньшим значением |
IsActive |
bit DEFAULT 1 | Активность правила |
Типы правил (RuleType)¶
Числовые — применимы только к колонкам типа Число и Деньги:
| Значение | Описание | Что требуется |
|---|---|---|
| GreaterThan (0) | Значение > X | ValueX |
| LessThan (1) | Значение < X | ValueX |
| GreaterOrEqual (2) | Значение ≥ X | ValueX |
| LessOrEqual (3) | Значение ≤ X | ValueX |
| Equal (4) | Значение = X | ValueX |
| NotEqual (5) | Значение ≠ X | ValueX |
| Between (6) | X ≤ Значение ≤ Y | ValueX + ValueY |
| Outside (7) | Значение < X или > Y | ValueX + ValueY |
| Min (20) | Минимум в колонке | — |
| Max (21) | Максимум в колонке | — |
Текстовые — применимы только к колонкам типа Текст, Большой текст без форматирования, Текст с маской:
| Значение | Описание | Что требуется |
|---|---|---|
| Contains (10) | Содержит подстроку | ValueX |
| NotContains (11) | Не содержит | ValueX |
| StartsWith (12) | Начинается с | ValueX |
| EndsWith (13) | Заканчивается на | ValueX |
| TextEqual (14) | Точное равенство (строка) | ValueX |
| TextNotEqual (15) | Точное неравенство (строка) | ValueX |
Универсальные — любой тип колонки:
| Значение | Описание | Что требуется |
|---|---|---|
| Duplicates (22) | Подсветить дубликаты в колонке | — |
Цвет (Color) и тон (ColorTone)¶
Color: Default, Primary, Red, Pink, Purple, Green, Yellow, Orange, Blue, Cyan, Brown, Grey — 12 значений.
ColorTone: None, White, Light, Normal, Dark — модификатор насыщенности.
В коде это общие enum-ы Color и Tones из пакета Valhalla.Integration.Enums.Portal.Widget — те же палитры, что используются в портальных тикерах. В БД оба поля хранятся как строковые имена enum-значений (Enum.ToString()), при чтении парсятся обратно через Enum.Parse. На фронте — EpTableFormattingColor / EpTableFormattingTone со значениями-строками. Конкретное представление цвета в CSS делает mapEpFormattingColorToCellStyle (SPA).
API endpoints¶
| Метод | Маршрут | Назначение |
|---|---|---|
| GET | /api/admin/extparams/table/{tableId}/formatting-rules |
Все правила для ДП Таблица (включая неактивные) |
| POST | /api/admin/extparams/table/{tableId}/formatting-rules |
Создать правило |
| PUT | /api/admin/extparams/table/{tableId}/formatting-rules/{ruleId} |
Обновить |
| DELETE | /api/admin/extparams/table/{tableId}/formatting-rules/{ruleId} |
Удалить |
tableId — ID самого ДП Таблица (ExtParams.Id), а не ID колонки. ColumnId передаётся в теле DTO.
Валидация при сохранении¶
Сервис ExtParamFormattingAdminService проверяет:
| Проверка | Ошибка resx (AdminSection.*) |
Когда срабатывает |
|---|---|---|
ДП с указанным tableId имеет тип Table |
ExtParamFormatting_NotTableType |
Передан ID не-таблицы |
Колонка из dto.ColumnId принадлежит этой таблице |
ExtParamFormatting_ColumnNotInTable |
Попытка создать правило для чужой колонки |
| Тип правила совместим с типом колонки | ExtParamFormatting_RuleTypeIncompatibleWithColumnType |
Например, Contains для колонки Число |
RuleType — допустимое значение enum |
ExtParamFormatting_InvalidRuleType |
Передан неизвестный код правила |
Color — допустимое значение enum |
ExtParamFormatting_InvalidColor |
|
ColorTone — допустимое значение enum |
ExtParamFormatting_InvalidColorTone |
|
ValueX указан для правил, требующих X |
ExtParamFormatting_ValueXRequired |
Пустой ValueX для GreaterThan и пр. |
ValueY указан для Between/Outside |
ExtParamFormatting_ValueYRequired |
Пустой ValueY для Between/Outside |
ValueX пустой для Min/Max/Duplicates |
ExtParamFormatting_ValueXMustBeEmpty |
Лишний ValueX |
ValueY пустой для всех правил, кроме Between/Outside |
ExtParamFormatting_ValueYMustBeEmpty |
Лишний ValueY |
Не более 50 правил на одну колонку (MaxRulesPerColumn) |
ExtParamFormatting_MaxRulesExceeded |
Попытка создать 51-е правило |
| При Update/Delete: правило принадлежит таблице из URL | ExtParamFormatting_RuleNotBelongsToTable |
tableId в URL не совпадает с фактической таблицей правила |
При нарушении правило не сохраняется, API возвращает TCLogicException с соответствующим сообщением (есть локализация ru/en).
Применение правил в гриде (runtime)¶
SPA-логика — apps/spa/src/app/components/task/ui/ext-fields/ext-param-table/ext-param-grid/ext-param-grid-conditional-formatting.ts.
Алгоритм для каждой ячейки:
1. Из настроек колонки берётся массив formattingRules.
2. Отфильтровываются неактивные (IsActive=false).
3. Активные сортируются по Priority ASC (меньше — раньше).
4. Для каждого правила в этом порядке проверяется условие; выбирается первое подходящее — на основе его Color/ColorTone ставится cell-style. Если ни одно не подошло — ячейка без подсветки. Правила не комбинируются.
Агрегаты Min/Max/Duplicates. Вычисляются клиентом перед применением правил: buildFormattingAggregatesForColumn проходит api.forEachNode и считает по видимым строкам грида. Группы и строки итогов (isTotal=true) исключаются. Для Min/Max — численный минимум/максимум, для Duplicates — множество значений, встречающихся ≥ 2 раз. Из-за этого Min/Max-правило выделяет минимум именно среди видимых строк, не всех данных таблицы.
Получение числового значения ячейки: getNumericCellValue — приоритет источников newValue (несохранённое значение в режиме редактирования) → decimalValue → intValue.
Особенности правил:
- Between / Outside: клиент сам нормализует границы через Math.min / Math.max — порядок ValueX и ValueY на результат не влияет.
- Contains / NotContains / StartsWith / EndsWith при пустом ValueX — не срабатывают (возвращают false). Бэкенд их и не даст сохранить (см. валидацию), но если правило с пустым X каким-то образом просочилось — оно молча игнорируется.
- TextEqual / TextNotEqual — работают и с пустой строкой как с легитимным значением.
Аудит-лог¶
Любое изменение правила (Create / Update / Delete) пишется в журнал администрирования через AdminActionLogService с EntityType = ExtParamTableColumnFormattingRule. Имя сущности в логе — FormattingRule(columnId, ruleId). Для Update сохраняется состояние before/after.
Журнал доступен через стандартный интерфейс «Журнал администрирования» или таблицу AdminActionLog.
Известные расхождения и ограничения¶
Между тремя слоями (бэкенд-валидация, фронтенд-UI, фронтенд-runtime) поддержка типов колонок различается:
| Тип колонки | Backend (CreateRule) | Frontend UI (выбор колонки) | Frontend runtime (apply rules) |
|---|---|---|---|
| Number | ✓ | ✓ | ✓ |
| Money | ✓ | ✓ | ✓ |
| NumericValue (legacy alias) | — | ✓ | — |
| Text | ✓ (как текстовая) | ✓ (как текстовая) | ✓ |
| Textarea (Большой текст без форматирования) | ✓ (как текстовая) | ✗ | ✗ |
| MaskedTextBox (Текст с маской) | ✓ (как текстовая) | ✗ | ✓ |
Практические следствия: - На колонке Textarea правило можно создать только через API (UI её не предлагает), и оно не применится в гриде — ячейка останется без подсветки. Это сохраняется в БД, но эффекта не даёт. - На колонке MaskedTextBox правило нельзя создать через UI (её нет в дропдауне), но если создать через API — оно применится в гриде. - NumericValue в UI распознаётся как числовая, но в backend-валидации этого alias'а нет — попытка создать может упасть на проверке типа колонки.
Дополнительные ограничения:
- Min/Max работают по видимым строкам грида, а не по всем данным таблицы. При фильтрации/группировке множество видимых строк меняется — Min/Max-подсветка пересчитывается соответственно.
- Лимит 50 правил на колонку — жёсткий, на админ-API. При превышении — ошибка.
- Дубликаты правил не запрещены: можно создать два правила с одинаковыми RuleType и ValueX/ValueY (различающихся только Priority/Color); сработает то, что выше по приоритету.
- Строгость X<Y для Between/Outside различается: UI требует строгое X < Y (валидатор xGreaterThanY), backend нормализует через Math.min/Math.max (порядок не важен). Через API можно сохранить пару с X≥Y, но в редакторе UI она будет помечена как ошибочная.
Шаблон в табличных представлениях (ExtParamTableTemplate)¶
Для отображения ДП Таблица в гриде категории.
| Настройка | Поле БД | Описание |
|---|---|---|
| Использовать шаблон | Enabled |
Активация шаблона |
| Отображать количество строк | RenderTotalRows |
Показ общего числа строк |
| Количество отображаемых строк | RowsToRender |
Сколько первых строк рендерить; 0 = пустой объект, без HTML |
| Заголовок | HeaderTemplate |
HTML в начале |
| Шаблон строки | ItemTemplate |
HTML с тегами <cell columnid="..."> для каждой строки |
| Разделитель | SeparatorTemplate |
HTML между строками |
| Футер | FooterTemplate |
HTML в конце |
| Хранить html представление | → StoreHtmlPresentation в CommonSettings |
GZip-хранение в ExtParamValues.ExtParamValueGZip |
| Синхронизировать существующие задачи | — | Пересчёт HTML для существующих задач при изменении шаблона |
HTML-представление хранится в ExtParamValues.ExtParamValueGZip. При денормализации → ExtParamNativeValue. Job TableExtParamValuesGZipCompressJob каждые 3 минуты сжимает по 10000 строк.
С версии 2.265: значение ДП Таблица не хранится в ExtParamValues.ExtParamValue и TasksInSubcatXXXDenormalized.ExtParamXXXValue. Наличие в ExtParamXXXNativeValue зависит от флага «Хранить html представление».
Импорт/экспорт Excel¶
Экспорт: выгрузка в XLS. Первая строка -- названия столбцов. Lookup -- текст задачи. Файл -- ссылка на файл.
Импорт: XLS/XLSX, одна страница.
| Режим | Описание |
|---|---|
| С заголовками (опция включена) | Сопоставление по названиям столбцов |
| Без заголовков (опция выключена) | Сопоставление по порядку столбцов |
Важно: - Без ключевого столбца: полная перезапись (все строки удаляются, загружаются новые) - С ключевым столбцом: строки матчатся по ключу (обновление + добавление новых) - Файловые столбцы при импорте игнорируются - Lookup при импорте: можно использовать текст задачи или ID задачи - Скрытые и readonly столбцы не импортируются - Имена столбцов не должны содержать лишних пробелов
Значение по умолчанию — два уровня¶
Для ДП «Таблица» есть два независимых механизма задания дефолтных значений.
1. Предзаполненные строки при создании задачи (уровень ДП в категории)¶
Настраивается в AdminSPA на странице настроек ДП категории → поле «Значение по умолчанию». При создании задачи (НТФ) таблица будет открыта с уже заполненными строками.
Формат: JSON-строка вида {"rows":[{"c{ID}":"значение",...},...]}, где ID — числовой идентификатор столбца (ExtParamTableSettings.ID).
Узнать ID столбца: в AdminSPA → настройки ДП → вкладка «Столбцы» → навести на название столбца или открыть инструменты разработчика браузера (Network → запрос настроек ДП, поле id в объекте столбца).
Примеры:
// Одна предзаполненная строка, столбцы 123 и 456
{"rows":[{"c123":"Текст по умолчанию","c456":"42"}]}
// Две строки
{"rows":[{"c123":"Строка 1"},{"c123":"Строка 2"}]}
Форматы для конкретных типов столбцов:
- Текст, Большой текст — строка: "Привет"
- Число, Деньги — строка с числом: "42" или "3.14"
- Дата — "DD-MM-YYYY", например "01-01-2026"
- Дата и время — "DD-MM-YYYY hh:mm", например "01-01-2026 09:00"
- Чекбокс — "true" / "false"
- Lookup — ID задачи: "12345"
- Выпадающий список — значение опции: "Опция 1"
Этот JSON перекрывает глобальный
DefaultValueсамого ДП. Если таблица находится в категории с настроенным JSON — используется он; глобальный дефолт ДП игнорируется.
2. Значение по умолчанию при добавлении строки пользователем (уровень столбца)¶
Настраивается на вкладке «Столбцы» → поле «Значение по умолчанию» конкретного столбца (ExtParamTableSettings.DefaultValue или DefaultValueSmartExpressionId). Применяется каждый раз, когда пользователь добавляет новую строку в таблицу — уже существующие строки не затрагиваются.
Поддерживает смарт-выражение (FK DefaultValueSmartExpressionId) для динамического вычисления.