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