Как программно удалить штрихкоды помеченной на удаление номенклатуры в 1С:Управление торговлей 10.3?

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

При проведении свертки информационной базы или очистке каталога номенклатуры пользователи и разработчики часто сталкиваются с ситуацией, когда стандартная обработка «Удаление помеченных объектов» отказывается удалять элементы справочника Номенклатура. Одной из наиболее распространенных причин являются записи в регистре сведений Штрихкоды, ссылающиеся на удаляемые позиции.

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

Анализ ошибок при изменении отбора и удалении записей

Проанализируем типичные ошибки, с которыми сталкиваются разработчики при написании обработки для удаления штрихкодов.

1. Ошибка «Поле объекта недоступно для записи (Владелец)».

В платформе 1С элемент отбора набора записей является объектом типа ЭлементОтбора. Присвоить ему значение напрямую через знак равенства (например, НаборЗаписей.Отбор.Владелец = Выборка.Ссылка) нельзя. Для установки значения отбора необходимо использовать специальный метод Установить():

НаборЗаписей.Отбор.Владелец.Установить(Выборка.Ссылка);

2. Ошибка «Недостаточно фактических параметров» при вызове метода Удалить().

Метод Удалить() у объекта РегистрСведенийНаборЗаписей предназначен для удаления конкретной строки из текущего набора в памяти и требует передачи индекса или самой записи в качестве параметра (например, НаборЗаписей.Удалить(0)). Он не предназначен для очистки базы данных по отбору.

3. Лишнее чтение и очистка набора записей.

Иногда разработчики вызывают методы Прочитать() или Очистить() перед записью. В этом нет необходимости. Если создать объект НаборЗаписей, установить отбор по владельцу и сразу вызвать метод Записать(Истина), платформа перезапишет набор записей в базе данных пустой коллекцией. В результате все записи, соответствующие данному отбору, будут физически удалены.

Оптимальное решение для удаления штрихкодов

Разберем по шагам правильный алгоритм удаления штрихкодов для номенклатуры, помеченной на удаление.

  1. Сформируем запрос к справочнику Номенклатура для получения всех ссылок с установленной пометкой удаления.
  2. Создадим набор записей регистра сведений Штрихкоды.
  3. В цикле по выборке установим отбор по измерению или реквизиту Владелец.
  4. Выполним метод Записать(Истина) для каждого элемента, чтобы очистить записи штрихкодов в базе данных.

Посмотрим на итоговый пример кода обработки:


Процедура КнопкаВыполнитьНажатие(Кнопка)

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Номенклатура.Ссылка КАК Ссылка
        |ИЗ
        |   Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |   Номенклатура.ПометкаУдаления = Истина";
    
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    
    НаборЗаписей = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
    
    Пока Выборка.Следующий() Цикл
        
        НаборЗаписей.Отбор.Владелец.Установить(Выборка.Ссылка);
        НаборЗаписей.Записать(Истина);
        
    КонецЦикла;

КонецПроцедуры

Особенности каскадной очистки подчиненных объектов

Выясним причину, по которой даже после удаления штрихкодов самой номенклатуры проверка удаления помеченных объектов все еще может указывать на связанные штрихкоды.

В конфигурации «Управление торговлей 10.3» штрихкоды могут быть привязаны не только к самому справочнику Номенклатура, но и к подчиненным объектам:

Если штрихкод был зарегистрирован на конкретную характеристику или единицу измерения, отбор по владельцу-номенклатуре такие записи не затронет. Для полного решения проблемы рекомендуется также очищать штрихкоды подчиненных справочников.

Кроме того, частой причиной блокировки удаления номенклатуры являются цикличные ссылки между товаром и его единицами измерения (реквизиты ЕдиницаХраненияОстатков, ЕдиницаДляОтчетов, ЕдиницаМест). Перед удалением единиц измерения следует программно очистить эти реквизиты в карточке номенклатуры через метод ПолучитьОбъект().

← На главную