Почему при подборе товара в 1С увеличивается количество первой строки вместо добавления новой

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

При работе в конфигурациях на обычных формах (например, 1С:Управление торговлей 10.3, Комплексная автоматизация 1.1, УПП 1.3) пользователи иногда сталкиваются со странным поведением формы подбора: при выборе второго товара новая строка в документе не появляется, а вместо этого увеличивается количество первого добавленного товара. Разберем по шагам, почему возникает эта ошибка, как провести быструю диагностику базы и как восстановить корректную работу документов.

Причина сбоя в механизме подбора

Рассмотрим внутреннюю механику обработки подбора номенклатуры. При переносе позиций в табличную часть документа программа определяет контекст строки по связке номенклатуры, характеристик, серий и единиц измерения. В процессе поиска цен и сопоставления строк алгоритм обращается к владельцу выбранной единицы — ЕдиницаИзмерения.Владелец.

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

  1. Мы добавляем в документ «Товар 1» в количестве 1 шт. Строка успешно создается.
  2. Затем мы выбираем через подбор «Товар 2». Программа считывает единицу измерения этого товара (или цену по этой единице), обращается к ее владельцу и получает ссылку на «Товар 1».
  3. Алгоритм подбора считает, что пользователь повторно выбрал ту же самую позицию («Товар 1»), и просто прибавляет количество к уже существующей первой строке.

Диагностика некорректных связей через Консоль запросов

Чтобы точно определить масштаб проблемы и найти поврежденные объекты, проанализируем базу с помощью консоли запросов. Проверим три ключевых места, где могут закрепиться «чужие» единицы измерения.

1. Проверка табличных частей документов поступления:


ВЫБРАТЬ
    Товары.Ссылка КАК Документ,
    Товары.Номенклатура КАК Номенклатура,
    Товары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    Товары.ЕдиницаИзмерения.Владелец КАК РеальныйВладелецЕдиницы
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК Товары
ГДЕ
    Товары.ЕдиницаИзмерения.Владелец <> Товары.Номенклатура

2. Проверка регистра сведений цен номенклатуры:


ВЫБРАТЬ
    Цены.Номенклатура КАК Номенклатура,
    Цены.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    Цены.ЕдиницаИзмерения.Владелец КАК ВладелецЕдиницы
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены
ГДЕ
    Цены.ЕдиницаИзмерения.Владелец <> Цены.Номенклатура

3. Проверка реквизитов карточек номенклатуры:


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Товар,
    Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаХранения,
    Номенклатура.ЕдиницаДляОтчетов КАК ЕдиницаОтчетов
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.ЭтоГруппа = ЛОЖЬ
    И (Номенклатура.ЕдиницаХраненияОстатков.Владелец <> Номенклатура.Ссылка
        ИЛИ Номенклатура.ЕдиницаДляОтчетов.Владелец <> Номенклатура.Ссылка)

Способы исправления проблемы

Разберем способы устранения ошибки в зависимости от того, в каких объектах обнаружены некорректные ссылки.

Способ 1. Ручное исправление документов (для единичных случаев)

  1. Открываем исходный документ поступления (ПоступлениеТоваровУслуг), в строках товаров дважды нажимаем на ячейку «Единица» и перевыбираем собственную единицу номенклатуры. Проводим документ.
  2. Открываем документ УстановкаЦенНоменклатуры, созданный на основании этого поступления. Перевыбираем единицы измерения в строках с проблемными товарами и перепроводим установку цен, чтобы очистить регистр ЦеныНоменклатуры от некорректных записей.
  3. Проверяем также связанные заказы или перемещения, если они уже были оформлены.

Способ 2. Программное исправление реквизитов номенклатуры с движениями

Если чужая единица была записана в реквизит ЕдиницаХраненияОстатков карточки товара, типовой интерфейс заблокирует ее изменение при наличии проведенных документов (сработает функция ЕстьДвиженияПоНоменклатуре). Чтобы безопасно перезаписать реквизит без отмены проведения сотен документов, используем программную запись с флагом ОбменДанными.Загрузка:


Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
    Если Выборка.ЭтоГруппа Тогда
        Продолжить;
    КонецЕсли;
    
    ОбъектНоменклатура = Выборка.ПолучитьОбъект();
    
    // Проверяем принадлежность единицы хранения остатков
    Если ЗначениеЗаполнено(ОбъектНоменклатура.ЕдиницаХраненияОстатков) 
        И ОбъектНоменклатура.ЕдиницаХраненияОстатков.Владелец <> ОбъектНоменклатура.Ссылка Тогда
        
        // Ищем родную единицу номенклатуры
        РоднаяЕдиница = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(
            ОбъектНоменклатура.ЕдиницаХраненияОстатков.Наименование, 
            Истина, 
            , 
            ОбъектНоменклатура.Ссылка
        );
        
        Если ЗначениеЗаполнено(РоднаяЕдиница) Тогда
            ОбъектНоменклатура.ЕдиницаХраненияОстатков = РоднаяЕдиница;
            ОбъектНоменклатура.ОбменДанными.Загрузка = Истина;
            ОбъектНоменклатура.Записать();
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Способ 3. Использование типовой обработки замены ссылок

Если в базе образовалось множество документов с чужими единицами, открываем внешнюю или встроенную обработку «Поиск и замена дублирующихся элементов» (или «Поиск и замена значений»). В качестве заменяемого значения указываем чужую единицу измерения, в качестве правильного — родную единицу номенклатуры. Обработка корректно обновит ссылки во всех табличных частях, регистрах накопления и регистре сведений Штрихкоды без необходимости ручной правки документов.

← На главную