# Гриды — Известные проблемы

Реестр выявленных багов и ограничений гридов 1Формы: группировка, пикеры лукапов, представление «Иерархия», маска в табличных ДП и фильтр по дате. Документ для поддержки при разборе обращений. Ниже — подтверждённые проблемы с симптомами, статусом и обходными путями.

---

## 1. Группировка по локализованным ДП не локализуется

> Выявлен: 2026-02-09
> Статус: баг подтверждён, принят в работу

**Симптом:** при группировке задач в гриде по ДП типа «Лукап» заголовки групп отображаются на русском, хотя язык интерфейса пользователя — другой (например, английский). В колонках грида тот же лукап отображается корректно.

**Причина:** сервис группировки не локализует значения для типов «Лукап», «Combobox», «Select» — значение из денормализованной таблицы передаётся в интерфейс без перевода.

**Затронуты:** LookUpField (основной), Combobox/Select с локализацией, Text (localizable).

**Обходной путь:** нет. Рекомендуется не группировать по лукап-полям до исправления.

---

## 2. Пикер лукапа на сводный раздел — колонки не отображаются (v266)

> Выявлен: 2026-03-20
> Статус: баг подтверждён
> Версия: v2.266.594.0

**Симптом:** пикер лукапа на сводный раздел отображает только системные колонки (Задача, Срок), игнорируя пользовательские настройки колонок.

**Данные:** AdminSPA показывает 12 видимых колонок (Категория, Страна, Город и др.), но `GET /api-core/datasource/{id}/config` возвращает только 2 колонки (`isDefault: true`).

**Причина (гипотеза):** AdminSPA сохраняет настройки колонок, но `/config`-маршрут читает из другого источника. Пикер строит грид по данным из `/config`, поэтому пользовательские колонки не отображаются.

**Обходной путь:** нет.

---

## 3. Иерархия задач не поддерживает динамические колонки

> Выявлен: 2026-04-28
> Статус: ограничение подтверждено

**Симптом:** в представлении «Иерархия» отображаются только статические дополнительные параметры категории. Динамические колонки, формируемые через хранимые процедуры или другие источники динамических настроек колонок, в дереве не выводятся.

**Причина:** представление «Иерархия» строит набор полей из настроек иерархии категории и не учитывает динамические колонки грида. Поддержка динамических колонок есть в табличном представлении, но не в дереве.

**Затронуты:** представление категории «Иерархия», дополнительные параметры в гриде иерархии, динамические колонки.

**Обходной путь:** для отображения динамических колонок использовать табличное представление вместо иерархии.

**Связанные документы:**

