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