Алгоритм нахождения причины ошибки "Обнаружено дублирование ключевых значений в колонках:..." в динамическом списке

19.01.22

Задачи пользователя - Корректировка данных

Доброго времени суток, коллеги. Недавно наткнулся на ошибку "Обнаружено дублирование ключевых значений в колонках: ...". Сразу не понял, как её решать. Когда гуглил, видел только частные решения. Хочу показать один из возможных способов решения проблемы. Мне он помог.

Исходная ситуация. Открываю список заказов. Вижу ошибку. Либо сразу, либо после пролистывания списка. 



Для решения, нам нужно:

  • Понять, какой запрос выполняется, для вывода данных в динамический список.
  • Найти поле, которое дублируется при выполнении запроса.
  • Найти таблицу из за которой происходит дубль. 
  • Поправить данные.  

Нужно запустить конфигурацию в режиме отладки. Далее необходимо найти форму, в которой возникает проблема.

Для этого можно использовать несколько способов. 

Можно нажать правой кнопкой мыши на заголовок формы - нажать открыть в конфигураторе - сразу откроется необходимая форма (у вас может не быть такой кнопки). 

Если её нет, можно открыть ссылку и посмотреть название объекта, с которым мы работаем и вручную найти его в конфигураторе, далее найти необходимую форму - можно по слову "список". Может быть несколько подходящих. В таком случае можно поставить точку останова на каждой.  



Далее нужно поставить точку останова в конец процедуры "ПриСозданииНаСервере". Так как текст запроса в динамическом списке может меняться программно. Мы ожидаем, что в дальнейшем текст запроса не будет меняться. 



Мы нашли текст запроса, который выполняется при заходе в динамический список. 

Теперь нам нужно открыть этот запрос в консоли запросов, вставить туда запрос, повторить параметры, аналогично параметрам динамического списка. Оставляем только ключевые поля. Корректируем запрос так, чтобы получить для каждого набора ключевых полей их количество. Нам нужно найти неуникальное значение/значения. У меня получился вот такой запрос и результат к нему. 


То есть дублируется заказ покупателя "Демо: Заказ покупателя 000000001 от 20.08.2009 16:01:15". 

Теперь нужно понять проблему дублирования. Возможно это левое соединение с каким-нибудь регистром. 

Для того, чтобы понять, какая таблица может являться проблемной, можно убирать левые соединения и выполнять запрос до тех пор, пока мы не увидим, что набор ключевых полей выводится в единственном экземпляре. Для удобства я сделаю условие на вывод только проблемного заказа. 



Выяснилось, что при удалении соединения с регистром сведений "аи_СломатьДинамическийСписок" данные перестали дублироваться. Видимо дело в нем. Заходим в регистр, видим, что правда есть 2 записи по нашему заказу. 


 

После удаления одной из записей - список заказов открывается. 



Пример, который я показал, я создал на конфигурации "Демонстрационная конфигурация "Библиотека стандартных подсистем", редакция 3.1 (3.1.5.180)". На платформе "1С:Предприятие 8.3 (8.3.20.1674)".

Динамический Список Ошибка Обнаружено Дублирование Ключевых Значений Колонках Ссылка

См. также

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтер Пользователь Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    29555    87    151    

63

Корректировка данных Системный администратор Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Незаменимая обработка для сопровождения конфигураций: ERP, УТ, КА. Позволяет вычистить многие ошибки в ключах аналитики, в ключевых справочниках конфигурации.

3600 руб.

10.02.2017    108396    645    173    

686

Корректировка данных Зарплата Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры бюджетного учреждения 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ Платные (руб)

Обработка исправляет технические ошибки по НДФЛ, взаиморасчетам с сотрудниками в 1С:ЗУП (1С:ЗКГУ) на начало года. Фактически все ошибки, которые проявляются в ведомостях на выплату, расчетных листках, при заполнении ведомостей на выплату и отчетах 6-НДФЛ и т.д. нужно начинать исправлять с начала расчетного года. Это позволит быть уверенными, что после завершения расчетов предыдущего года, начали работать с «чистого листа» без ошибочных остатков.

