Как исправить ошибку «Записи регистра сведений стали неуникальными» при обновлении 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

В процессе администрирования и обновления типовых решений на платформе 1С:Предприятие 8.3 (например, конфигурации «Бухгалтерия предприятия, редакция 3.0») технические специалисты часто сталкиваются со следующей критической ошибкой при реструктуризации базы данных: «Записи регистра сведений стали неуникальными». Наиболее часто эта коллизия проявляется на регистрах, связанных с хранением присоединенных файлов и их двоичных данных, таких как ДвоичныеДанныеФайлов или ПрисоединенныеФайлы.

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

Выясняем техническую причину ошибки

Для того чтобы эффективно устранить сбой, нам необходимо понять физику процесса реструктуризации таблиц базы данных 1С. Когда платформа сообщает о неуникальности записей в абсолютно пустом регистре сведений, проблема кроется не в самих данных (информации), а в структуре метаданных и расхождении внутренних уникальных идентификаторов (GUID/UUID) объектов конфигурации.

Рассмотрим основные технические причины возникновения этой ошибки:

  1. Расхождение внутренних UUID метаданных. Это ключевая причина. Если в процессе прошлых доработок, ручных обновлений или некорректных сравнений-объединений конфигураций стандартный регистр сведений (или его ключевые измерения) был удален и создан заново с абсолютно аналогичным именем, его внутренний идентификатор (GUID) изменился. При очередном обновлении на новый типовой релиз платформа пытается сопоставить объекты по их UUID. Не найдя старого идентификатора, система пытается создать «новый» регистр или новое измерение поверх старого в SQL, что приводит к конфликту уникальности физических индексов таблиц СУБД.
  2. Фантомные записи на уровне СУБД. В базах данных под управлением MS SQL Server или PostgreSQL стандартная очистка таблиц через средства 1С (например, запись пустого набора) иногда оставляет неявные индексы или «битые» транзакционные записи, которые мешают платформе перестроить структуру таблицы.
  3. Влияние механизмов РИБ (Распределенных информационных баз). При активном обмене данными в периферийных базах могут возникать коллизии генерации GUID для новых элементов справочников присоединенных файлов. При обновлении метаданных обработчики пытаются переиндексировать данные, натыкаясь на дублирующиеся «битые» ссылки (объекты с пометкой «Объект не обнаружен»).
  4. Конфликт обработчиков отложенного обновления. В современных конфигурациях БСП (Библиотеки стандартных подсистем) перенос двоичных данных файлов из базы в тома (или реструктуризация хранения файлов) выполняется в фоне. Если фоновое задание было аварийно прервано, физические таблицы могут находиться в транзитном состоянии.

Ниже мы подробно разберем практические шаги по диагностике и устранению этой проблемы.

Шаг 1. Полная очистка проблемного регистра сведений

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


НаборЗаписей = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьНаборЗаписей();
НаборЗаписей.Записать(Истина);
ИнформационнаяОтладка = "Регистр успешно очищен на уровне платформы.";
ЗаписатьВЛог(ИнформационнаяОтладка);

Если после этого реструктуризация базы данных всё равно завершается ошибкой, это подтверждает гипотезу о расхождении метаданных (UUID) или наличии фантомных записей на уровне базы данных SQL. Если база данных клиент-серверная, системный администратор может выполнить команду полной очистки таблицы на уровне СУБД (предварительно сделав резервную копию базы данных!):


-- ВНИМАНИЕ: Выполнять только на копии базы данных!
-- Находим имя физической таблицы регистра (например, _InfoRg1234) и очищаем её
TRUNCATE TABLE _InfoRg1234;

Если ошибка сохраняется и после этого, переходим к анализу метаданных конфигурации.

Шаг 2. Анализ и сопоставление UUID конфигураций

