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