Перейти к содержанию

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

Реестр выявленных багов и ограничений гридов 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 Статус: ограничение подтверждено

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

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

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

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

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


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 — в японском и китайском словах пробел не ставится, и значение без пробелов там верное.

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

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-раскладку.

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Гриды — Frontend, раздел «Column Packs и пользовательские настройки колонок», абзац «Подсказки ячеек (тултип)»
  • Гриды — Business, подзаголовок «Всплывающая подсказка ячейки»

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

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

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

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

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

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

  • Гриды — Frontend, раздел «Column Packs и пользовательские настройки колонок», абзац «Подсказки ячеек (тултип)»
  • Гриды — Business, подзаголовок «Всплывающая подсказка ячейки»

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

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

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

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

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

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

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

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

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

Статус: баг подтверждён, не исправлен

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

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

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

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

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

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() к вызову без опций пустое окно воспроизводилось снова.

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

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

  • Формы задач — Frontend, раздел «Что смотреть при разборе и типовые симптомы» — признак «нет POST /api/tasks»

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Гриды — Business, раздел «Карточка задачи и синхронизация с таблицей», абзац «Быстрая смена строк»

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

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

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

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

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

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