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