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