Ошибки при обновлении Docsvision

Серьезная ошибка внедрения. Часть 2

В данной статье проанализируем возможные ошибки при обновлении, возникшие по причине неверного проектирования решения. Расскажу варианты их решения.

Первая часть статьи: https://dvadmin.ru/серьезная-ошибка-внедрения/ .

Перед глазами инженера ошибки вида:

  • Нарушается уникальность атрибутов внутри записей секции. Запись с уникальным значением атрибута уже существует.
  • В англоязычной локали она имеет вид:
    Data breaks unique constraint within section.

Разберем причины ее появления на живом примере.
Если вы прочли первую часть этой статьи, то понимаете, что работать дальше мы будем с видом карточки, что идет в составе приложения «Управление документами», пусть это будет вид «Дополнительное соглашение».

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

Виды в справочнике Docsvision

Прошло время, проект сдан, система эксплуатируется и пришло время обновляться. Запускаем обновление через консоль настройки, выбираем модули, включая «Управление документами», в процессе получаем ожидаемую ошибку:

Ошибка уникальности Docsvision

Заглянем в лог сервера и найдем место с временем возникновения ошибки.

StorageServerRuntime Error: 0 : Нарушено "dvsys_refkinds_cardkinds_uc_tree_name" ограничения UNIQUE KEY. Не удается вставить повторяющийся ключ в объект "dbo.dvtable_{c7ba000c-6203-4d7f-8c6b-5cb6f1e6f851}". Повторяющееся значение ключа: (Дополнительное соглашение, 05a57fbb-4f53-43f5-a8f5-75e4ef13f87c, 24ee818b-34b8-4362-84bb-75e35bcf5759, <NULL>).
Выполнение данной инструкции было прервано.

    Method name: 
    Param1: Failed operation: Order: 102, operation: UpdateRow. Data: RowID:d906e197-7856-4256-a13f-6c4de8bc1234,SectionTypeID:c7ba000c-6203-4d7f-8c6b-5cb6f1e6f851
    Stack trace:    в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   ...
   ...
StorageServerRuntime Error: 0 : Internal exception, error code: TreeUniquenessViolated.
....

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

RowID: d906e197-7856-4256-a13f-6c4de8bc1234,

SectionTypeID: c7ba000c-6203-4d7f-8c6b-5cb6f1e6f851

Информация о секции c7ba000c-6203-4d7f-8c6b-5cb6f1e6f851 располагается в таблице [dvtable_{c7ba000c-6203-4d7f-8c6b-5cb6f1e6f851}], посмотрим, что же хранится в записи с RowId = d906e197-7856-4256-a13f-6c4de8bc1234, с помощью запроса:

select * from [dbo].[dvtable_{c7ba000c-6203-4d7f-8c6b-5cb6f1e6f851}]
where RowID = 'd906e197-7856-4256-a13f-6c4de8bc1234'
Запрос в базу данных Docsvision

Увидим, что под этим идентификатором хранится вид, с названием Дополнительное соглашение к ТД, а скрипт обновления пытается обновить эту строку и записать в него название «Дополнительное соглашение». Скрипт не сможет этого сделать, так как уже присутствует строка с одинаковым набором полей и таким названием (мы его создавали позже).
Получается, что процесс обновления не может пройти дальше, пока мы самостоятельно не решим проблему.

Что можно сделать?

Первое, что приходит в голову, это переименовать текущий вид «Дополнительное соглашение» во что-то другое, а вид «Дополнительное соглашение к ТД» вернуть первоначальное состояние, переименовав его в «Дополнительное соглашение».
Но, не все так просто. Стоит понимать, что скрипт обновления содержит данные об изменяемом виде, а это значит, что все настройки данного вида будут затерты настройками «по-умолчанию». Все то, что вы изменяли для данного вида, по крайней мере, в рамках справочника, будет перезаписано. Из возможных ситуаций, данный вариант не самый проблемный, иногда, пути вернуть все назад, может практически не быть. Поэтому и стоит еще на этапе проектирования решения с большой внимательностью отнестись к вопросу использования объектов «из коробки», содержащихся в приложениях.

Какие варианты существуют еще?

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

Пропуск обновления Document Management

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

что с папками?

Все тоже самое, переместив папку на уровень ниже, вы нарушили структуру папок, и решив проблему с видами, на этапе загрузки данных о карточке папок вы получите ошибку вида:

Процесс обновления хочет записать информацию о папке «Договоры», но видит, что такое название используется в другой строке таблицы базы данных, с отличным значением ParentTreeRowID (идентификатор родительской строки в иерархической секции).
Решением будет восстановление исходной структуры папок, ровно такой, как она была после создания базы данных Docsvision.

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

Опубликовано

в

,

от


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *