Ошибка с текстом «Обнаружено дублирование ключевых значений в колонках: Ссылка» является одной из самых коварных в среде «1С:Предприятие 8.3», особенно в конфигурациях на базе «Управления торговлей 11». Она парализует работу пользователей при подборе товаров, открытии списков документов или справочников. В этой статье мы подробно разберем, почему возникает эта ситуация, как она связана с неудачным обновлением базы данных и какими методами можно восстановить работоспособность системы.
Для начала проанализируем, как работает динамический список в 1С. Когда вы открываете форму подбора товаров, система выполняет запрос к базе данных. Основной таблицей обычно выступает справочник Номенклатура. Однако для удобства пользователя в список выводятся остатки, текущие цены, штрихкоды и характеристики. Эти данные подтягиваются из различных регистров сведений и накопления с помощью механизма ЛЕВОЕ СОЕДИНЕНИЕ (Left Join).
Критически важным условием работы динамического списка является уникальность ключевого поля. В 99% случаев ключевым полем выступает Ссылка. Если в результате выполнения запроса база данных возвращает две или более строки с одинаковым значением Ссылка, платформа выдает ошибку дублирования. Это происходит тогда, когда соединение с регистром дает «размножение» записей. Например, если в регистре цен на одну и ту же дату для одной номенклатуры по ошибке записались две разные цены, запрос выдаст две строки для одной и той же позиции товара.
Рассмотрим ситуацию, описанную пользователем: обновление прервалось из-за нехватки места на диске. Это критический момент для SQL-базы. В процессе обновления конфигурация меняет структуру таблиц, пересчитывает итоги и реструктурирует индексы. Если транзакция прерывается некорректно, могут возникнуть следующие аномалии:
Первым делом проанализируем влияние расширений. Современные конфигурации (УТ 11, ERP, КА) активно используют расширения для кастомизации. Если в расширении была изменена форма подбора или запрос динамического списка, это может стать источником проблем после сбоя основной конфигурации.
Выполним следующие действия для диагностики:
Если ошибка исчезла, значит, проблема в коде расширения. Скорее всего, запрос в расширении обращается к полям или таблицам, которые изменили свой тип или структуру в новом релизе, что привело к некорректному соединению таблиц.
Разберем ситуацию, когда ошибка «Имеются записи с одинаковыми измерениями» мешает обновлению или работе. Это явный признак того, что в базе появились дубли. Чаще всего страдают регистры: ЦеныНоменклатуры, ШтрихкодыНоменклатуры, СтатусыНоменклатуры.
Для поиска проблемного места нам потребуется консоль запросов. Рассмотрим пример запроса, который поможет найти дубли в регистре цен (одна из частых причин ошибки в подборе):
ВЫБРАТЬ
Цены.Номенклатура,
Цены.ВидЦены,
Цены.Период,
КОЛИЧЕСТВО(*) КАК КоличествоДублей
ИЗ
РегистрСведений.ЦеныНоменклатуры КАК Цены
СГРУППИРОВАТЬ ПО
Цены.Номенклатура,
Цены.ВидЦены,
Цены.Период
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
Если запрос вернул строки, значит, в базе есть физические дубли. Стандартное «Тестирование и исправление» (ТиИ) с галочкой «Очистка записей» не всегда справляется с этой задачей, если повреждены индексы на уровне SQL. В таком случае нам поможет программное удаление лишних записей. Посмотрим на пример кода для очистки регистра:
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
// Устанавливаем фильтры по измерениям, найденным в запросе
НаборЗаписей.Отбор.Номенклатура.Установить(ПроблемнаяСсылка);
НаборЗаписей.Отбор.ВидЦены.Установить(НужныйВидЦены);
НаборЗаписей.Отбор.Период.Установить(НужнаяДата);
// Читаем, очищаем и записываем пустой или скорректированный набор
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 1 Тогда
Пока НаборЗаписей.Количество() > 1 Цикл
НаборЗаписей.Удалить(0);
КонецЦикла;
НаборЗаписей.Записать();
КонецЕсли;
Поскольку проблема возникла из-за нехватки места на диске и прерывания операции SQL, проанализируем состояние базы данных на уровне сервера. Обычные средства 1С могут не видеть повреждений страниц данных или индексов.
Рекомендуется выполнить следующие операции в SQL Server Management Studio (SSMS):
DBCC CHECKDB ('Имя_Вашей_Базы'). Она покажет, есть ли ошибки размещения или структурные повреждения.ALTER INDEX ALL ON [Таблица] REBUILD поможет восстановить корректную структуру.DBCC FREEPROCCACHE поможет сбросить кэш планов.Иногда ошибка дублирования ссылок — это «фантом», вызванный кэшированием настроек компоновки данных. Если пользователь ранее настроил группировку или сложный фильтр в форме подбора, эти настройки могли сохраниться в его профиле и конфликтовать с новой структурой базы.
Выполним следующие действия:
1C:Enterprise 8.3 Server Agent, перейдем в каталог srvinfo и удалим папку snccntx.Если вышеописанные методы не помогли, нам придется «залезть под капот» формы подбора. Рассмотрим алгоритм действий:
ФормаВыбора или специализированная форма в обработке подбора).&Дата, &Склад) на конкретные значения и выполним запрос.ЛЕВОЕ СОЕДИНЕНИЕ дает дублирование.Часто причиной становится соединение с регистром ШтрихкодыНоменклатуры. Если у товара по какой-то причине оказалось два одинаковых штрихкода в регистре, то в подборе этот товар продублируется столько раз, сколько у него штрихкодов. В таком случае в запросе динамического списка следует использовать ВЫБРАТЬ РАЗЛИЧНЫЕ или сгруппировать данные по ссылке номенклатуры перед выводом.
Ошибка «Обнаружено дублирование ключевых значений в колонках: Ссылка» — это всегда сигнал о том, что данные в регистрах «размножились» и нарушают логику динамического списка. После неудачного обновления из-за нехватки места на диске первым делом проверьте целостность базы через DBCC CHECKDB, затем ищите дубли в регистрах сведений с помощью запросов и не забудьте проверить влияние расширений. Системный подход и последовательная проверка от простого (кэш, настройки) к сложному (SQL-запросы, структура регистров) позволят вам оперативно вернуть систему в строй.