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

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

При работе в современных конфигурациях на базе 1С:УТ 11, ERP или КА пользователи часто сталкиваются с неприятной ошибкой в формах подбора товаров: «Обнаружено дублирование ключевых значений в колонках: "Ссылка". Отображение данных в списке невозможно». В этой ситуации список товаров становится пустым, а выбрать нужную позицию невозможно. Разберем детально, почему это происходит и как исправить проблему системными методами.

Почему возникает эта ошибка?

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

Ошибка возникает в тот момент, когда к основной таблице присоединяются дополнительные данные (через ЛЕВОЕ СОЕДИНЕНИЕ), и в этих дополнительных таблицах находится более одной записи, соответствующей условию связи. В итоге одна и та же номенклатура «размножается» в выборке, и платформа блокирует вывод данных, так как не может определить, на какую именно строку позиционировать курсор.

Шаг 1. Анализ запроса динамического списка

Первым делом проанализируем типичный запрос подбора товаров, который может вызывать проблему. Как правило, в типовых решениях (УТ 11.5) запрос динамического списка выглядит следующим образом:


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

Рассмотрим подробнее точки риска в этом запросе. В данном примере «виновниками» могут быть таблицы СоглашениеТовары или ВсеОстатки. Если в одном документе соглашения одна и та же позиция заведена двумя строками (например, с разными упаковками или просто по ошибке), запрос выдаст дубль ссылки номенклатуры.

Шаг 2. Локализация «проблемного» соединения

Для того чтобы выяснить, какая именно таблица дает дубли, воспользуемся методом последовательного исключения. Разберем алгоритм действий в конфигураторе и отладчике:

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

Шаг 3. Поиск дублей в данных (Соглашения и Цены)

Выясним причину дублирования в самих данных. Чаще всего проблема кроется в индивидуальных соглашениях с клиентами. Если в соглашении на вкладке «Уточнение цен по товарам» одна и та же номенклатура добавлена дважды, динамический список не сможет корректно отобразить остатки и цены.

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


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

Если запрос вернул строки — необходимо зайти в указанное соглашение и удалить дублирующиеся записи. После этого ошибка «Обнаружено дублирование...» исчезнет мгновенно.

Шаг 4. Проверка регистра «Распределение запасов»

Если в соглашениях чисто, проанализируем регистр РегистрСведений.РаспределениеЗапасов. В УТ 11.5 это критически важный механизм. Дубли могут возникать, если система некорректно закрыла записи по складам или назначениям.

Попробуем исключить влияние регистра в запросе динамического списка или проверить наличие «битых» записей через консоль запросов, группируя данные по измерениям Номенклатура, Склад, Назначение и Состояние.

Шаг 5. Исправление через Ключи аналитики

Еще одна возможная причина — дублирование в справочнике КлючиАналитикиУчетаНоменклатуры. Это системный справочник, который используется для связи номенклатуры с ее параметрами в регистрах накопления.

Разберем, как исправить это:

Рекомендации по предотвращению ошибки

Чтобы ситуация не повторялась, рекомендуем придерживаться следующих правил:

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

Таким образом, мы выяснили, что ошибка всегда связана с неуникальностью результата запроса по ключевому полю. Самый быстрый способ решения — найти дубли в «Соглашениях» или «Установках цен» и привести данные в порядок.

← На главную