Ситуация, когда в одном справочнике 1С появляются две записи с абсолютно одинаковыми уникальными идентификаторами (GUID), является критической аномалией. Согласно логике платформы, поле _IDRRef (хранящее ГУИД на уровне СУБД) защищено уникальным индексом, который должен предотвращать подобные записи. Однако в результате аппаратных сбоев, некорректной реструктуризации или ошибок при обмене данными через внешние компоненты такая ситуация возможна. В этой статье мы подробно разберем, почему возникает эта ошибка и как ее исправить, не прибегая к полной потере данных.
Проанализируем механику работы платформы. Когда мы пытаемся открыть, записать или удалить объект, 1С обращается к базе данных по его ссылке (ГУИД). Платформа ожидает получить одну уникальную строку. Если СУБД возвращает две строки с одним и тем же _IDRRef, объектная модель 1С не может определить, с какой именно версией данных работать, и блокирует операцию, выдавая стандартное сообщение об ошибке. Рассмотрим подробнее основные пути решения этой проблемы.
Этот метод считается наиболее безопасным с точки зрения целостности данных 1С, так как он задействует стандартные механизмы платформы. Разберем его по шагам:
Контрагенты). Чтобы исключить дубль при выгрузке, часто используют консоль запросов, где выбирают данные с группировкой по ссылке и применением функции МАКСИМУМ к остальным реквизитам. Однако для простых случаев достаточно стандартной выгрузки.TRUNCATE TABLE. Внимание! Перед этим шагом обязательно создайте резервную копию базы.
-- Пример для MS SQL / PostgreSQL
TRUNCATE TABLE _Reference123; -- Где 123 - это номер таблицы вашего справочника
TRUNCATE TABLE _Reference123_VT456; -- Не забудьте очистить связанные табличные части
Если мы не хотим очищать весь справочник, можно попробовать «хирургическое» вмешательство. Проанализируем ситуацию: нам нужно удалить только одну из двух физических строк. В MS SQL Server для этого можно использовать скрытое поле %%physloc%%, которое указывает на физический адрес строки на диске. Для быстрого определения имени таблицы справочника в СУБД можно использовать инструмент для анализа структуры хранения базы данных.
Рассмотрим пример запроса для поиска адресов строк-дублей:
SELECT %%physloc%%, _IDRRef, _Description
FROM _Reference123
WHERE _IDRRef = 0x80E600155D050B0111E59A8B637D0B7B -- Пример вашего ГУИДа в Hex-формате
Получив два разных физических адреса, мы можем составить команду DELETE, которая удалит только одну конкретную запись, не затрагивая вторую. Это мгновенно восстановит работоспособность объекта в 1С.
Если ваша база работает на PostgreSQL, ситуация решается аналогично, но с использованием системного поля ctid. Это поле определяет физическое местоположение версии строки внутри таблицы.
Выполним следующий алгоритм действий:
SELECT ctid, _idrref FROM _reference123 WHERE _idrref = '\x80E600155D050B0111E59A8B637D0B7B';
ctid:
DELETE FROM _reference123 WHERE ctid = '(0,1)'; -- Подставьте нужное значение ctid
Иногда физически строка в таблице всего одна, но из-за повреждения файла индекса СУБД «считает», что их две. В таком случае поможет полное перестроение индексов. Выясним, как это сделать:
REINDEX TABLE _Reference123;.ALTER INDEX ALL ON _Reference123 REBUILD;.После этой процедуры «фантомные» дубли могут исчезнуть, так как индекс будет построен заново на основе реальных данных в таблице. Для автоматического формирования команд реиндексации в PostgreSQL можно воспользоваться генератором скриптов индексации таблиц базы данных.
Чтобы в будущем не сталкиваться с подобными ошибками, проанализируем причины их возникновения. Чаще всего это происходит из-за:
autovacuum настроены правильно, и база регулярно проходит обслуживание.INSERT в таблицы 1С в обход объектной модели платформы, если не уверены в уникальности генерируемых _IDRRef.Подводя итог, отметим: если вы столкнулись с дублями ГУИД, наиболее быстрым и эффективным способом будет точечное удаление через SQL-запрос с использованием физических идентификаторов строк (ctid или physloc). Если же вы не обладаете доступом к СУБД, используйте метод с XML-выгрузкой, который гарантированно очистит структуру данных от некорректных записей.