При выполнении процедуры «Тестирование и исправление информационной базы» в 1С:Предприятии 7.7 администраторы иногда сталкиваются с критической ошибкой: проверка уникальности внутреннего идентификатора документов выдает предупреждение о совпадении IDDOC у двух документов разных или одинаковых видов. Штатная утилита отказывается автоматически устранять проблему и требует ручного вмешательства. Разберем детально, почему возникает эта ошибка, какие таблицы базы данных затрагивает сбой и какими способами можно безопасно вернуть базу в рабочее состояние.
Для корректного решения проблемы выясним причину сбоя, иначе через некоторое время коллизия повторится вновь. В платформе 1С 7.7 за выдачу уникальных идентификаторов отвечает системный механизм, который может дать сбой в следующих ситуациях:
1SUIDCTL.DBF. Именно здесь фиксируется последнее выданное значение уникального номера. При аварийном завершении работы сеанса 1С (падение питания, зависание процесса, обрыв сетевого соединения) актуальное значение счетчика может не записаться на диск, в результате чего новый документ получает номер, который уже был присвоен ранее.*.CDX). При повреждении индексных файлов встроенный механизм платформы не видит уже существующий документ с таким идентификатором и разрешает запись дубля.Прежде чем переходить к ручной правке таблиц, проанализируем структуру идентификатора. В 1С 7.7 внутренний номер формируется в 36-ричной системе счисления (Base36, использующей цифры 0–9 и латинские буквы A–Z). Это означает, что просто прибавить единицу в привычном десятичном формате нельзя: значение необходимо рассчитывать именно по основанию 36.
Идентификатор имеет длину до 9 символов, где младшие разряды представляют собой порядковый номер, а старшие (до трех символов) — код информационной базы. Кроме того, документ связывается с множеством вспомогательных таблиц базы данных:
1CJOURN — общий журнал документов.DH* и DT* — таблицы шапки и табличной части конкретного вида документа._1SCRDOC — таблица подчиненных документов и графов отбора (поля CHILDID и PARENTVAL)._1SOPER и _1SENTRY — бухгалтерские операции и проводки (поле DOCID).RA* и RG* — таблицы движений и итогов регистров оперативного учета (поле IDDOC).SC* и периодических реквизитов 1SCONST, если в них присутствуют ссылки на данный документ. В случае реквизитов неопределенного типа ссылка состоит из 4-значного кода вида документа (IDDOCDEF) и самого идентификатора.Прямая правка файлов DBF через сторонние утилиты несет в себе высокий риск повредить логическую целостность базы. Если есть возможность запустить базу в пользовательском режиме, разберем по шагам наиболее безопасный алгоритм:
НайтиСсылки(), чтобы обнаружить все места, где старый документ был указан в качестве значения реквизита, родительского документа или основания.1CJOURN.Если документы имеют сложную подчиненность, период закрыт от редактирования или база вовсе не открывается штатными средствами, рассмотрим подробнее порядок прямой коррекции через DBF-редактор. Обязательно делаем полную резервную копию базы перед началом манипуляций!
IDDOC будет изменен.1CJOURN.DBF и определяем максимальный существующий IDDOC.IDDOC на новое значение в таблице 1CJOURN, а также в таблицах шапки (DH<НомерТаблицы>) и табличной части (DT<НомерТаблицы>) изменяемого документа._1SOPER, проводок _1SENTRY, движений регистров RA*, а также в таблице подчиненных документов _1SCRDOC.1SUIDCTL.DBF. Если в счетчике оставить старый номер, следующий созданный в программе документ снова получит уже занятый идентификатор.*.CDX из каталога информационной базы.Устранение уже возникшей коллизии решает проблему лишь временно. Чтобы исключить повторные сбои, применим системные меры защиты: