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

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

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

Анализируем причину возникновения ошибки

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

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

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

Решение проблемы через изменение запроса динамического списка

Самым эффективным и быстрым способом устранения данной ошибки является корректировка текста запроса в динамическом списке формы. Нам необходимо явно указать системе, что документы сторно не должны попадать в общую выборку реестра в данном конкретном списке, если они вызывают конфликт.

Рассмотрим алгоритм внесения изменений:

  1. Откроем конфигуратор и найдем документ ВзаимозачетЗадолженности.
  2. Перейдем к формам документа и откроем ФормаСписка.
  3. Найдем основной реквизит формы — Список (тип ДинамическийСписок).
  4. Откроем настройку «Произвольный запрос» и перейдем в конструктор запроса.
  5. В тексте запроса, где происходит обращение к таблице РегистрСведений.РеестрДокументов, добавим условие фильтрации.

Пример кода условия, которое необходимо добавить в секцию ГДЕ:


ГДЕ
    ...
    И НЕ РеестрДокументов.Ссылка ССЫЛКА Документ.Сторно

Это условие исключает документы типа Сторно из обработки механизмом реестра для данного списка, что устраняет дублирование ссылок и позволяет платформе корректно индексировать строки при прокрутке (скроллинге).

Использование расширений для сохранения типовой конфигурации

Поскольку 1С:ERP является часто обновляемой конфигурацией, крайне не рекомендуется вносить изменения напрямую в основную ветку. Разберем, как сделать это правильно с помощью механизма расширений:

  1. Создадим новое расширение или откроем существующее.
  2. Добавим в расширение форму списка документа ВзаимозачетЗадолженности.
  3. В расширении перехватим запрос динамического списка. Это можно сделать либо через визуальный редактор свойств реквизита Список, либо программно в обработчике ПриСозданииНаСервере.

Проанализируем программный способ изменения запроса в расширении:


&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    ТекстЗапроса = Список.ТекстЗапроса;
    // Добавляем условие в конец блока ГДЕ, если оно там уместно
    Если Найти(ТекстЗапроса, "ГДЕ") > 0 Тогда
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ГДЕ", "ГДЕ (НЕ РеестрДокументов.Ссылка ССЫЛКА Документ.Сторно) И ");
    КонецЕсли;
    Список.ТекстЗапроса = ТекстЗапроса;
    
КонецПроцедуры

Дополнительные методы проверки и отладки

Если исключение документов сторно не помогло, выясним причину более глубоко. Возможно, дело в некорректных данных внутри самого регистра Реестр документов.

Шаг 1: Очистка и перезаполнение реестра.
Иногда в регистре накапливаются «битые» записи после нештатного завершения транзакций или программного удаления документов. Попробуем запустить регламентное задание по обновлению реестра документов или воспользоваться обработкой «Заполнение реестра документов», которая обычно входит в состав типовых инструментов администратора ERP.

Шаг 2: Проверка RLS (ограничение доступа на уровне записей).
Если ошибка проявляется не у всех пользователей, а только у определенных ролей, проанализируем шаблоны RLS. Часто дублирование возникает из-за того, что условия доступа в ГДЕ при соединении таблиц порождают декартово произведение строк. В этом случае необходимо оптимизировать права доступа или временно отключить RLS для проверки гипотезы.

Шаг 3: Анализ поля Ссылка1 через консоль запросов.
Чтобы точно понять, какой документ дублируется, выполним следующий порядок действий:

Резюме

Ошибка дублирования ключевых значений в списке ВзаимозачетЗадолженности — это следствие конфликта механизма Реестра документов с документами сторнирования или некорректной работы расширений. Использование условия И НЕ РеестрДокументов.Ссылка ССЫЛКА Документ.Сторно является проверенным «рецептом» для восстановления работоспособности интерфейса. При внедрении данного решения всегда отдавайте предпочтение расширениям конфигурации, чтобы сохранить возможность беспрепятственного обновления вашей системы 1С:ERP.

← На главную