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