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

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

При обновлении типовых конфигураций (например, «Бухгалтерия предприятия 3.0» или «ERP»), базирующихся на Библиотеке стандартных подсистем (БСП), разработчики и системные администраторы часто сталкиваются с критической ошибкой: «Записи регистра стали неуникальными». Чаще всего это происходит с объектом РегистрСведений.УдалитьЗамерыВремениТехнологические. Ситуация осложняется тем, что даже после ручной очистки регистра через интерфейс проблема может сохраняться. Разберем подробно, почему это происходит и как гарантированно исправить ситуацию несколькими способами.

Почему возникает ошибка в «пустом» регистре?

Прежде чем переходить к действиям, проанализируем ситуацию. Регистры с префиксом Удалить — это объекты, которые разработчики 1С планируют исключить из состава конфигурации в будущих релизах. В процессе обновления система пытается выполнить реструктуризацию таблицы: изменить индексы, состав измерений или перенести данные в новый основной регистр (например, ЗамерыВремениТехнологические). Ошибка неуникальности возникает, если в физической таблице базы данных присутствуют записи, нарушающие новые правила уникальности (индексы).

Рассмотрим основные причины, по которым обычная очистка в режиме «1С:Предприятие» не помогает:

Способ 1. Тотальная очистка всех регистров оценки производительности

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

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


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

Важно: Перед выполнением очистки обязательно отключите сбор замеров производительности. Для этого перейдем в раздел Администрирование — Обслуживание — Оценка производительности и снимем флаг «Оценка производительности включена».

Способ 2. Очистка на уровне СУБД (для клиент-серверного варианта)

Если программная очистка наборов записей не помогает, проанализируем состояние таблицы на уровне SQL-сервера. Это самый надежный метод устранения «фантомных» записей.

  1. Выясним имя таблицы в базе данных. Для этого в консоли запросов 1С или через специальную обработку выполним метод ПолучитьСтруктуруХраненияБазыДанных.
  2. Найдем таблицу, соответствующую РегистрСведений.УдалитьЗамерыВремениТехнологические. Обычно она имеет имя вида _InfoRegXXXX.
  3. Запустим SQL Server Management Studio и выполним команду:

-- Замените _InfoReg1234 на ваше реальное имя таблицы
TRUNCATE TABLE _InfoReg1234;

Использование команды TRUNCATE предпочтительнее DELETE, так как она полностью освобождает место, занимаемое данными, и сбрасывает счетчики, что гарантирует отсутствие конфликтов при перестроении индексов платформой 1С.

Способ 3. Радикальный метод: удаление объекта из метаданных

В некоторых случаях, особенно на специфических релизах платформы (например, 8.3.16.1063), ошибка реструктуризации может быть вызвана багом самой платформы. Если регистр имеет префикс Удалить, это означает, что данные в нем не представляют ценности для ведения учета.

Рассмотрим по шагам процесс удаления «проблемного звена»:

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

При этом действии 1С полностью удалит физическую таблицу из базы данных. После этого обновление метаданных из файла поставки (.cf или .cfu) создаст этот регистр заново в «чистом» виде с правильной структурой, и ошибка исчезнет.

Способ 4. Работа с кэшем и технологическим журналом

Если вы уверены, что регистр пуст, но ошибка сохраняется, проанализируем состояние кэша сервера 1С. Бывает, что сервер хранит старую структуру индексов в памяти.

Выясним причину через Технологический журнал. Для этого настроим logcfg.xml на сбор событий DBV8DBDirect и EXCP. Это позволит увидеть конкретный SQL-запрос, на котором происходит сбой, и понять, какие именно значения полей вызывают дублирование.

Также рекомендуется выполнить следующие действия:

Особенности платформы 8.3.16

Проанализируем техническую информацию по релизу 8.3.16.1063, указанному в теме. Данная ветка платформ имела проблемы с фоновой реструктуризацией. Если ошибка не уходит, попробуйте временно отключить фоновую реструктуризацию в параметрах базы данных или обновить платформу до более стабильных релизов (например, ветки 8.3.17 или 8.3.20+), где механизмы работы с индексами были оптимизированы.

Резюме: Ошибка с регистром УдалитьЗамерыВремениТехнологические — это технический конфликт при обновлении устаревших объектов. Самым быстрым и эффективным решением является либо очистка через TRUNCATE на уровне SQL, либо временное удаление объекта из метаданных в режиме изменения конфигурации.

← На главную