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

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

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

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

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

Почему в запросе появляются дубли?

Запрос динамического списка подбора номенклатуры устроен достаточно сложно. Чтобы кассир видел актуальные цены, остатки и штрихкоды, основная таблица номенклатуры соединяется (как правило, левым соединением) со вспомогательными таблицами и регистрами сведений:

Если в одном из этих связанных регистров для конкретного товара созданы две или более записи, удовлетворяющие условиям отбора, левое соединение «размножит» строку номенклатуры. В результате на уровне СУБД мы получим несколько одинаковых ссылок на один и тот же товар, что и приведет к падению интерфейса 1С.

Особенность работы в распределенных базах (РИБ)

Часто системные администраторы замечают странный нюанс: в периферийных базах (в магазинах) поиск работает отлично, а в центральном офисе та же самая «гофра» вызывает падение РМК. Объясняется это спецификой миграции данных:

  1. В подчиненные узлы (магазины) выгружается только та информация, которая относится к конкретной торговой точке. Туда уходят строго определенные цены, остатки и соглашения. Левое соединение в узле находит только одну запись, и дублирования не возникает.
  2. В центральной базе сосредоточена вся нормативно-справочная информация (НСИ) со всех филиалов. Здесь по одной и той же позиции номенклатуры могут одновременно действовать разные виды цен, пересекающиеся соглашения или дублирующиеся записи штрихкодов. При поиске в центре запрос собирает все эти данные вместе, выдавая дубли.

Решение 1. Анализ и исправление настроек видов цен в РМК

Прежде чем прибегать к программированию и консоли запросов, рассмотрим наиболее частую организационную причину ошибки в РМК 1С:Управление торговлей. Очень часто дублирование возникает из-за привязки индивидуального вида цен или индивидуального соглашения к кассе ККМ или складу.

Выполним следующие действия для проверки этой гипотезы:

  1. Перейдем в настройки проблемной кассы ККМ (или склада, к которому она привязана).
  2. Проверим, не заполнены ли поля индивидуального соглашения или особого розничного вида цен, которые могут конфликтовать с общими правилами продаж.
  3. Попробуем временно очистить эти настройки или перевести кассу на использование общего розничного вида цен.
  4. Проверим, исчезла ли ошибка при поиске проблемного товара в РМК. Если ошибка пропала, необходимо детально проанализировать настройки цен и соглашений для этой торговой точки на предмет пересечения периодов действия или дублирования условий.

Решение 2. Локализация проблемных записей через консоль запросов

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

Шаг 1. Поиск конкретной номенклатуры. Выясним, по какому именно товару возникает ошибка. В нашем примере это «гофра». Нам нужно получить ее точную ссылку в справочнике Номенклатура.

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

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


ВЫБРАТЬ
    ИсходныйЗапрос.Ссылка КАК Товар,
    КОЛИЧЕСТВО(ИсходныйЗапрос.Ссылка) КАК КоличествоСтрок
ПОМЕСТИТЬ ВТ_АнализДублей
ИЗ
    (&ТекстЗапросаДинамическогоСписка) КАК ИсходныйЗапрос

СГРУППИРОВАТЬ ПО
    ИсходныйЗапрос.Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_АнализДублей.Товар,
    ВТ_АнализДублей.КоличествоСтрок
ИЗ
    ВТ_АнализДублей КАК ВТ_АнализДублей
ГДЕ
    ВТ_АнализДублей.КоличествоСтрок > 1

Этот запрос наглядно покажет все товары, которые выводятся в списке более одного раза, и точное количество их дублей.

Шаг 4. Детальный анализ связей. После того как мы определили проблемный товар (например, «гофра»), выполним исходный запрос динамического списка в консоли, установив жесткий отбор по этой позиции:


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка,
    Цены.Цена КАК Цена,
    Штрихкоды.Штрихкод КАК Штрихкод
ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК Цены
        ПО Номенклатура.Ссылка = Цены.Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды
        ПО Номенклатура.Ссылка = Штрихкоды.Владелец
ГДЕ
    Номенклатура.Ссылка = &ПроблемныйТовар

Внимательно изучим результат выполнения. Допустим, в результате мы получили две строки:

  1. Гофра | Цена: 100 руб. | Штрихкод: 4600000000012
  2. Гофра | Цена: 100 руб. | Штрихкод: 4600000000012 (дубль записи в регистре штрихкодов или цен с другими аналитиками)

Или, что бывает чаще, для товара зарегистрировано два штрихкода, либо в регистре цен на одну и ту же дату по разным характеристикам/соглашениям созданы две записи, которые при соединении без учета характеристик удваивают номенклатуру.

Шаг 5. Исправление данных НСИ. Как только «виновник» двоения найден (например, дублирующийся штрихкод или лишняя запись в регистре сведений Цены номенклатуры), перейдем в режим «1С:Предприятие» и исправим данные:

После очистки некорректных записей в регистрах и НСИ повторно запустим подбор в РМК и убедимся, что поиск по слову «гофра» отрабатывает мгновенно и без ошибок.

← На главную