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