В крупных прикладных решениях на платформе 1С:Предприятие 8.3, таких как 1С:ERP Управление предприятием, Комплексная автоматизация или Управление торговлей 11, разработчики и пользователи часто сталкиваются с системной ошибкой при прокрутке списков документов. Ошибка сопровождается сообщением о дублировании ключевых значений и упоминанием технического поля Ссылка1. Рассмотрим подробно причины возникновения этой ситуации и разберем по шагам методы её решения.
Для начала выясним причину, по которой типовая конфигурация начинает вести себя некорректно. В современных версиях ERP списки документов строятся не на прямых запросах к таблицам документов, а через специальный механизм — Реестр документов. Это вспомогательный регистр сведений, который консолидирует данные о различных типах документов для ускорения работы интерфейса.
Поле Ссылка1, фигурирующее в тексте ошибки, является внутренним псевдонимом платформы. Оно появляется в тот момент, когда динамический список выполняет соединение таблицы реестра с другими таблицами (например, таблицами прав доступа RLS или дополнительными реквизитами). Если в результате такого соединения одна и та же ссылка на документ попадает в итоговую выборку дважды, механизм динамического списка не может определить, какую строку отображать, и генерирует исключение «Дублирование ключевых значений».
Проанализируем ситуацию: чаще всего это происходит при наличии документов типа Сторно. Когда в системе создается документ исправления (сторнирования), механизмы формирования реестра могут ошибочно создавать дублирующие записи или некорректно связывать сторнируемый и сторнирующий документы в рамках одного запроса.
Самым эффективным и быстрым способом устранения данной ошибки является корректировка текста запроса в динамическом списке формы. Нам необходимо явно указать системе, что документы сторно не должны попадать в общую выборку реестра в данном конкретном списке, если они вызывают конфликт.
Рассмотрим алгоритм внесения изменений:
ВзаимозачетЗадолженности.ФормаСписка.Список (тип ДинамическийСписок).РегистрСведений.РеестрДокументов, добавим условие фильтрации.Пример кода условия, которое необходимо добавить в секцию ГДЕ:
ГДЕ
...
И НЕ РеестрДокументов.Ссылка ССЫЛКА Документ.Сторно
Это условие исключает документы типа Сторно из обработки механизмом реестра для данного списка, что устраняет дублирование ссылок и позволяет платформе корректно индексировать строки при прокрутке (скроллинге).
Поскольку 1С:ERP является часто обновляемой конфигурацией, крайне не рекомендуется вносить изменения напрямую в основную ветку. Разберем, как сделать это правильно с помощью механизма расширений:
ВзаимозачетЗадолженности.Список, либо программно в обработчике ПриСозданииНаСервере.Проанализируем программный способ изменения запроса в расширении:
&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
ТекстЗапроса = Список.ТекстЗапроса;
// Добавляем условие в конец блока ГДЕ, если оно там уместно
Если Найти(ТекстЗапроса, "ГДЕ") > 0 Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ГДЕ", "ГДЕ (НЕ РеестрДокументов.Ссылка ССЫЛКА Документ.Сторно) И ");
КонецЕсли;
Список.ТекстЗапроса = ТекстЗапроса;
КонецПроцедуры
Если исключение документов сторно не помогло, выясним причину более глубоко. Возможно, дело в некорректных данных внутри самого регистра Реестр документов.
Шаг 1: Очистка и перезаполнение реестра.
Иногда в регистре накапливаются «битые» записи после нештатного завершения транзакций или программного удаления документов. Попробуем запустить регламентное задание по обновлению реестра документов или воспользоваться обработкой «Заполнение реестра документов», которая обычно входит в состав типовых инструментов администратора ERP.
Шаг 2: Проверка RLS (ограничение доступа на уровне записей).
Если ошибка проявляется не у всех пользователей, а только у определенных ролей, проанализируем шаблоны RLS. Часто дублирование возникает из-за того, что условия доступа в ГДЕ при соединении таблиц порождают декартово произведение строк. В этом случае необходимо оптимизировать права доступа или временно отключить RLS для проверки гипотезы.
Шаг 3: Анализ поля Ссылка1 через консоль запросов.
Чтобы точно понять, какой документ дублируется, выполним следующий порядок действий:
Ошибка дублирования ключевых значений в списке ВзаимозачетЗадолженности — это следствие конфликта механизма Реестра документов с документами сторнирования или некорректной работы расширений. Использование условия И НЕ РеестрДокументов.Ссылка ССЫЛКА Документ.Сторно является проверенным «рецептом» для восстановления работоспособности интерфейса. При внедрении данного решения всегда отдавайте предпочтение расширениям конфигурации, чтобы сохранить возможность беспрепятственного обновления вашей системы 1С:ERP.