Может ли у разных объектов 1С быть одинаковый GUID и как найти причину дублирования

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

Разбор ситуации: одинаковый GUID при выгрузке данных

Рассмотрим распространенную проблему, с которой сталкиваются разработчики при выгрузке данных из 1С: в итоговом отчете у нескольких строк с разным набором реквизитов выводится один и тот же УникальныйИдентификатор (GUID). На первый взгляд кажется, что платформа 1С создала разные элементы справочника с идентичным идентификатором. Однако проанализируем, возможна ли такая ситуация на физическом уровне и чем на самом деле обусловлено такое поведение системы.

Может ли у разных элементов одного справочника совпадать GUID на уровне базы данных

На физическом уровне СУБД (MS SQL Server, PostgreSQL и др.) для каждого справочника 1С создается отдельная таблица. Поле ссылки _IDRRef является частью первичного ключа и защищено уникальным индексом. Попытка записать два разных элемента с одинаковым GUID в одну и ту же таблицу штатным механизмом 1С приведет к ошибке СУБД — Violation of PRIMARY KEY constraint.

Естественным образом платформа 1С не допускает дублирования GUID в рамках одного объекта метаданных. Тем не менее, теоретически совпадение идентификаторов или некорректное отображение ссылок возможно по следующему ряду причин:

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

Методы диагностики и проверки уникальности GUID

Разберем по шагам, как проверить, действительно ли в базе существуют дубли GUID или проблема заключается в некорректно написанном запросе.

  1. Проверка простым запросом без соединений.

    Создадим элементарный отчет на СКД или выполним прямой запрос к справочнику без использования табличных частей и левых соединений. Для группировки строк и проверки уникальности используем следующий подход:

    
    ВЫБРАТЬ
        ОС.Ссылка КАК Ссылка,
        КОЛИЧЕСТВО(ОС.Ссылка) КАК Количество
    ИЗ
        Справочник.ОсновныеСредства КАК ОС
    ГРУППИРОВАТЬ ПО
        ОС.Ссылка
    ИМЕЮЩИЕ
        КОЛИЧЕСТВО(ОС.Ссылка) > 1
    

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

  2. Использование функции XMLСтрока.

    Для корректного получения строкового представления уникального идентификатора в запросах и отчетах 1С рекомендуется использовать встроенную функцию XMLСтрока(). Она принимает ссылку на объект и сразу возвращает строковое представление GUID в формате XML:

    
    ВЫБРАТЬ
        XMLСтрока(ОС.Ссылка) КАК GUID,
        ОС.Ссылка КАК Ссылка
    ИЗ
        Справочник.ОсновныеСредства КАК ОС
    
  3. Проверка на уровне СУБД (для клиент-серверного варианта).

    Если есть подозрения на физическое повреждение индексов СУБД, выполняем прямой SQL-запрос к таблице справочника на стороне сервера базы данных:

    
    SELECT _IDRRef, COUNT(*) 
    FROM _ReferenceX 
    GROUP BY _IDRRef 
    HAVING COUNT(*) > 1
    

    Где _ReferenceX — имя физической таблицы справочника в СУБД.

Как исправить проблему дублирования данных

Проанализировав исходный запрос, в большинстве случаев можно обнаружить, что задвоение строк вызвано соединением таблицы справочника с его табличной частью или смежной подчиненной таблицей. При наличии нескольких записей в подчиненной таблице исходный элемент справочника со своим GUID дублируется для каждой подчинённой строки, создавая визуальную иллюзию того, что у разных объектов базы один и тот же GUID.

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

В случае реального повреждения индексов базы данных необходимо выполнить реиндексацию таблиц в СУБД (REBUILD INDEX) или запустить режим Тестирование и исправление информационной базы в Конфигураторе 1С.

← На главную