Для исправления расхождения уникальных идентификаторов нам потребуется детально сравнить основную конфигурацию базы данных с чистой конфигурацией поставщика из файла поставки (расширение .cf). Проанализируем этот процесс по шагам:

  1. Откроем базу данных в режиме Конфигуратор.
  2. Перейдем в меню Конфигурация -> Сравнить, объединить с конфигурацией из файла... и выберем файл конфигурации поставщика (соответствующий текущему релизу вашей базы).
  3. В появившемся окне сравнения по умолчанию платформа пытается сопоставить объекты по их UUID. Наша задача — проверить, нет ли скрытых дублей.
  4. Нажмите правой кнопкой мыши на корневой элемент дерева конфигурации и снимите флажок «Установить соответствие по именам».

Проанализируем результат. Если после отключения сопоставления по именам вы увидели, что стандартный регистр сведений ДвоичныеДанныеФайлов (или связанный с ним справочник присоединенных файлов) отображается в окне сравнения как два разных объекта (один присутствует только в конфигурации поставщика, другой — только в основной конфигурации), это указывает на явное расхождение UUID. Для платформы это два абсолютно разных регистра, несмотря на идентичные имена!

Шаг 3. Методика пересборки метаданных без потери данных

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

  1. В основной конфигурации переименуем проблемный регистр сведений (или его измерения, у которых разошлись UUID), добавив префикс Удалить_ (например, Удалить_ДвоичныеДанныеФайлов).
  2. Выполним обновление конфигурации базы данных (клавиша F7). Платформа создаст новую физическую таблицу для метаданных СУБД, сохранив старые данные в таблице с префиксом Удалить_.
  3. Выполним объединение с чистой конфигурацией поставщика. Теперь в системе появится «родной» регистр сведений от поставщика со всеми правильными UUID, но он будет пустой.
  4. Напишем и запустим простую обработку по переносу данных из таблицы Удалить_ДвоичныеДанныеФайлов в новый чистый регистр ДвоичныеДанныеФайлов. Пример шаблона кода для переноса данных рассмотрим ниже:

ВыборкаСтарыхДанных = РегистрыСведений.Удалить_ДвоичныеДанныеФайлов.Выбрать();
Пока ВыборкаСтарыхДанных.Следующий() Цикл
    НоваяЗапись = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьМенеджерЗаписи();
    ЗаполнитьЗначенияСвойств(НоваяЗапись, ВыборкаСтарыхДанных);
    Попытка
        НоваяЗапись.Записать(Истина);
    Исключение
        ЗаписьЖурналаРегистрации("ОшибкаПереноса", УровеньЖурналаРегистрации.Предупреждение,,, 
            "Не удалось перенести запись для файла: " + ВыборкаСтарыхДанных.File);
    КонецПопытки;
КонецЦикла;

После успешного переноса данных и проверки работоспособности присоединенных файлов мы можем окончательно удалить объект Удалить_ДвоичныеДанныеФайлов из конфигурации и повторно выполнить реструктуризацию.

Шаг 4. Очистка битых ссылок при использовании РИБ

Если ваша база работает в распределенном режиме (РИБ), часто причиной сбоя уникальности при обновлении становятся «битые» ссылки. Платформа пытается построить индекс по измерению, содержащему ссылку на несуществующий элемент справочника файлов. Чтобы исправить это, выполним следующие действия:

  1. Запустим режим Тестирование и исправление информационной базы (меню Администрирование -> Тестирование и исправление...).
  2. В настройках обязательно выберем пункты:
    • Проверка логической целостности информационной базы;
    • Проверка ссылочной целостности информационной базы.
  3. В поле «При наличии ссылок на несуществующие объекты» установим переключатель в положение Очищать ссылки (или Создавать деблокирующие объекты, в зависимости от политики учета вашей компании).
  4. Запустим процесс выполнения.

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

Резюме и рекомендации

Мы детально разобрали сложную техническую коллизию неуникальности записей при обновлении конфигураций 1С. Чтобы минимизировать риски возникновения подобных ошибок в будущем, рекомендуем придерживаться нескольких простых правил: всегда выполняйте резервное копирование перед накатыванием релизов, детально контролируйте изменения UUID при ручном переносе объектов через сравнение-объединение и своевременно проводите профилактическое тестирование и исправление базы данных.

← На главную