4800 руб.

06.10.2023    3306    33    17    

40

Корректировка данных Зарплата Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Внешняя обработка предназначена для исправления самых различных ошибок, возникших по самым разным причинам. Общее проявление этих ошибок видно в различии данных между: проводками и различными отчетами по НДФЛ, заполнении ведомостей на выдачу зарплаты, неверным расчетом НДФЛ при начислении ЗП и т.д.

3600 руб.

09.02.2024    1165    6    5    

9

Закрытие периода Корректировка данных Бухгалтер Пользователь Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Закрытие месяца - важный процесс в современных конфигурациях, таких как УТ 11.4, УТ 11.5, КА 2.4, КА 2.5 ERP 2.4,ERP 2.5, КА 2 Казахстан, УТ 3 Казахстан регламентные операции влияют на расчет себестоимости, и ошибки в данном расчете не дают картины деятельности организации.

2400 руб.

27.10.2021    23231    304    35    

76
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. retr0 19.01.22 09:17 Сейчас в теме
Ну че то такое себе, думал что-то интересное увидеть а тут типовые шаги описаны. В частности можно было пропустить ту часть где описывается про то, как получить текст запроса.
user712426; +1 1 Ответить
2. Andrei_Ivanov 167 19.01.22 10:13 Сейчас в теме
(1) Доброго времени суток. Спасибо за комментарий.
Я типовых шагов по решению такой проблемы не видел, когда искал.
Я думаю, что часть с получением текста запроса важная, так как можно получить его, допустим, взяв из динамического списка на форме, и не учесть того, что он при создании на сервере меняется.
user1741387; user1706724; Darkoder; zurapa; user811769; lvictor58; mrChOP93; +7 Ответить
3. retr0 19.01.22 10:40 Сейчас в теме
(2) Было бы весьма странно не учитывать вариант модификации текста запроса в дин списке. Проблема тривиальная и статьи на эту тему не требуются, очевидно, что дубли появились по причине соединения с какой-то из таблиц 99% еще ни разу не видел, что бывают дубли с таблицей без соединений. Может быть, будет полезно кому-то.
4. mrChOP93 97 20.01.22 06:21 Сейчас в теме
(3) вы не учитываете, что на сайте есть и совсем новички, такая статья им будет очень полезна.
user1706724; Feelthis; user610423_domestic; Darkoder; Anatolia; zurapa; AlbinaAAA; user811769; +8 Ответить
5. пользователь 20.01.22 07:04
Сообщение было скрыто модератором.
...
6. user811769 13 22.02.22 14:52 Сейчас в теме
(5) когда-то и вы не обладали этим сакральным знанием, уважаемый retr0) Андрей, спасибо!
dvsidelnikov; user1706724; zurapa; +3 Ответить
7. пользователь 22.02.22 14:58
Сообщение было скрыто модератором.
...
8. пользователь 17.06.22 13:07
Сообщение было скрыто модератором.
...
9. пользователь 24.06.22 16:18
Сообщение было скрыто модератором.
...
20. пользователь 14.03.24 10:46
Сообщение было скрыто модератором.
...
10. zurapa 04.01.23 11:32 Сейчас в теме
Весьма хорошая статья для новичков, весьма хорошо оформлена.
user1706724; gucci76; user610423_domestic; dimaster; Darkoder; user1492823; Andrei_Ivanov; +7 Ответить
11. untru 13 17.02.23 00:43 Сейчас в теме
Вот вам еще один живой кейс, динамический список из регистра и двух левых к нему соединений тоже РС, падает ошибка, берем запрос все идеально, при открытии падает и ругается на колонки,
Как оказалось основной таблицей был РС который левым цеплялся, поменял ее и ошибка ушла
12. NicholasUzunov 03.05.23 13:34 Сейчас в теме
Спасибо, помогло. Я делал точно так же, но затупил и использовал "КОЛИЧЕСТВО(РАЗЛИЧНЫЕ <Таблица.Ссылка>))", что приводило меня к неправильному результату.
Еще имеет смысл написать "ИМЕЮЩИЕ СУММА(1) > 1", для сокращения просматриваемого списка.
N_s_s; Darkoder; Andrei_Ivanov; +3 Ответить
13. evgenjola 68 27.07.23 09:32 Сейчас в теме
Спасибо! Вроде бы ничего сложного, но когда впервые видишь такую ошибку быстро помогает понять как с ней бороться.
Darkoder; user1492823; Andrei_Ivanov; +3 Ответить
14. Darkoder 11.10.23 12:54 Сейчас в теме
Большое спасибо!!! Статья спасла! Тоже как и 12 добил условие. Вопрос быстро решился. Спасибо что подробно описали!
15. Andrei_Ivanov 167 11.10.23 13:21 Сейчас в теме
(14) Спасибо за отзыв! Видимо, надо будет в статью внести условие из 12)
16. Profenix 17 24.10.23 14:38 Сейчас в теме
Спасибо автор все по полочкам разложил.
17. AgentNiCho 07.12.23 11:52 Сейчас в теме
А что делать если мне нужно, чтоб показывались эти строки. Соединяю основную таблицу Номенклатура (с прочими полями) и регистр ОстаткиПоЯчейкам. Аналогичная ошибка возникает когда одна и та же номенклатура в нескольких ячейках находится.