- [Гриды — решение проблем](https://help.1forma.ru/domains/grids/support-guide.md) (раздел 3.3)

---

## 4. Залипание значения в ДП «Текст с маской» при переключении задач в гриде

> Выявлен: 2026-06-17 (регрессия)
> Статус: исправлен в 2.268.x

**Симптом:** в гриде категории с ДП «Текст с маской» при последовательном переключении между задачами поле показывает значение из ранее открытой задачи. Обновление приходит только после F5. Обычный текст и режим телефона обновляются нормально, ломался только режим маски.

**Причина:** грид переиспользует компонент поля между задачами, а подписка ветки с маской оставалась на прежнем экземпляре ДП — поэтому поле показывало значение из ранее открытой задачи.

**Исправлено.** Подписка теперь реактивно переключается при смене ДП, а значение поля берётся из реактивного потока — при переключении задач маска сразу показывает актуальное значение.

---

## 5. Таблица-виджет с группировкой колонок может упасть при обращении к `$raw`

> Выявлен: 2026-07-10
> Статус: не исправлено

**Симптом:** возможна ошибка в консоли `Cannot read properties of null (reading 'width')` (или другого поля) в виджете «Таблица» при включённой группировке колонок — при расчёте ширины таблицы или в рендерерах ячеек (изображение, диаграмма, индикатор, текст).

**Причина:** после переноса служебных полей в `context` групповая колонка-заголовок создаётся с `context: { $raw: null }`. Часть обращений к `$raw` (`table-widget.component.ts`, `ag-grid/cell-renderer.component.ts`) защищены опциональной цепочкой только на уровне `context`, не `$raw` — при null это падает.

**Не исправлено.**

---

## 6. Группировка по дате: пустая подгруппа или данные другого дня при ненулевом счётчике

> Выявлен: 2026-08-31
> Статус: исправлен в 2.268.x

**Симптом:** при группировке по колонке с датой — чаще в несколько уровней, когда за датой идёт ещё одна колонка — раскрытая группа показывала ноль задач при ненулевом счётчике группы либо отдавала данные другого дня. Сообщения об ошибке при этом не было.

**Причина:** ключ группы сервер отдаёт в формате ISO, а разбирал его как дату в инвариантной культуре, где порядок частей — месяц, день, год. Ключ вида `дд.мм.гггг` с днём не больше 12 читался как другой день, и данные подменялись тихо; с днём больше 12 разбор не удавался, и запрос молча превращался в текстовое сравнение по колонке даты — выборка приходила пустой.

**Исправлено.** Ключ группы разбирается строго по формату `yyyy-MM-ddTHH:mm:ss`: нераспознанный ключ больше не деградирует в текстовое сравнение, а пишется в лог и возвращает явную ошибку. Правило действует и в гриде задач, и в фильтрах колонок ДП «Таблица»; разбор дат вне группировки не изменился. Клиентская часть передаёт ключ в корректном формате.

**Где держится состав датовых колонок.** Строгий разбор ключа включается только для колонок, признанных датовыми. У дополнительного параметра тип берётся из кэша ДП, а у системной колонки типа в этой точке нет — датовость определяет набор `DateFilterColumns` в `ColumnFilterService`. Набор собирается рефлексией: берутся все свойства типа `DateTime` и `DateTime?` у DTO грида задач и DTO ленты задач, имя свойства переводится по таблице соответствий колонок, и вручную добавлены два имени — `ts.InitializeDate` и `ts.SignatureOrderedTime`. Проверка принадлежности вынесена в метод `IsDateColumn` рядом с `IsBooleanColumn`; сравнение идёт без учёта регистра и без отбрасывания префикса, иначе составные имена вида `ts.InitializeDate` выпали бы из набора.

## 7. Слипание названия агрегата с именем столбца в зоне агрегатов

> Выявлен: 2026-09-24
> Статус: исправлен в 2.268.x

**Симптом:** экранный диктор читает подпись колонки в зоне агрегатов слитно — «SumvonAmount» вместо «Sum von Amount». На экране этой строки нет: грид собирает её только в подпись для диктора, поэтому дефект заметен лишь при чтении диктором. На русском и английском интерфейсах надпись читается верно.

**Причина:** строка собирается склейкой «агрегат, разделитель, имя столбца», а пробелы по краям лежат в самом значении ключа `ariaDropZoneColumnComponentAggFuncSeparator`. В `ru-RU` и `en-US` значение записано с пробелами (`' из '`, `' of '`), в словарях `ag-grid-*` остальных культур их не было: `de-DE` — `'von'`, `fr-FR` и `es-ES` — `'de'`, `it-IT` — `'di'`, `pl-PL` — `'z'`, `da-DK` — `'af'`, `uz-Latn` — `'dan'`, `kk-KZ` и `tg-TJ` — свои слова без пробелов.

**Исправлено.** В девяти культурах значение ключа записано с пробелами по краям — `da-DK`, `de-DE`, `es-ES`, `fr-FR`, `it-IT`, `kk-KZ`, `pl-PL`, `tg-TJ`, `uz-Latn`; `ru-RU` и `en-US` не менялись, там пробелы были с самого начала. У `ja-JP` и `zh-CN` пробела нет по правилам языка. Подпись собирается склейкой по-прежнему, но каждая культура отдаёт разделитель с нужными пробелами, и диктор читает «Sum von Amount». Значения проверяет юнит-тест словарей грида `ag-grid-resources.spec.ts`: он склеивает подпись из разделителя культуры и требует пробелы на месте.

**Затронуты:** подпись колонки в зоне агрегатов, которую грид собирает для экранного диктора, во всех культурах, кроме `ru-RU`, `en-US`, а также `ja-JP` и `zh-CN` — в японском и китайском словах пробел не ставится, и значение без пробелов там верное.

**Связанные документы:**

- [Локализация — Администрирование](https://help.1forma.ru/domains/localization/admin.md), раздел «Качество значения в ресурсном файле», пункт про пробелы по краям значения

## 8. Деградация пакетной оценки видимости ДП на крупных категориях

> Выявлен: 2026-08-25
> Статус: исправлен в 2.268.x

**Симптом:** на категориях от 1000 задач с блоком ДП, у которого задан смарт-фильтр видимости, открытие грида и особенно выгрузка в Excel и печать категории идут медленнее: на замере медиана выборки с таким блоком была на 49% выше, чем без него (1,31 с → 1,95 с). Критерий приёмки «медиана после/до не более 1,15» не выполнялся.

**Причина:** пакетная оценка видимости вызывала поиск по смарт-фильтру без ограничения по задачам выдачи и шла по всей категории. Entity SQL-ветка вклеивала список ID литералом `AND t.TaskID IN {…}` — на десятках тысяч задач запрос становился неподъёмным для трансляции и мог не компилироваться в MSSQL.

**Исправлено.** Множество задач выборки пробрасывается в поиск по смарт-фильтру, и пакетная оценка ограничена задачами выдачи. Для Entity SQL-ветки введён порог `MaxEsqlTaskIdsLiteralCount = 1000`: при превышении список в запрос не вклеивается, а ограничение по задачам выдачи применяет вызывающий код. Сборка Entity SQL-текста вынесена в `BuildEsqlFilterCommand` и покрыта четырьмя граничными тестами. На замере на собственной сборке (категория 865, 22 047 задач, 20 пар прогонов с чередованием плеч) отношение медиан — 0,951 на первой странице и 0,899 на середине списка, p90 — 0,811 и 0,736. Содержимое ответов, кроме признака `isHidden`, совпадает с прежним. Сохранены поштучная оценка событийных фильтров, запасной путь при отказе пакетной оценки и поведение при пустом входе.

## 9. Полоса горизонтальной прокрутки в гриде индикатора обрезана снизу

> Выявлен: 2026-09-24 (регрессия)
> Статус: исправлен в 2.268.x

**Симптом:** в гриде индикатора (таблицы-тикера) горизонтальная полоса прокрутки видна наполовину — нижнюю часть полосы срезает край страницы. Проявляется, когда колонки шире страницы и появляется горизонтальная прокрутка; на версии 2.264 полоса отображалась целиком.

**Причина:** высоту грида считали арифметически от высоты страницы с фиксированным резервом под панель инструментов (`calc(100% − 40px)`, в самом гриде — `calc(100% − 40px − 25px)`). Фактически над гридом занимают место ещё меню и хлебные крошки, а внутри панели — вторая строка фильтров, поэтому грид оказывался выше контейнера с `overflow: hidden` и низ срезался вместе с полосой прокрутки.

**Исправлено.** Страница источника данных и её грид переведены с расчёта высоты на flex-колонку: меню, хлебные крошки и панель инструментов занимают свою высоту (`flex: 0 0 auto`), а грид — остаток (`flex: 1 1 auto` с `min-height: 0`). Свёрнутый вид грида сохранил прежнюю высоту 140 px, полоса прокрутки снова видна полностью.

**Затронуты:** грид индикатора на карточке задачи и страница источника данных в администрировании. Тот же компонент грида используют журнал категории, настройки подкатегории, диалог источника данных и настройки произвольного источника — их вёрстка переведена на ту же flex-раскладку.

**Связанные документы:**

- [Гриды — Business](https://help.1forma.ru/domains/grids/business.md), раздел «Виды таблиц»

## 10. Раскрытие группы в окне выбора задач отдавало весь набор значений

> Выявлен: 2026-09-21
> Статус: исправлен в 2.268.x

**Симптом:** в окне выбора задач, которое открывается у ДП «Ссылка» и «Множественная ссылка», при группировке по колонке-лукапу раскрытие группы показывало весь набор выбранных значений вместо строк этой группы — на группе со счётчиком 1 в списке оказывался весь набор.

**Причина:** категории источника определялись позже, чем проверялся доступ к колонке дополнительного параметра. При пустом наборе категорий групповое условие по такой колонке снималось, и сервер отдавал строки без ограничения по группе.

**Исправлено.** Категории источника подставляются до проверки доступа к колонке, поэтому групповое условие по колонке-лукапу больше не снимается и раскрытие группы возвращает только её строки; в заголовке группы видно название связанной задачи. Права не ослаблены: подстановка категорий служит только проверке доступа и состав выборки не меняет, закрытый параметр по-прежнему не фильтруется.

**Связанные документы:**

- [Дополнительные параметры — Business](https://help.1forma.ru/domains/ext-params/business.md), раздел «Табличный вид параметра Multilookup»

## 11. Подсказка по ячейке в гриде ДП «Таблица» и на своих заголовках показывается всегда

> Статус: не исправлено

**Симптом:** в гриде табличного дополнительного параметра «Таблица» и на колонках, где заголовок отрисован своим компонентом, подсказка появляется при наведении на значение, которое целиком помещается в колонку. В реестре категории, таблице подзадач и блоках информации карточки задачи подсказки на необрезанном тексте нет — поведение расходится между поверхностями.

**Причина:** показ только при обрезке задан глобально (`tooltipShowMode: 'whenTruncated'`) и не действует на колонки, у которых объявлен свой `cellRenderer`: ag-grid пропускает для них встроенную проверку обрезки, и подсказку обязан объявить сам рендерер вызовом `setCellTooltipWhenTruncated`. В гриде ДП «Таблица» рендереры хелпер не вызывают. На колонках с собственным `headerComponent` (priority, favorites, icon, choose-all в гриде источника данных) подсказка шапки задана напрямую через `headerTooltip` и обрезку не проверяет.

**Обходной путь:** сузить колонку или включить перенос текста по строкам, чтобы значение помещалось целиком.

**Связанные документы:**

- [Гриды — Business](https://help.1forma.ru/domains/grids/business.md), подзаголовок «Всплывающая подсказка ячейки»

## 12. Подсказка по обрезанной ячейке не исчезает после ухода курсора

> Статус: исправлен в 2.268.x

**Симптом:** в реестре категории (вид «Таблица», с группировкой и открытой карточкой справа) подсказка по обрезанному значению остаётся на экране после ухода курсора — при переходе на соседнюю строку, в правую панель, после клика по строке. При наведении на другую строку появляется вторая подсказка, первая не уходит; на экране одновременно висят две, они перекрывают соседние строки и карточку.

**Причина:** обработчики показа и скрытия подсказки привязаны к элементу ячейки. Если ячейка перерисовывается или удаляется при показанной подсказке — смена ширины грида при открытии карточки, обновление данных, сворачивание группы, прокрутка, — событие ухода курсора на прежний элемент не приходит, и пузырь остаётся на экране. Исправление — глобальный сторож показа подсказок, с изменениями за пределами реестра категории оно не связано.

**Исправлено.** Показ и скрытие подсказок грида ведёт общий сторож (`apps/spa/src/app/common/ag-grid-tooltip-guard.ts`), подключённый в общих настройках грида: показанную подсказку он запоминает вместе с её ячейкой и убирает при уходе курсора, прокрутке, смене размера грида, перерисовке ячейки, добавлении или удалении строки и при уничтожении грида, удаляя пузырь из разметки сразу. Двух подсказок на экране одновременно не бывает. Поведение закреплено автотестом `ag-grid-tooltip-guard.spec.ts`.

**Связанные документы:**

- [Гриды — Business](https://help.1forma.ru/domains/grids/business.md), подзаголовок «Всплывающая подсказка ячейки»

## 13. Строка конструктора поиска остаётся от прежнего отбора

> Статус: исправлен в 2.268.x

**Симптом:** в табличном представлении категории отбор, условие которого задано через конструктор поиска, подставлял это условие в строку конструктора. Если затем выбрать другой отбор или снять отбор кнопкой «Очистить», таблица переключалась на новую выборку, а строка конструктора оставалась заполненной прежним условием — и продолжала работать: лишнее условие уходило в запрос выборки.

**Причина:** модель конструктора поиска живёт в текущем состоянии грида отдельно от идентификатора отбора. При смене отбора новая выборка применялась, а прежняя модель в гриде оставалась — она уходила в запрос и записывалась в состояние, которое потом возвращалось при снятии отбора.

**Исправлено.** В обработчике смены отбора модель конструктора гасится до применения нового отбора — `gridApi.setAdvancedFilterModel(null)`. Сохранённые отборы не перезаписываются: сбрасывается только модель текущего грида. Сброс происходит и при снятии отбора, и при переходе на другой пользовательский отбор, и не происходит, когда отбор не менялся, — например, при смене статуса задач внутри отбора. Покрыто тестами: смена на «Без отбора», смена на другой пользовательский отбор, правка статуса внутри отбора.

**Затронуты:** табличное представление категории (грид задач).

**Обходной путь:** нет. Признак старого поведения — после снятия отбора строка конструктора осталась заполненной прежним условием; лишнее условие убирается очисткой строки вручную.

**Связанные документы:**

- [Гриды — Business](https://help.1forma.ru/domains/grids/business.md), раздел «Пользовательские отборы»

## 14. «Не равно» по колонке «Дата и время» не убирает выбранный день

> Статус: исправлен в 2.268

**Симптом:** в гриде категории фильтр «Не равно» по колонке «Дата и время» с выбранным в календаре днём оставлял в таблице все записи этого дня: из выдачи пропадали только записи ровно с временем `00:00`. Чип над гридом при этом выглядел правильно — `Дата создания <> 30.09.2026 00:00:00`, поэтому фильтр выглядел применённым. По колонке «только дата» то же условие отсекало выбранный день целиком, то есть поведение расходилось между типами колонок.

**Причина:** клиент отправлял отрицательное условие обычным сравнением `notEqual`, а суточное отрицание — операцией «не в диапазоне», отрицанием полуинтервала от начала дня до полуночи следующих суток — не отправлял вовсе. Двумя условиями «меньше» и «больше», объединёнными через «или», отрицание не собиралось: такой составной фильтр endpoint `datasource` не разбирает и отвечает `400`.

**Исправлено.** Клиент отправляет отрицание отдельной операцией «не в диапазоне» с границами от начала выбранного дня до начала следующих суток, а сервер отрицает переданный полуинтервал целиком и добавляет в результат записи без значения. День, выбранный в календаре, теперь исключается полностью — и по колонке «дата и время», и по колонке «только дата». В той же волне сервер перестал разворачивать в сутки колонки «дата и время»: полночь в них — обычное заданное время, а границы диапазона берутся ровно такими, какими их прислал клиент. Из-за прежнего двойного разворота условие «Равно» с выбранным днём захватывало ещё и первые сутки следующего дня, а конец «Диапазона» — лишний день; теперь отбор ограничен заданными сутками. Условия с набранным вручную временем по-прежнему сравниваются точно, с точностью до минуты.

**Затронуты:** грид категории, колонки ДП типов «Дата и время» и «Дата».

**Обходной путь:** нет. На сборках до исправления признак старого поведения — день, выбранный в календаре при условии «Не равно», остаётся в таблице.

**Связанные документы:**

- [Гриды — Фильтры](https://help.1forma.ru/domains/grids/filters-reference.md) — семантика «Равно», «Не равно» и «Диапазона»

## 15. Пустая карточка при открытии задачи из грида после перехода из ленты

> Выявлен: 2026-09-30
> Статус: исправлен в 2.268.x

**Симптом:** после перехода из ленты в таблицу клик по задаче в списке открывает пустое окно: содержимое карточки не появляется, панели инструментов нет. В Network проходит только `check-exist-and-access`, запроса карточки `POST /api/tasks` нет вовсе, консоль браузера пуста. Воспроизводится и в обычном, и в инкогнито-режиме; обновление страницы и повторное открытие задачи карточку показывают.

**Причина:** диалог открывался с якорем уничтоженного представления. `ModalWindowsService.openDialog` брал `ViewContainerRef` у инжектора вызывающего окружения, а `get()` поднимается по родителям: у standalone-виджета ленты родитель — узел страницы ленты, поэтому после ухода со страницы последнее окружение в реестре отдавало ссылку на уничтоженный контейнер. Диалог создавался в отцепленном от документа якоре и проверку изменений не проходил. Отказ объединения проходов проверки изменений zone.js (`eventCoalescing`, `runCoalescing`) как причина не подтвердился: после возврата `provideZoneChangeDetection()` к вызову без опций пустое окно воспроизводилось снова.

**Обходной путь:** обновить страницу и открыть задачу заново.

## 16. Вкладка блока «Используется» показывала и сохраняла раскладку соседней вкладки

> Статус: исправлен в 2.268

**Симптом:** в блоке «Используется» на карточке задачи вкладка открывалась с чужим составом колонок и чужим отбором — набором соседней вкладки. Например, во вкладке «Договоры — Оплаты» вместо «Дата оплаты / Договор / Этап работ / Сумма / Валюта» и отбора «Активные» показывались «Номер задачи / Статус / Сумма» и «Все записи» — набор вкладки «Бонусы». Вид зависел от того, с какой вкладки перешли и какой запрос успел ответить, поэтому у одного пользователя на разных карточках вкладка выглядела по-разному.

**Данные:** конфиг от сервера для разных карточек совпадает (`GET /api-core/datasource/TaskUsed/{id}/config`), настройки вкладки в `DataSourceSettings` корректны — расхождение возникало на фронте. Воспроизводится при задержке ответа конфига 0–3 с и быстрых переключениях вкладок.

**Причина:** таблица блока одна на все вкладки, а конфиг вкладки приходит потоком с `shareReplay`: при смене вкладки он сначала отдаёт конфиг предыдущей. Часть потребителей конфига проверяла принадлежность конфига текущей вкладке, часть — нет: без проверки остались чтение сохранённого состояния вкладки, подписка на смену вкладки и запись состояния. Пока к таблице применён чужой конфиг, состояние вкладки читать и записывать нельзя — иначе чужое состояние уходит на сервер и записывается под идентификатором текущей вкладки, и после перезагрузки страницы вкладка продолжает открываться с чужими колонками.

**Исправлено (2.268).** Все потребители конфига проверяют его принадлежность текущей вкладке; состояние не записывается, пока к таблице применён конфиг другой вкладки, и не сохраняются пустой набор колонок и состояние, в котором скрыты все колонки. Поведение закреплено модульными тестами на обе стороны гонки.

**Обходной путь (для вкладки, вид которой испорчен):** меню «⋮» у вкладки → «Вид по умолчанию». Перезагрузка страницы (F5) не помогает: испорченный вид уже сохранён за пользователем. На сборке до 2.268 обходной путь нужен и после сброса — дефект воспроизведётся снова.

**Затронуты:** таблица блока «Используется» (любые вкладки) в карточке задачи.

**Связанные документы:**

- [Гриды и фильтры — Решение проблем](https://help.1forma.ru/domains/grids/support-guide.md), раздел «Колонки грида»

## 17. Необработанное исключение JavaScript при быстром переключении задач подряд

> Статус: исправлен в 2.268

**Симптом:** при быстром переключении между строками таблицы с открытой карточкой задачи — заметнее всего в таблице «Мои задачи» и при переходе между задачами из разных категорий — в консоли браузера появляется необработанное исключение JavaScript. Проявляется нерегулярно: примерно раз на 5–7 серий быстрых кликов по 8 нажатий, при переходах между задачами одной категории реже.

**Данные:** карточка открыта справа от таблицы (режим «Просмотр»), клики по строкам идут подряд, без ожидания загрузки карточки.

**Причина:** гонка состояния в блоке системных параметров карточки. Параметры задачи и список статусов её категории приходят двумя независимыми потоками и объединялись без учёта порядка: если задача сменилась раньше, чем загрузился список статусов новой категории, поиск статуса по идентификатору шёл по прежнему списку и возвращал пустое значение. Оно доходило до подписчика, который читал настройку статуса без проверки, — отсюда исключение.

**Исправлено (2.268).** Потоки выстроены последовательно: список статусов запрашивается для уже выбранной задачи, пустой результат больше не публикуется, чтение настройки дополнительно защищено. Поведение закреплено автотестом на гонку.

**Затронуты:** открытая карточка задачи в таблице при быстром переключении строк; заметнее в таблице «Мои задачи» и при переходах между задачами из разных категорий.

**Связанные документы:**

- [Гриды — Business](https://help.1forma.ru/domains/grids/business.md), раздел «Карточка задачи и синхронизация с таблицей», абзац «Быстрая смена строк»

## 19. Подсказка фильтра даты о неверном диапазоне была английской и с машинной датой

> Статус: исправлен в 2.268 «Скульптор»

**Симптом:** в фильтре колонок «дата» и «дата и время» при типе «Диапазон», если в поле «До» стоит дата раньше, чем в «От», под фильтром появлялось английское сообщение, а дата в нём была в машинном виде: `Date must be after Fri Oct 02 2026 00:00:00 GMT+0300`. Ошибок в консоли не было — это локализация, а не сбой логики.

**Причина:** две части. Ключа подсказки о неверном диапазоне не было в словаре подписей таблиц, поэтому показывалось собственное сообщение библиотеки. Сама дата подставлялась в него браузерным преобразованием — с сокращёнными названиями дня и месяца на латинице и техническим часовым поясом.

**Исправлено.** Текст подсказки берётся из словаря на языке интерфейса, а дата подставляется в формате приложения: `дд.мм.гггг`, а если время задано — `дд.мм.гггг чч:мм`. Подстановку делает общий перехватчик, зарегистрированный при запуске приложения, поэтому подсказка исправлена во всех таблицах с фильтром даты на общем словаре подписей; для культур, где строки пока нет, берётся английский шаблон с тем же форматом даты. Проверка диапазона не менялась — некорректный диапазон по-прежнему не применяется.

**Обходной путь (на сборках до исправления):** нет. Сообщение английское, но отбор при перевёрнутых границах и так не применяется — достаточно поменять границы местами.

**Связанные документы:**

- [Гриды — Фильтры](https://help.1forma.ru/domains/grids/filters-reference.md), раздел «Фильтр по дате и по дате-времени»
- Гриды — Frontend, раздел «Локализация подписей грида»

## 18. В подсказке по обрезанному значению видна верхушка четвёртой строки

> Статус: исправлен в 2.268

**Симптом:** в дереве подзадач карточки задачи (карточка → блок «Подзадачи» → подзадачи) подсказка по длинному названию задачи показывает три строки и многоточие, но под многоточием видна верхушка четвёртой строки — она выглядит как «полустрока», обрезанная по горизонтали. Видно только на длинных названиях: если текст помещается в три строки, дефекта не заметно. Правка общая, поэтому дефект наблюдался и в других таблицах, но заметнее всего был в подзадачах.

**Причина:** отступ пузыря подсказки задан полями блока на том же элементе, где текст ограничен тремя строками. Ограничение отсчитывает строки от внутренней границы элемента, а поля добавляют к нему место снизу — в это место и попадает обрезанная строка.

**Исправлено.** В общем стиле подсказок таблиц (`apps/spa/src/scss/themes/_ag-grid-fix.scss`, блок `.ag-tooltip`) поля обнулены, а тот же отступ задан непрозрачной рамкой цвета фона. Рамка находится вне обрезаемой области, поэтому отсечение идёт по границе текста, а размеры и вид пузыря сохранились. Изменение действует на все подсказки таблиц и блоков с задачами в карточке.

**Связанные документы:**

- [Гриды — Business](https://help.1forma.ru/domains/grids/business.md), подзаголовок «Всплывающая подсказка ячейки»

## 20. Фильтр мультилукапа с пустым `taskId` ронял загрузку грида

> Выявлен: 2026-10-06
> Статус: исправлен в 2.268 «Скульптор»

**Симптом:** фильтр по колонке-мультилукапу (тип фильтра «Выбор значений»), у значения которого задача не проставлена, давал ошибку загрузки грида — экран не показывал данные. Запрос данных отвечал `500`, в журнале исключений — ошибка приведения `null` к числу по пути `taskId`.

**Причина:** значение фильтра разбирается в отдельную модель, и её поле с идентификатором задачи было обязательным целым — пустое значение роняло разбор необработанным исключением.

**Исправлено.** Поле объявлено необязательным; на выборку оно не влияет — отбор идёт по самому значению фильтра. Поведение при заполненных значениях прежнее.

**Затронуты:** грид категории и раздела, колонки Лукап/Мультилукап с типом фильтра «Выбор значений»; то же значение фильтра используется при экспорте и в сохранённых видах.

**Обходной путь:** нет. На сборках до исправления фильтр по такой колонке лучше не ставить.

## 21. ПКМ по колонке-лукапу ставил «Нет значения» вместо значения ячейки

> Выявлен: 2026-10-02 (регрессия)
> Статус: исправлен в 2.268 «Скульптор»

**Симптом:** в гриде правый клик по значению ячейки колонки «Ссылка» или «Множественная ссылка» → «Фильтр по значению» ставил отбор «Нет значения», а «Исключая значение» — «Есть значения». В таблице оставались либо все заполненные, либо все незаполненные строки вместо строк с выбранной задачей. Проявлялось на непустой ячейке в реестре категории, в реестре раздела, в блоке «Используется» и в окне выбора задачи по лукапу.

**Причина:** регрессия от сценария, возвращавшего пункт «Исключая значение» на колонках с фильтром «Выбор значений» (коммит `56498d2372`, ветка `dev`). Обработчик меню брал идентификатор значения ячейки только из поля `selectedValues` и лишь при строковом значении. Колонки, у которых значение приходит в другой форме, давали пустой идентификатор, и оба пункта уходили в ветку пустой ячейки. Дополнительно колонки-лукапы с текстовым фильтром до этого обработчика не доходили: у текстового фильтра нет `createContextMenuModel`, поэтому отбор падал в общий текстовый fallback и тоже становился пустым.

**Исправлено.** Идентификаторы и текст ячейки разбираются общим разборщиком значения, а не полем `selectedValues`; отбор по значению строится для любой колонки «Ссылка» и «Множественная ссылка», независимо от типа фильтра в заголовке. Ветка «нет значения» / «есть значение» осталась только для действительно пустой ячейки. Поведение закрыто юнит-тестами `grid-context-menu-filter.util.spec.ts`.

**Обходной путь:** нет. Признак старого поведения — отбор по непустой ячейке лукапа даёт «Нет значения» или «Есть значения».

**Связанные документы:**

- [Гриды — Business](https://help.1forma.ru/domains/grids/business.md), подзаголовок «Фильтры по значению ячейки»

## 22. По колонке лукапа с доступом по матрице пропадали фильтр и сортировка

> Выявлен: 2026-10-05 (регрессия)
> Статус: исправлен в 2.268 «Скульптор»

**Симптом:** на колонке дополнительного параметра типа «Ссылка» или «Множественная ссылка», у которого включён доступ «По матрице доступа», в контекстном меню ячейки пропадали пункты «Фильтр по значению» и «Исключая значение», а сортировка и группировка по колонке были недоступны. Без матрицы доступа на том же лукапе пункты были на месте. Значения фильтра и агрегаты по такой колонке тоже не отдавались.

**Причина:** сервис доступа к колонкам грида получал состояния категории через подменяемое в DI свойство `ResolveCategoryStates`. Подмена отдавала состояния, не связанные с настройкой доступа, и операции по колонке закрывались там, где настройка их разрешает. Признак виден прямо в ответе конфигурации грида: `allowedOperations: []`, `filterReadScope: denied`, `filterDisabledReasonCode: noReadAccess`.

**Исправлено.** Подменяющее свойство удалено, состояния категории берёт базовая реализация, поэтому операции по колонке выдаются ровно там, где их разрешает настройка доступа. Права не расширены: где чтение закрыто хотя бы в одном состоянии категории, колонка остаётся недоступной — фильтр, сортировка, группировка и агрегаты по ней по-прежнему не отдаются.

**Обходной путь:** нет. Признак старого поведения — по такой колонке нет ни пунктов фильтра в контекстном меню, ни сортировки, а в ответе конфигурации пустой `allowedOperations`.

**Связанные документы:**

- [Гриды — Business](https://help.1forma.ru/domains/grids/business.md), подзаголовок «Фильтр, поиск, сортировка и группировка по параметрам с ограничением доступа»

## 23. Группировка по колонке без имени в теле запроса отдавала 500

> Статус: исправлен в 2.268 «Скульптор»

**Симптом:** запрос группировки, в котором колонка группировки приходит без имени — пустым элементом или объектом без поля `field`, — отвечал `500`. Так же вели себя выгрузка таблицы и запрос групп произвольного источника данных с тем же составом группировочных колонок: вместо файла или списка групп приходила ошибка. Из интерфейса такое состояние не возникает — группировка всегда приходит по названной колонке, поэтому дефект наблюдался только на прямом вызове API.

**Причина:** состав группировки читается из тела запроса, и потребители брали имя колонки, не проверив, что она вообще названа. Проверка стояла в одном месте пути, а в остальных её не было.

**Исправлено.** Колонка группировки без имени отбрасывается до чтения имени на всех путях: реестр задач, таблица ДП «Таблица» и окно множественного выбора, выгрузка таблицы, выгрузка и группы произвольного источника данных. Нумерация уровней при этом не сдвигается — пропуск сделан до обращения к ключу группы, поэтому соответствие «колонка — ключ» сохраняется и группировка по остальным колонкам работает как прежде. Элемент сортировки с пустым или отсутствующим именем колонки отбрасывается тем же проходом. Отказ для раскрытой группы по некорректной колонке произвольного источника данных сохранён намеренно: там причина отказа — неверная настройка источника, и молчаливый пропуск скрыл бы её от администратора.

**Затронуты:** группировка в реестре задач и разделов, в таблице ДП «Таблица» и в окне множественного выбора, выгрузка таблицы, выгрузка и группы произвольного источника данных. Для группировки по названным колонкам поведение прежнее.

**Обходной путь:** нет. На сборках до исправления прямой вызов API с таким составом группировки отвечает `500`.

**Связанные документы:**

- [Гриды — Решение проблем](https://help.1forma.ru/domains/grids/support-guide.md), раздел «Сортировка и группировка»
- Гриды — Backend, раздел «Проверки доступа и входа»

## 24. Лента, сгруппированная по исполнителю, падала с ошибкой 500

> Статус: исправлен в 2.268 «Скульптор»

**Симптом:** лента задач, сгруппированная по колонке «Исполнитель», при раскрытии группы не загружалась: запрос данных отвечал `500` с текстом `Incorrect syntax near 'id'.` (номер 50000), лента не открывалась целиком. Дефект признан платформенным: он воспроизводился и на клиентском стенде, и на проде. Лента без группировки и группировка по другим колонкам работали как обычно.

**Причина:** при группировке ключ раскрытой группы становится фильтром колонки. Ключ группы у колонки «Исполнитель» ожидается числом — идентификатором пользователя, а приходил JSON-объект вида `{"id":N,"isWaitingSign":false}`: это форма ключа группировки по состоянию. Сырое значение уходило в числовой слот фильтра без разбора, а хранимая функция сборки условия фильтра склеивала его в текст запроса, который процедура ленты выполняет повторно. На выходе получалось негодное условие вида `Tasks.RespPerformerUserId = ({"id":4,"isWaitingSign":false})` — именно этот текст и даёт ошибку `Incorrect syntax near 'id'.`

**Исправлено.** Две стороны. В коде ключ группировки по исполнителю разбирается как целое число до обращения к базе: нечитаемый ключ отвергается осмысленным отказом фильтра, а не падением запроса. В базе значение, попавшее в числовой слот, проверяется перед подстановкой в динамический SQL: остаётся только число (со знаком, дробью, экспонентой и пробелами по краям), всё прочее, включая объект с ведущими пробелами, заменяется на `cast(null as int)`. Условие остаётся годным и просто ничего не отбирает. Правило действует на MS SQL и на PostgreSQL, изменение пришло парой миграций; уже применённые миграции не правились.

**Затронуты:** лента задач и табличное представление категории, группировка по колонке «Исполнитель» с раскрытой группой. Косвенно защищены все фильтры с числовым значением, потому что проверка стоит в общей сборке условия.

**Пользовательский исход:** вместо ошибки и пустого экрана — обычная лента; группа с нечитаемым ключом приходит пустой, остальные группы и данные на месте. Числовой отбор по исполнителю без группировки отдаёт те же строки, что и раньше.

**Обходной путь:** на сборках до исправления — не группировать ленту по колонке «Исполнитель» и не раскрывать такие группы; фильтр по исполнителю с числом работает корректно.

**Что осталось за рамками правки.** Причина, по которой ключ группировки колонки «Исполнитель» приходил в форме ключа состояния, признана дефектом клиентской части и вынесена в отдельную работу. Колонка «Владелец» идёт по тому же пути, но не нормализована: падения там нет, группа владельца остаётся молча пустой.

**Связанные документы:**

- Гриды — Changelog, запись про ленту, сгруппированную по исполнителю
- [Гриды и фильтры — Решение проблем](https://help.1forma.ru/domains/grids/support-guide.md), раздел «Фильтрация»
- [Гриды — Справочник фильтров](https://help.1forma.ru/domains/grids/filters-reference.md), раздел «Пользователи и роли»

## 26. Цвет статуса в таблице не обновляется после смены цвета и пропадает после ошибки

> Статус: ожидаемое поведение

**Симптом:** администратор сменил цвет статуса, но в уже открытой таблице ячейки статуса остались прежними; либо после сетевой ошибки ячейки статуса бесцветны до перезагрузки страницы.

**Причина:** палитра цветов статусов запрашивается один раз при открытии таблицы и хранится в памяти грида. Если первый запрос не удался, вместо палитры хранится пустая карта.

**Что делать:** перезагрузить страницу или заново открыть таблицу. При устойчивой бесцветности на исправной сети — проверить, загружается ли список статусов категории.

**Связанные документы:**

- [Гриды — Business](https://help.1forma.ru/domains/grids/business.md), раздел «Стилизация системных колонок»
- Гриды — Frontend, раздел «Пакет state: стиль ячейки статуса»

## 25. Раскрытие групп «Сохраненные значения» и «Доступно для выбора» в окне выбора мультилукапа отвечало ошибкой

> Статус: исправлен в 2.268 «Скульптор»

**Симптом:** в окне выбора значений параметра «Множественная ссылка», сгруппированного по колонке «Выбор», раскрытие группы отвечало ошибкой загрузки: запрос строк приходил с кодом 400. Окно открывалось, список групп и счётчики приходили, не открывались только строки внутри раскрытой группы. Раскрытие обычной группы работало, как и запрос строк без этой группировки.

**Причина:** фильтр строк внутри раскрытой группы строился общим правилом — текстовым условием `equals` по имени колонки группировки. Колонки «Выбор» в выборке нет: это служебное поле-маркер, по которому сервер сам делит строки на группы, и обычного условия по нему быть не может.

**Исправлено.** Для поля-маркера фильтр строится по номеру задачи тем же сохранённым набором, которым построена сама группа: «Сохраненные значения» — номера из набора, «Доступно для выбора» — все остальные. Счётчик группы и состав её строк теперь всегда совпадают, в том числе после сохранения параметра и повторного открытия окна; ключ группы, не совпадающий ни с одной из двух, даёт пустую группу, а не ошибку. Раскрытие прочих групп и группировка по прочим колонкам не изменились. Правило действует для окна выбора, открытого из карточки задачи.

**Обходной путь:** на сборках до исправления — снять группировку по колонке «Выбор» в окне выбора и работать с плоским списком.

**Связанные документы:**

- [Дополнительные параметры — Business](https://help.1forma.ru/domains/ext-params/business.md), раздел «Группировка по сохранённым значениям (колонка «Выбор»)»
- [Групповой выбор в ДП «Выбор нескольких задач из категории» — SSRM](https://help.1forma.ru/domains/ext-params/lookup/ssrm-group-selection.md), раздел «Фильтр раскрытой группы»

## 27. Пустая таблица источника данных и ошибки в консоли при ответе 403

> Статус: исправлен в 2.268 «Скульптор»

**Симптом:** при открытии источника данных, права на который пользователю не выданы, табличное представление показывало пустой список без объяснения, а в консоли браузера появлялись необработанные исключения. Запрос конфигурации источника отвечал 403.

**Причина:** ответ 403 на источнике данных стал штатным (источник без групп или с группами, где пользователя нет, закрыт), а таблицы источника его не обрабатывали: отказ доходил до необработанного исключения, данные не загружались, объяснения пользователь не получал.

**Исправлено.** Ответ 403 на загрузку конфигурации, строк данных, групп и агрегатов обрабатывается во всех таблицах источника — административной, встроенной в карточку задачи и в табличном дополнительном параметре. Вместо пустой таблицы показывается сообщение об отсутствии прав, панель инструментов и пустая таблица скрываются, повторные запросы данных блокируются до смены источника или вкладки.

**Обходной путь:** нет. Признак старого поведения — пустая таблица источника без сообщения и необработанные исключения в консоли при ответе 403.

**Связанные документы:**

- [Произвольные источники данных](https://help.1forma.ru/domains/grids/custom-data-sources.md), подраздел «Если прав на источник нет»
- Grids — Frontend, подраздел «Отказ 403 при загрузке источника данных»

## 28. Поиск по ленте задач отдавал 500 на элементе сортировки без имени колонки

> Статус: исправлен в 2.268 «Скульптор»

**Симптом:** запрос поиска по ленте задач, в теле которого элемент сортировки приходит без имени колонки — пустой строкой, без поля с именем или со значением из одних пробелов, — отвечал ошибкой сервера, и вместо результатов поиска пользователь получал сообщение об ошибке. От прав дефект не зависел, из интерфейса такое состояние не возникает: сортировка всегда приходит по названной колонке.

**Причина:** имя колонки сортировки разбиралось без проверки, и пустая строка роняла запрос необработанным исключением.

**Исправлено.** Элемент сортировки без имени обрабатывается как отсутствующий: он отбрасывается, запрос обрабатывается по остальным параметрам. Правило действует на поиск по ленте, ленту задач, табличное представление категории и раздела и на таблицу дополнительного параметра «Таблица». Отбрасывание стоит до чтения имени колонки, поэтому порядок строк не меняется, а флаги сортировки применяются как при запросе без такого элемента. На табличном пути пробельное имя раньше приводило к отказу по запросу — теперь это обычный запрос.

**Что осталось за рамками правки.** Тот же дефект на другом входе — в группировке табличных параметров, где колонка группировки приходит без имени. Это отдельная карточка.
