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

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

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

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

Причины возникновения ошибки

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

  1. Заполнено свойство «Основная таблица»: если в свойствах динамического списка указана ОсновнаяТаблица (например, Справочник.Контрагенты), платформа 1С ожидает, что каждая строка в результате запроса будет однозначно идентифицироваться ссылкой. Ссылка выступает уникальным первичным ключом. Если в результате выполнения запроса одна и та же ссылка появляется более одного раза, платформа не может сопоставить строки списка с объектами базы данных и блокирует вывод.
  2. Особенности работы компоновщика настроек при поиске: динамический список формирует результирующий SQL-запрос на лету с помощью системы компоновки данных (СКД). Без отборов платформа часто оптимизирует запрос и исключает неиспользуемые соединения. Но как только пользователь вводит строку поиска или накладывает отбор по дополнительному полю, СКД подключает связанные таблицы (левые соединения). Если связь построена по принципу «один ко многим», строки исходной таблицы размножаются, образуя дубликаты поля Ссылка.
  3. Некорректные левые соединения (LEFT JOIN): если запрос списка соединяется с регистром сведений (контактная информация, дополнительные реквизиты, телефоны) или табличной частью, по одному объекту может быть несколько записей. Это гарантированно приводит к задвоению ссылок.
  4. Группировки в настройках динамического списка: если в пользовательских или стандартных настройках списка включены группировки по полям, в рамках которых ссылка повторяется, платформа также фиксирует дублирование ключей.

Способ 1. Использование ключевого слова РАЗЛИЧНЫЕ

Рассмотрим самый простой случай: если левые соединения возвращают дублирующиеся строки с полностью идентичными наборами выбранных полей, достаточно добавить в запрос ключевое слово РАЗЛИЧНЫЕ.

Посмотрим на пример текста произвольного запроса динамического списка:


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

Инструкция ВЫБРАТЬ РАЗЛИЧНЫЕ отсечет полные дубли строк и устранит ошибку, если в выборку не выводятся уникальные поля из подчиненной таблицы.

Способ 2. Агрегация и группировка данных в запросе

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

Разберем по шагам правильное построение запроса с группировкой:


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

Использование секции СГРУППИРОВАТЬ ПО и агрегатных функций (МАКСИМУМ, МИНИМУМ, СУММА) гарантирует, что каждая Ссылка встретится в результате ровно один раз.

Способ 3. Корректная работа с виртуальными таблицами регистров сведений

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

Проанализируем правильное обращение к виртуальной таблице СрезПоследних:


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

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

Способ 4. Настройка составных ключевых полей

Если по бизнес-логике список действительно должен отображать повторяющиеся ссылки (например, список строк договоров по контрагентам, где один контрагент встречается несколько раз), используем следующий алгоритм:

  1. Открываем свойства динамического списка на форме.
  2. Очищаем свойство ОсновнаяТаблица (оставляем поле пустым).
  3. Находим свойство КлючевыеПоля (в настройках списка) и указываем набор колонок, комбинация которых дает уникальный ключ строки (например, Ссылка + Договор или Ссылка + НомерСтроки).

Важное ограничение: очистка свойства ОсновнаяТаблица отключает стандартные команды списка (автоматическое создание, копирование, пометку на удаление по стандартным горячим клавишам), а также механизм динамического считывания порций данных. Используйте данный подход только в специализированных формах выбора или отчетов.

Способ 5. Проверка и исправление данных в информационной базе

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

  1. Открываем внешнюю обработку «Консоль запросов».
  2. Вставляем текст запроса из динамического списка и устанавливаем отбор по проблемному объекту.
  3. Анализируем результат: определяем, какая именно связанная таблица возвращает несколько записей для одного элемента.
  4. Исправляем дублирующиеся записи в базе данных (удаляем дубли контактных лиц, задвоенные реквизиты или некорректные записи регистров сведений).
← На главную