Рассмотрим распространенную проблему, с которой сталкиваются разработчики при выгрузке данных из 1С: в итоговом отчете у нескольких строк с разным набором реквизитов выводится один и тот же УникальныйИдентификатор (GUID). На первый взгляд кажется, что платформа 1С создала разные элементы справочника с идентичным идентификатором. Однако проанализируем, возможна ли такая ситуация на физическом уровне и чем на самом деле обусловлено такое поведение системы.
На физическом уровне СУБД (MS SQL Server, PostgreSQL и др.) для каждого справочника 1С создается отдельная таблица. Поле ссылки _IDRRef является частью первичного ключа и защищено уникальным индексом. Попытка записать два разных элемента с одинаковым GUID в одну и ту же таблицу штатным механизмом 1С приведет к ошибке СУБД — Violation of PRIMARY KEY constraint.
Естественным образом платформа 1С не допускает дублирования GUID в рамках одного объекта метаданных. Тем не менее, теоретически совпадение идентификаторов или некорректное отображение ссылок возможно по следующему ряду причин:
УстановитьСсылкуНового() с фиксированным GUID или сбои при алгоритмах обмена между информационными базами.Разберем по шагам, как проверить, действительно ли в базе существуют дубли GUID или проблема заключается в некорректно написанном запросе.
Проверка простым запросом без соединений.
Создадим элементарный отчет на СКД или выполним прямой запрос к справочнику без использования табличных частей и левых соединений. Для группировки строк и проверки уникальности используем следующий подход:
ВЫБРАТЬ
ОС.Ссылка КАК Ссылка,
КОЛИЧЕСТВО(ОС.Ссылка) КАК Количество
ИЗ
Справочник.ОсновныеСредства КАК ОС
ГРУППИРОВАТЬ ПО
ОС.Ссылка
ИМЕЮЩИЕ
КОЛИЧЕСТВО(ОС.Ссылка) > 1
Если такой запрос не возвращает ни одной строки, значит, физических дублей элементов в таблице базы данных нет, и проблема кроется в структуре исходного запроса.
Использование функции XMLСтрока.
Для корректного получения строкового представления уникального идентификатора в запросах и отчетах 1С рекомендуется использовать встроенную функцию XMLСтрока(). Она принимает ссылку на объект и сразу возвращает строковое представление GUID в формате XML:
ВЫБРАТЬ
XMLСтрока(ОС.Ссылка) КАК GUID,
ОС.Ссылка КАК Ссылка
ИЗ
Справочник.ОсновныеСредства КАК ОС
Проверка на уровне СУБД (для клиент-серверного варианта).
Если есть подозрения на физическое повреждение индексов СУБД, выполняем прямой SQL-запрос к таблице справочника на стороне сервера базы данных:
SELECT _IDRRef, COUNT(*)
FROM _ReferenceX
GROUP BY _IDRRef
HAVING COUNT(*) > 1
Где _ReferenceX — имя физической таблицы справочника в СУБД.
Проанализировав исходный запрос, в большинстве случаев можно обнаружить, что задвоение строк вызвано соединением таблицы справочника с его табличной частью или смежной подчиненной таблицей. При наличии нескольких записей в подчиненной таблице исходный элемент справочника со своим GUID дублируется для каждой подчинённой строки, создавая визуальную иллюзию того, что у разных объектов базы один и тот же GUID.
Для устранения этой проблемы перепишите запрос, исключив некорректное соединение таблиц или применив сгруппированные вложенные запросы.
В случае реального повреждения индексов базы данных необходимо выполнить реиндексацию таблиц в СУБД (REBUILD INDEX) или запустить режим Тестирование и исправление информационной базы в Конфигураторе 1С.