Гриды — Известные проблемы¶
Реестр выявленных багов и ограничений гридов 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 Статус: ограничение подтверждено
Симптом: в представлении «Иерархия» отображаются только статические дополнительные параметры категории. Динамические колонки, формируемые через хранимые процедуры или другие источники динамических настроек колонок, в дереве не выводятся.
Причина: представление «Иерархия» строит набор полей из настроек иерархии категории и не учитывает динамические колонки грида. Поддержка динамических колонок есть в табличном представлении, но не в дереве.
Затронуты: представление категории «Иерархия», дополнительные параметры в гриде иерархии, динамические колонки.
Обходной путь: для отображения динамических колонок использовать табличное представление вместо иерархии.
Связанные документы:
- Гриды — решение проблем (раздел 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 — в японском и китайском словах пробел не ставится, и значение без пробелов там верное.
Связанные документы:
- Локализация — Администрирование, раздел «Качество значения в ресурсном файле», пункт про пробелы по краям значения
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, раздел «Виды таблиц»
10. Раскрытие группы в окне выбора задач отдавало весь набор значений¶
Выявлен: 2026-09-21 Статус: исправлен в 2.268.x
Симптом: в окне выбора задач, которое открывается у ДП «Ссылка» и «Множественная ссылка», при группировке по колонке-лукапу раскрытие группы показывало весь набор выбранных значений вместо строк этой группы — на группе со счётчиком 1 в списке оказывался весь набор.
Причина: категории источника определялись позже, чем проверялся доступ к колонке дополнительного параметра. При пустом наборе категорий групповое условие по такой колонке снималось, и сервер отдавал строки без ограничения по группе.
Исправлено. Категории источника подставляются до проверки доступа к колонке, поэтому групповое условие по колонке-лукапу больше не снимается и раскрытие группы возвращает только её строки; в заголовке группы видно название связанной задачи. Права не ослаблены: подстановка категорий служит только проверке доступа и состав выборки не меняет, закрытый параметр по-прежнему не фильтруется.
Связанные документы:
- Дополнительные параметры — Business, раздел «Табличный вид параметра Multilookup»
11. Подсказка по ячейке в гриде ДП «Таблица» и на своих заголовках показывается всегда¶
Статус: не исправлено
Симптом: в гриде табличного дополнительного параметра «Таблица» и на колонках, где заголовок отрисован своим компонентом, подсказка появляется при наведении на значение, которое целиком помещается в колонку. В реестре категории, таблице подзадач и блоках информации карточки задачи подсказки на необрезанном тексте нет — поведение расходится между поверхностями.
Причина: показ только при обрезке задан глобально (tooltipShowMode: 'whenTruncated') и не действует на колонки, у которых объявлен свой cellRenderer: ag-grid пропускает для них встроенную проверку обрезки, и подсказку обязан объявить сам рендерер вызовом setCellTooltipWhenTruncated. В гриде ДП «Таблица» рендереры хелпер не вызывают. На колонках с собственным headerComponent (priority, favorites, icon, choose-all в гриде источника данных) подсказка шапки задана напрямую через headerTooltip и обрезку не проверяет.
Обходной путь: сузить колонку или включить перенос текста по строкам, чтобы значение помещалось целиком.
Связанные документы:
- Гриды — Business, подзаголовок «Всплывающая подсказка ячейки»
12. Подсказка по обрезанной ячейке не исчезает после ухода курсора¶
Статус: исправлен в 2.268.x
Симптом: в реестре категории (вид «Таблица», с группировкой и открытой карточкой справа) подсказка по обрезанному значению остаётся на экране после ухода курсора — при переходе на соседнюю строку, в правую панель, после клика по строке. При наведении на другую строку появляется вторая подсказка, первая не уходит; на экране одновременно висят две, они перекрывают соседние строки и карточку.
Причина: обработчики показа и скрытия подсказки привязаны к элементу ячейки. Если ячейка перерисовывается или удаляется при показанной подсказке — смена ширины грида при открытии карточки, обновление данных, сворачивание группы, прокрутка, — событие ухода курсора на прежний элемент не приходит, и пузырь остаётся на экране. Исправление — глобальный сторож показа подсказок, с изменениями за пределами реестра категории оно не связано.
Исправлено. Показ и скрытие подсказок грида ведёт общий сторож (apps/spa/src/app/common/ag-grid-tooltip-guard.ts), подключённый в общих настройках грида: показанную подсказку он запоминает вместе с её ячейкой и убирает при уходе курсора, прокрутке, смене размера грида, перерисовке ячейки, добавлении или удалении строки и при уничтожении грида, удаляя пузырь из разметки сразу. Двух подсказок на экране одновременно не бывает. Поведение закреплено автотестом ag-grid-tooltip-guard.spec.ts.
Связанные документы:
- Гриды — Business, подзаголовок «Всплывающая подсказка ячейки»
13. Строка конструктора поиска остаётся от прежнего отбора¶
Статус: исправлен в 2.268.x
Симптом: в табличном представлении категории отбор, условие которого задано через конструктор поиска, подставлял это условие в строку конструктора. Если затем выбрать другой отбор или снять отбор кнопкой «Очистить», таблица переключалась на новую выборку, а строка конструктора оставалась заполненной прежним условием — и продолжала работать: лишнее условие уходило в запрос выборки.
Причина: модель конструктора поиска живёт в текущем состоянии грида отдельно от идентификатора отбора. При смене отбора новая выборка применялась, а прежняя модель в гриде оставалась — она уходила в запрос и записывалась в состояние, которое потом возвращалось при снятии отбора.
Исправлено. В обработчике смены отбора модель конструктора гасится до применения нового отбора — gridApi.setAdvancedFilterModel(null). Сохранённые отборы не перезаписываются: сбрасывается только модель текущего грида. Сброс происходит и при снятии отбора, и при переходе на другой пользовательский отбор, и не происходит, когда отбор не менялся, — например, при смене статуса задач внутри отбора. Покрыто тестами: смена на «Без отбора», смена на другой пользовательский отбор, правка статуса внутри отбора.
Затронуты: табличное представление категории (грид задач).
Обходной путь: нет. Признак старого поведения — после снятия отбора строка конструктора осталась заполненной прежним условием; лишнее условие убирается очисткой строки вручную.
Связанные документы:
- Гриды — Business, раздел «Пользовательские отборы»
14. «Не равно» по колонке «Дата и время» не убирает выбранный день¶
Статус: исправлен в 2.268
Симптом: в гриде категории фильтр «Не равно» по колонке «Дата и время» с выбранным в календаре днём оставлял в таблице все записи этого дня: из выдачи пропадали только записи ровно с временем 00:00. Чип над гридом при этом выглядел правильно — Дата создания <> 30.09.2026 00:00:00, поэтому фильтр выглядел применённым. По колонке «только дата» то же условие отсекало выбранный день целиком, то есть поведение расходилось между типами колонок.
Причина: клиент отправлял отрицательное условие обычным сравнением notEqual, а суточное отрицание — операцией «не в диапазоне», отрицанием полуинтервала от начала дня до полуночи следующих суток — не отправлял вовсе. Двумя условиями «меньше» и «больше», объединёнными через «или», отрицание не собиралось: такой составной фильтр 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() к вызову без опций пустое окно воспроизводилось снова.
Обходной путь: обновить страницу и открыть задачу заново.
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, раздел «Карточка задачи и синхронизация с таблицей», абзац «Быстрая смена строк»
19. Подсказка фильтра даты о неверном диапазоне была английской и с машинной датой¶
Статус: исправлен в 2.268 «Скульптор»
Симптом: в фильтре колонок «дата» и «дата и время» при типе «Диапазон», если в поле «До» стоит дата раньше, чем в «От», под фильтром появлялось английское сообщение, а дата в нём была в машинном виде: Date must be after Fri Oct 02 2026 00:00:00 GMT+0300. Ошибок в консоли не было — это локализация, а не сбой логики.
Причина: две части. Ключа подсказки о неверном диапазоне не было в словаре подписей таблиц, поэтому показывалось собственное сообщение библиотеки. Сама дата подставлялась в него браузерным преобразованием — с сокращёнными названиями дня и месяца на латинице и техническим часовым поясом.
Исправлено. Текст подсказки берётся из словаря на языке интерфейса, а дата подставляется в формате приложения: дд.мм.гггг, а если время задано — дд.мм.гггг чч:мм. Подстановку делает общий перехватчик, зарегистрированный при запуске приложения, поэтому подсказка исправлена во всех таблицах с фильтром даты на общем словаре подписей; для культур, где строки пока нет, берётся английский шаблон с тем же форматом даты. Проверка диапазона не менялась — некорректный диапазон по-прежнему не применяется.
Обходной путь (на сборках до исправления): нет. Сообщение английское, но отбор при перевёрнутых границах и так не применяется — достаточно поменять границы местами.
Связанные документы:
- Гриды — Фильтры, раздел «Фильтр по дате и по дате-времени»
- Гриды — Frontend, раздел «Локализация подписей грида»
18. В подсказке по обрезанному значению видна верхушка четвёртой строки¶
Статус: исправлен в 2.268
Симптом: в дереве подзадач карточки задачи (карточка → блок «Подзадачи» → подзадачи) подсказка по длинному названию задачи показывает три строки и многоточие, но под многоточием видна верхушка четвёртой строки — она выглядит как «полустрока», обрезанная по горизонтали. Видно только на длинных названиях: если текст помещается в три строки, дефекта не заметно. Правка общая, поэтому дефект наблюдался и в других таблицах, но заметнее всего был в подзадачах.
Причина: отступ пузыря подсказки задан полями блока на том же элементе, где текст ограничен тремя строками. Ограничение отсчитывает строки от внутренней границы элемента, а поля добавляют к нему место снизу — в это место и попадает обрезанная строка.
Исправлено. В общем стиле подсказок таблиц (apps/spa/src/scss/themes/_ag-grid-fix.scss, блок .ag-tooltip) поля обнулены, а тот же отступ задан непрозрачной рамкой цвета фона. Рамка находится вне обрезаемой области, поэтому отсечение идёт по границе текста, а размеры и вид пузыря сохранились. Изменение действует на все подсказки таблиц и блоков с задачами в карточке.
Связанные документы:
- Гриды — Business, подзаголовок «Всплывающая подсказка ячейки»
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, подзаголовок «Фильтры по значению ячейки»
22. По колонке лукапа с доступом по матрице пропадали фильтр и сортировка¶
Выявлен: 2026-10-05 (регрессия) Статус: исправлен в 2.268 «Скульптор»
Симптом: на колонке дополнительного параметра типа «Ссылка» или «Множественная ссылка», у которого включён доступ «По матрице доступа», в контекстном меню ячейки пропадали пункты «Фильтр по значению» и «Исключая значение», а сортировка и группировка по колонке были недоступны. Без матрицы доступа на том же лукапе пункты были на месте. Значения фильтра и агрегаты по такой колонке тоже не отдавались.
Причина: сервис доступа к колонкам грида получал состояния категории через подменяемое в DI свойство ResolveCategoryStates. Подмена отдавала состояния, не связанные с настройкой доступа, и операции по колонке закрывались там, где настройка их разрешает. Признак виден прямо в ответе конфигурации грида: allowedOperations: [], filterReadScope: denied, filterDisabledReasonCode: noReadAccess.
Исправлено. Подменяющее свойство удалено, состояния категории берёт базовая реализация, поэтому операции по колонке выдаются ровно там, где их разрешает настройка доступа. Права не расширены: где чтение закрыто хотя бы в одном состоянии категории, колонка остаётся недоступной — фильтр, сортировка, группировка и агрегаты по ней по-прежнему не отдаются.
Обходной путь: нет. Признак старого поведения — по такой колонке нет ни пунктов фильтра в контекстном меню, ни сортировки, а в ответе конфигурации пустой allowedOperations.
Связанные документы:
- Гриды — Business, подзаголовок «Фильтр, поиск, сортировка и группировка по параметрам с ограничением доступа»
23. Группировка по колонке без имени в теле запроса отдавала 500¶
Статус: исправлен в 2.268 «Скульптор»
Симптом: запрос группировки, в котором колонка группировки приходит без имени — пустым элементом или объектом без поля field, — отвечал 500. Так же вели себя выгрузка таблицы и запрос групп произвольного источника данных с тем же составом группировочных колонок: вместо файла или списка групп приходила ошибка. Из интерфейса такое состояние не возникает — группировка всегда приходит по названной колонке, поэтому дефект наблюдался только на прямом вызове API.
Причина: состав группировки читается из тела запроса, и потребители брали имя колонки, не проверив, что она вообще названа. Проверка стояла в одном месте пути, а в остальных её не было.
Исправлено. Колонка группировки без имени отбрасывается до чтения имени на всех путях: реестр задач, таблица ДП «Таблица» и окно множественного выбора, выгрузка таблицы, выгрузка и группы произвольного источника данных. Нумерация уровней при этом не сдвигается — пропуск сделан до обращения к ключу группы, поэтому соответствие «колонка — ключ» сохраняется и группировка по остальным колонкам работает как прежде. Элемент сортировки с пустым или отсутствующим именем колонки отбрасывается тем же проходом. Отказ для раскрытой группы по некорректной колонке произвольного источника данных сохранён намеренно: там причина отказа — неверная настройка источника, и молчаливый пропуск скрыл бы её от администратора.
Затронуты: группировка в реестре задач и разделов, в таблице ДП «Таблица» и в окне множественного выбора, выгрузка таблицы, выгрузка и группы произвольного источника данных. Для группировки по названным колонкам поведение прежнее.
Обходной путь: нет. На сборках до исправления прямой вызов API с таким составом группировки отвечает 500.
Связанные документы:
- Гриды — Решение проблем, раздел «Сортировка и группировка»
- Гриды — 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, запись про ленту, сгруппированную по исполнителю
- Гриды и фильтры — Решение проблем, раздел «Фильтрация»
- Гриды — Справочник фильтров, раздел «Пользователи и роли»
26. Цвет статуса в таблице не обновляется после смены цвета и пропадает после ошибки¶
Статус: ожидаемое поведение
Симптом: администратор сменил цвет статуса, но в уже открытой таблице ячейки статуса остались прежними; либо после сетевой ошибки ячейки статуса бесцветны до перезагрузки страницы.
Причина: палитра цветов статусов запрашивается один раз при открытии таблицы и хранится в памяти грида. Если первый запрос не удался, вместо палитры хранится пустая карта.
Что делать: перезагрузить страницу или заново открыть таблицу. При устойчивой бесцветности на исправной сети — проверить, загружается ли список статусов категории.
Связанные документы:
- Гриды — Business, раздел «Стилизация системных колонок»
- Гриды — Frontend, раздел «Пакет state: стиль ячейки статуса»
25. Раскрытие групп «Сохраненные значения» и «Доступно для выбора» в окне выбора мультилукапа отвечало ошибкой¶
Статус: исправлен в 2.268 «Скульптор»
Симптом: в окне выбора значений параметра «Множественная ссылка», сгруппированного по колонке «Выбор», раскрытие группы отвечало ошибкой загрузки: запрос строк приходил с кодом 400. Окно открывалось, список групп и счётчики приходили, не открывались только строки внутри раскрытой группы. Раскрытие обычной группы работало, как и запрос строк без этой группировки.
Причина: фильтр строк внутри раскрытой группы строился общим правилом — текстовым условием equals по имени колонки группировки. Колонки «Выбор» в выборке нет: это служебное поле-маркер, по которому сервер сам делит строки на группы, и обычного условия по нему быть не может.
Исправлено. Для поля-маркера фильтр строится по номеру задачи тем же сохранённым набором, которым построена сама группа: «Сохраненные значения» — номера из набора, «Доступно для выбора» — все остальные. Счётчик группы и состав её строк теперь всегда совпадают, в том числе после сохранения параметра и повторного открытия окна; ключ группы, не совпадающий ни с одной из двух, даёт пустую группу, а не ошибку. Раскрытие прочих групп и группировка по прочим колонкам не изменились. Правило действует для окна выбора, открытого из карточки задачи.
Обходной путь: на сборках до исправления — снять группировку по колонке «Выбор» в окне выбора и работать с плоским списком.
Связанные документы:
- Дополнительные параметры — Business, раздел «Группировка по сохранённым значениям (колонка «Выбор»)»
- Групповой выбор в ДП «Выбор нескольких задач из категории» — SSRM, раздел «Фильтр раскрытой группы»
27. Пустая таблица источника данных и ошибки в консоли при ответе 403¶
Статус: исправлен в 2.268 «Скульптор»
Симптом: при открытии источника данных, права на который пользователю не выданы, табличное представление показывало пустой список без объяснения, а в консоли браузера появлялись необработанные исключения. Запрос конфигурации источника отвечал 403.
Причина: ответ 403 на источнике данных стал штатным (источник без групп или с группами, где пользователя нет, закрыт), а таблицы источника его не обрабатывали: отказ доходил до необработанного исключения, данные не загружались, объяснения пользователь не получал.
Исправлено. Ответ 403 на загрузку конфигурации, строк данных, групп и агрегатов обрабатывается во всех таблицах источника — административной, встроенной в карточку задачи и в табличном дополнительном параметре. Вместо пустой таблицы показывается сообщение об отсутствии прав, панель инструментов и пустая таблица скрываются, повторные запросы данных блокируются до смены источника или вкладки.
Обходной путь: нет. Признак старого поведения — пустая таблица источника без сообщения и необработанные исключения в консоли при ответе 403.
Связанные документы:
- Произвольные источники данных, подраздел «Если прав на источник нет»
- Grids — Frontend, подраздел «Отказ 403 при загрузке источника данных»
28. Поиск по ленте задач отдавал 500 на элементе сортировки без имени колонки¶
Статус: исправлен в 2.268 «Скульптор»
Симптом: запрос поиска по ленте задач, в теле которого элемент сортировки приходит без имени колонки — пустой строкой, без поля с именем или со значением из одних пробелов, — отвечал ошибкой сервера, и вместо результатов поиска пользователь получал сообщение об ошибке. От прав дефект не зависел, из интерфейса такое состояние не возникает: сортировка всегда приходит по названной колонке.
Причина: имя колонки сортировки разбиралось без проверки, и пустая строка роняла запрос необработанным исключением.
Исправлено. Элемент сортировки без имени обрабатывается как отсутствующий: он отбрасывается, запрос обрабатывается по остальным параметрам. Правило действует на поиск по ленте, ленту задач, табличное представление категории и раздела и на таблицу дополнительного параметра «Таблица». Отбрасывание стоит до чтения имени колонки, поэтому порядок строк не меняется, а флаги сортировки применяются как при запросе без такого элемента. На табличном пути пробельное имя раньше приводило к отказу по запросу — теперь это обычный запрос.
Что осталось за рамками правки. Тот же дефект на другом входе — в группировке табличных параметров, где колонка группировки приходит без имени. Это отдельная карточка.