Как удалить пустые строки номенклатуры в 1С, если они не помечаются на удаление?

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

При массовой загрузке данных из внешних источников (Excel, CSV) часто возникает ситуация, когда в справочнике Номенклатура создаются абсолютно пустые записи. Попытка удалить такие элементы стандартными средствами через правую кнопку мыши «Пометить на удаление» приводит к ошибке: «Поле "Рабочее наименование" не заполнено». Система блокирует запись объекта, так как он не соответствует правилам валидации, прописанным в конфигурации. В этой статье мы подробно разберем, как обойти эти ограничения и очистить базу от «мусорных» записей.

Почему возникает эта проблема?

Проанализируем ситуацию: в типовых конфигурациях 1С, таких как Управление торговлей 11 или ERP, в модулях справочника Номенклатура прописаны жесткие проверки. При любой попытке изменения объекта (включая установку пометки удаления) срабатывает событие ПередЗаписью. Если обязательные поля (Наименование, Артикул, Вид номенклатуры, Ставка НДС) не заполнены, метод Записать() возвращает отказ. В итоге мы получаем «замкнутый круг»: чтобы удалить объект, его нужно записать, а чтобы записать — нужно заполнить все данные, которых у нас нет.

Метод 1: Групповое изменение реквизитов в режиме загрузки

Это самый простой и эффективный способ, не требующий написания кода. Рассмотрим его по шагам:

  1. Перейдем в раздел Администрирование — Обслуживание — Корректировка данных — Групповое изменение реквизитов.
  2. В поле «Изменять» выберем Номенклатура.
  3. Настроим отбор, чтобы не зацепить рабочие товары. Обычно пустые позиции не имеют наименования, поэтому добавим условие: Наименование не заполнено.
  4. В списке реквизитов найдем поле Пометка удаления и установим значение Да.
  5. Важный нюанс: нажмем кнопку Дополнительные параметры (внизу формы). В появившемся окне обязательно установим флажок «Режим загрузки данных (ОбменДанными.Загрузка = Истина)».
  6. Нажмем «Изменить реквизиты».

Разберем, что дает флаг ОбменДанными.Загрузка = Истина. Когда этот параметр установлен, платформа игнорирует прикладные проверки в модулях объекта. Это позволяет системе принудительно проставить пометку удаления, «не глядя» на пустые обязательные поля. После этого вы сможете окончательно удалить записи через стандартную обработку «Удаление помеченных объектов».

Метод 2: Программное заполнение и пометка на удаление

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


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

В данном примере мы используем метод УстановитьПометкуУдаления(Истина). Обратите внимание на использование блока Попытка...Исключение — это хорошая практика, которая позволит обработке не прерываться, если одна из записей окажется заблокирована или возникнет непредвиденная ошибка СУБД.

Метод 3: Непосредственное удаление (Hard Delete)

Если вы уверены, что на эти пустые позиции нет ссылок в документах (чеках, поступлениях, заказах), их можно удалить физически из базы данных, минуя корзину. Выясним, как это сделать программно:


Объект = СсылкаНаОбъект.ПолучитьОбъект();
Объект.ОбменДанными.Загрузка = Истина;
Объект.Удалить();

Метод Удалить() полностью стирает запись из таблицы. Внимание: используйте этот метод с осторожностью. Если на объект есть ссылки, в документах появится надпись <Объект не найден>, что нарушит ссылочную целостность базы данных. Перед выполнением такого удаления рекомендуется сделать резервную копию.

Метод 4: Использование шаблонов наименований

Для пользователей, которые не хотят использовать программирование или сложные обработки, существует «хитрый» способ через функционал самой программы (актуально для УТ 11). Проанализируем этот алгоритм:

  1. Зайдем в справочник Номенклатура.
  2. Выберем группу или список пустых позиций.
  3. Воспользуемся командой Изменить — Шаблоны наименований.
  4. Настроим шаблон для Рабочего наименования, указав там любой статичный символ, например «1».
  5. Снимем галочку «Запретить редактирование рабочего наименования».
  6. Применим изменения. Система массово заполнит пустые поля единицей.
  7. Теперь, когда поля заполнены, стандартная пометка на удаление сработает без ошибок.

Профилактика появления пустых строк

Выясним причину появления таких записей. Чаще всего это происходит при использовании обработки «Загрузка данных из табличного документа». Если в файле Excel после последней значимой строки есть пустые ячейки, которые 1С распознает как заполненные (например, из-за наличия там пробелов или форматирования), обработка создаст новые элементы справочника.

Чтобы избежать этого в будущем:

Таким образом, мы рассмотрели несколько способов решения проблемы. Самым быстрым и безопасным для администратора является использование Группового изменения реквизитов с флагом ОбменДанными.Загрузка = Истина. Это штатный механизм платформы, специально созданный для исправления подобных технических ошибок.

← На главную