В таком случае менять ПоляКлюча и ВидКлюча? Или также реквизит динамического списка "ОсновнаяТаблица" поменять?
18. Andrei_Ivanov 167 08.12.23 10:40 Сейчас в теме
(17) Если идея - вывести для каждой номенклатуры в списке ячейку и остаток по ней.
Я бы попробовал оставить Вид ключа = Авто + Поля ключа = "номенклатура, ячейка" и посмотреть, как будет себя список вести. Может как то null в ячейке будет реагировать и надо ставить доп. условия.
Реквизит "Основная таблица" должен был очищен для использования вышеуказанных полей.
AgentNiCho; +1 Ответить
19. AgentNiCho 08.12.23 14:24 Сейчас в теме
(17) (18) Получилось решить следующим способом:

ПоляКлюча - фиксированный массив с двумя ключевыми полями "Номенклатура,Ячейка"
СписокНоменклатуры.ПоляКлюча = ПоляКлюча;
СписокНоменклатуры.ВидКлюча = ВидКлючаДинамическогоСписка.КлючСтроки;

// Обнуляем основную таблицу, иначе ПоляКлюча не отработают
СписокНоменклатуры.ОсновнаяТаблица = "";

В итоге получилось выводить вариант размещения одной и той же номенклатуры в разных ячейках

Обязательно нужно, чтоб поле Ячейка не было ни null, не Неопределено. Для этого нужно учесть это при изменении текста запроса
Andrei_Ivanov; +1 Ответить
21. rabotana 02.04.24 03:13 Сейчас в теме
А как вам такой вариант. Эта ошибка. Всё делаем по инструкции, но в колонке КоличествоНеуникальныхНаборов все однерки. Конфига под замком, расширений нет.
24. Andrei_Ivanov 167 03.04.24 09:59 Сейчас в теме
26. rabotana 12.04.24 11:54 Сейчас в теме
(24) да вот непонятно. яж под одним пользователем и ошибку получаю и запрос в консоли запускаю. а результат разный в консоли всё отлично. ошибку в данных то нашел, а про запрос так и не понял..
22. nigavis 02.04.24 09:37 Сейчас в теме
Спасибо большое за статью!!!
Вы помогли очень сильно!
23. SatanClaws 146 03.04.24 07:43 Сейчас в теме
Столкнулся с этой проблемой немного в другом ключе:

