Как устранить ошибку «Обнаружено дублирование ключевых значений в колонке Ссылка» в 1С?

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

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

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

Почему возникает ошибка дублирования ключевых значений

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

Платформа генерирует исключение в следующих ситуациях:

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

Способ 1. Сброс пользовательских настроек формы списка

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

  1. В открытой форме нажмем Еще > Настроить список и нажмем кнопку Стандартные настройки.
  2. Если форма не открывается вовсе, перейдем в раздел Администрирование > Настройки пользователей и прав > Настройки пользователей.
  3. Найдем пользователя, откроем вкладку Внешний вид (или настройки форм) и очистим сохраненные настройки для проблемной формы.

Способ 2. Диагностика и локализация дублирующихся записей через консоль запросов

Выясним причину дублирования на уровне данных. Для этого извлечем запрос динамического списка из формы (через конфигуратор или точку останова в отладчике) и выполним его в консоли запросов.

Посмотрим на пример запроса для поиска задвоившихся элементов:


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

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

Способ 3. Перепроведение кадровых документов и актуализация регистров

Если ошибка возникла после переноса данных из предыдущих версий программ (например, перенос из ЗУП 2.5 или 7.7), типовые механизмы срезов последних могли не сформироваться корректно.

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

Способ 4. Корректировка динамического списка в конфигураторе или расширении

Если список является нетиповым или разрабатывается с нуля, разберем правила настройки свойств ДинамическийСписок:

  1. Очистка свойства «Основная таблица». Если в свойстве ОсновнаяТаблица указан справочник или документ, платформа автоматически считает поле Ссылка уникальным ключом строки. Если запрос возвращает несколько строк на один объект, снимем значение в свойстве ОсновнаяТаблица.
  2. Настройка состава ключевых полей. В свойстве КлючевыеПоля укажем такую комбинацию полей, которая гарантированно является уникальной для каждой строки выборки (например, Ссылка + НомерСтроки или Сотрудник + Период).
  3. Группировка в запросе. Использование ключевого слова РАЗЛИЧНЫЕ не всегда помогает при динамическом считывании. Надежнее применять группировку СГРУППИРОВАТЬ ПО по ключевым полям с использованием агрегатных функций к остальным колонкам:

ВЫБРАТЬ
    Сотрудники.Ссылка КАК Ссылка,
    МАКСИМУМ(Данные.Состояние) КАК Состояние
ИЗ
    Справочник.Сотрудники КАК Сотрудники
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияСотрудников КАК Данные
        ПО Данные.Сотрудник = Сотрудники.Ссылка
СГРУППИРОВАТЬ ПО
    Сотрудники.Ссылка

Способ 5. Обновление индекса полнотекстового поиска

Если ошибка возникает исключительно при интерактивном поиске по подстроке в форме списка, проанализируем состояние полнотекстового поиска:

  1. Перейдем в Администрирование > Обслуживание > Полнотекстовый поиск.
  2. Нажмем Очистить индекс, а затем выполним операцию Обновить индекс.

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

← На главную