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