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