Как исправить ошибку NullReferenceException при удалении группы вложений в задачах

8 0

В процессе доработки бизнес-логики может возникнуть необходимость удалить одну из групп вложений из настроек задачи. После публикации изменений открытие существующих заданий может сопровождаться исключением:

System.NullReferenceException: Object reference not set to an instance of an object.

at Sungero.Workflow.Server.TaskFamilyAttachments.GetAssignmentSiblingsGroupAttachmentDetails(IAssignmentBase assignment, IEnumerable`1 allAttachmentDetails, Guid groupId)

 

Причина возникновения ошибки

Настройки групп вложений хранятся в столбце attachmentsettings таблицы sungero_wf_assignment в формате JSON. При удалении группы вложений в переопределении задачи содержимое этого поля для уже созданных экземпляров заданий не обновляется автоматически. В результате при формировании карточки задания происходит обращение к несуществующей группе вложений, что приводит к разыменованию null-ссылки.

 

Структура настроек групп вложений

Поле attachmentsettings представляет собой массив объектов, каждый из которых описывает одну группу. Ключевыми полями являются:

- GroupId — уникальный идентификатор группы вложений (GUID)

- PreviousGroupId — идентификатор предыдущей группы в последовательности (для первой группы — 00000000-0000-0000-0000-000000000000)

- Id — обычно совпадает с GroupId

- Дополнительные флаги: IsHidden, IsEnabled, IsRequired, IsParentTaskGroup и др.

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

Первая группа вложений («Документ») имеет PreviousGroupId, равный нулевому GUID. Каждая последующая группа ссылается через PreviousGroupId на GroupId предшествующей.

 

Алгоритм исправления

1. Определить удалённую группу: сравнить актуальный список GroupId в карточке задачи с содержимым поля attachmentsettings проблемных заданий.

2. Извлечь JSON, удалить объект соответствующей группы.

3. Для группы, следовавшей сразу за удалённой, обновить значение PreviousGroupId на GroupId предшествующей группы (либо на нулевой GUID, если удалялась первая группа).

4. Обновить JSON в поле attachmentsettings на исправленный в базе данных для всех затронутых заданий.

Пример скрипта на обновление всех заданий разработанного типа:

UPDATE public.sungero_wf_assignment 
SET attachmentsettings = '[{"GroupId":"4195347f-2ca3-4fdc-9460-c22609cc3abf","PreviousGroupId":"00000000-0000-0000-0000-000000000000","IsHidden":false,"IsEnabled":false,"IsAttachmentsRemoveEnabled":false,"IsParentTaskGroup":true,"RelatedGroups":[],"HasGroupPopulatingEvent":false,"NeedLoadFromParent":false,"Id":"4195347f-2ca3-4fdc-9460-c22609cc3abf","IsRequired":true},{"GroupId":"29cf286f-d756-44e4-a688-bff2999e0368","PreviousGroupId":"4195347f-2ca3-4fdc-9460-c22609cc3abf","IsHidden":false,"IsEnabled":true,"IsAttachmentsRemoveEnabled":true,"IsParentTaskGroup":true,"RelatedGroups":[],"HasGroupPopulatingEvent":true,"NeedLoadFromParent":false,"Id":"29cf286f-d756-44e4-a688-bff2999e0368","IsRequired":false},{"GroupId":"4d26f724-46d5-44fa-83dc-d31375ab67bf","PreviousGroupId":"29cf286f-d756-44e4-a688-bff2999e0368","IsHidden":false,"IsEnabled":true,"IsAttachmentsRemoveEnabled":false,"IsParentTaskGroup":true,"RelatedGroups":[],"HasGroupPopulatingEvent":false,"NeedLoadFromParent":false,"Id":"4d26f724-46d5-44fa-83dc-d31375ab67bf","IsRequired":false}]'
WHERE discriminator = '1fd8c270-53ac-4734-9a5a-e8c80ccf24e6';

Мной уже было оформлено пожелание к системе, для автоматизации данного процесса, но пока описанный выше вариант ручного решения ошибки может использоваться как обходное решение, когда нужно здесь и сейчас. На момент написания статьи актуальная версия Directum RX 25.3.

8
Авторизуйтесь, чтобы оценить материал.
2
Пока комментариев нет.

Авторизуйтесь, чтобы написать комментарий