CRM от Раруса, справочник КонтактныеЛицаПартнеров

Через "Изменить форму" добавлены колонки Ссылка.Телефон, Ссылка.E-mail
на некоторых контактах список валится с пресловутой ошибкой "Обнаружено дублирование ключевых значений в колонках Ссылка".

Почему валиться, в принципе, понятно: телефон и мыло - суть записи табличной части спр.КонтактныеЛица, т.е. на джойне мы легко получаем дублирование строк

НО!
1) валится не на всех - у некоторых вполне исправно в колонке телефоны перечислены через запятую. Скорее даже на исключительных
1а) аналитически понять критерии когда список ломается - не осилил
2) я так и не смог через отладчик добраться до модифицированного текста запроса. Доступа к профайлеру не было, так что достоверно узнать что за запрос уходит на скуль - облом.

Пользователям объяснил, что лучше этими колонками в форме списка вообще не пользоваться, но если уж пользуетесь, то когда ломается - выключайте её.


PS если кто подскажет, как отладчиком вытащить модифицированный текст запроса динамического списка - буду признателен.
25. Andrei_Ivanov 167 03.04.24 10:42 Сейчас в теме
1. Плохо понимаю, что выводится. Данные из ТЧ или реквизиты справочника? Говорите, про Ссылка.Телефон, вроде бы реквизит, но потом речь уже идет про ТЧ. Также не понимаю, как через изменить форму можно вытащить реквизиты ТЧ. Ощущение, что нельзя.
1а. Мб когда больше 1 строки в тч, если с тч соединяетесь, но это я очень поверхностно.
2. Можно встать в отладку в серверную процедуру на форме - вычислить выражение = %НазваниеЭлемента%.ТекстЗапроса
Я посмотрел, у меня не меняется текст запроса от выводимых дополнительно полей - не знаю, в какой момент платформа добирает данные.
Может быть проблема в самом тексте запроса изначально, а не в настройках пользователей?
27. bands 30.05.24 22:48 Сейчас в теме
Добрый день, по этому алгоритму моя проблема не решается )) У меня при установке отбора всё слетает. При этом если убрать отбор и пролистать весь список, то ошибки не будет. Более того, если сделать отбор через ALT+F по этому же полю, то ошибки тоже не будет.

Выполняю запрос в консоли с теми же параметрами, всё чисто. Может тут кто подскажет, чтобы новую тему не содавать?
28. bands 30.05.24 22:56 Сейчас в теме
(27) В компоновщике в скд можно увидеть итоговый исполняемый запрос, а вот как в форме списка отловить этот запрос?
29. bands 30.05.24 23:18 Сейчас в теме
Нашёл, кому интересно
&НаСервере
Процедура Команда1НаСервере()
       
        //Список - это динамический список на форме списка справочника
        Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
        Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
       
        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        Макет = КомпоновщикМакета.Выполнить(Схема,Настройки);
       
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
        //посмотреть запрос динамического списка
        Команда1НаСервере();
КонецПроцедуры
Показать
30. interlamersha 11.06.24 12:19 Сейчас в теме
Есть еще одна важная фишка с этой ошибкой. Когда пишешь запрос для динамического списка, например для справочника выводишь признак наличие присоединенных файлов БСПшного функционала, в качестве основной таблицы стоит справочник, сохраняешь, всё ок. Запускаешь, он шурует эту ошибку, при этом дублей нет. Прикол в том, что при первом сохранении запроса, платформа сама подменяет значение основной таблицы на РегистрСведений.НаличиеФайла. Т.е. в таком случае просто нужно повторно заходить в настройку списка произвольного запроса и еще раз перевыбирать основную таблицу. Такой глюк у меня воспроизводится на платформе 8.3.24.1342
Оставьте свое сообщение