При работе в управляемом приложении 1С:Предприятие пользователи и разработчики нередко сталкиваются с критической ошибкой: «Обнаружено дублирование ключевых значений в колонке "Ссылка". Отображение данных в списке невозможно». Ошибка чаще всего возникает при открытии списков справочников, форм подбора сотрудников или документов (например, ведомостей на выплату зарплаты) после обновления конфигурации или переноса данных.
Разберем природу этой ошибки, выясним технические причины её возникновения и рассмотрим проверенные способы устранения проблемы на уровне данных и настроек конфигурации.
В основе управляемых форм списков лежит объект платформы ДинамическийСписок. Для обеспечения быстрой постраничной подгрузки данных динамический список опирается на ключевое поле — как правило, это поле Ссылка основной таблицы.
Платформа генерирует исключение в следующих ситуациях:
Ссылка перестает быть уникальным идентификатором строки.1С:ЗУП и 1С:Бухгалтерия такие регистры, как ДанныеДляПодбораСотрудников, ТекущиеКадровыеДанныеСотрудников или КадроваяИсторияСотрудниковИнтервальный, могут содержать логические дубли или некорректные срезы.Если ошибка возникает только у конкретного пользователя после обновления конфигурации, проанализируем настройки формы.
Выясним причину дублирования на уровне данных. Для этого извлечем запрос динамического списка из формы (через конфигуратор или точку останова в отладчике) и выполним его в консоли запросов.
Посмотрим на пример запроса для поиска задвоившихся элементов:
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
КОЛИЧЕСТВО(Сотрудники.Ссылка) КАК КоличествоСтрок
ИЗ
РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
ПО ДанныеДляПодбораСотрудников.Сотрудник = Сотрудники.Ссылка
СГРУППИРОВАТЬ ПО
Сотрудники.Ссылка
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Сотрудники.Ссылка) > 1
Если запрос возвращает строки, значит, в регистре сведений по конкретным сотрудникам накопилось более одной актуальной записи. Необходимо открыть проблемный регистр и удалить лишние дублирующие строки либо скорректировать периоды записей.
Если ошибка возникла после переноса данных из предыдущих версий программ (например, перенос из ЗУП 2.5 или 7.7), типовые механизмы срезов последних могли не сформироваться корректно.
1С:Бухгалтерия применим следующий прием: в разделе Зарплата и кадры > Настройки зарплаты переключим признак ведения учета зарплаты в положение Во внешней программе, запишем настройку, затем вернем значение В этой программе. Это принудительно запустит регламентные процедуры перезаполнения кадровых срезов.Если список является нетиповым или разрабатывается с нуля, разберем правила настройки свойств ДинамическийСписок:
ОсновнаяТаблица указан справочник или документ, платформа автоматически считает поле Ссылка уникальным ключом строки. Если запрос возвращает несколько строк на один объект, снимем значение в свойстве ОсновнаяТаблица.КлючевыеПоля укажем такую комбинацию полей, которая гарантированно является уникальной для каждой строки выборки (например, Ссылка + НомерСтроки или Сотрудник + Период).РАЗЛИЧНЫЕ не всегда помогает при динамическом считывании. Надежнее применять группировку СГРУППИРОВАТЬ ПО по ключевым полям с использованием агрегатных функций к остальным колонкам:
ВЫБРАТЬ
Сотрудники.Ссылка КАК Ссылка,
МАКСИМУМ(Данные.Состояние) КАК Состояние
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияСотрудников КАК Данные
ПО Данные.Сотрудник = Сотрудники.Ссылка
СГРУППИРОВАТЬ ПО
Сотрудники.Ссылка
Если ошибка возникает исключительно при интерактивном поиске по подстроке в форме списка, проанализируем состояние полнотекстового поиска:
После выполнения указанных шагов отображение данных в динамических списках восстановится без потери пользовательской информации.