Удаление номенклатуры в 1С:Предприятие 8.3 через интерфейс — рутинная задача, но когда речь идёт о массовой чистке справочника или автоматизации процесса, требуется программный подход. Неправильное удаление может привести к разрыву связей в документах, ошибкам при проведении и даже потере данных. Эта статья охватывает все актуальные способы программного удаления — от простых запросов до сложных обработок с контролем ссылочной целостности.
Мы разберём не только техническую сторону (с примерами кода на встроенном языке 1С), но и юридические нюансы: когда удаление запрещено законом (например, для номенклатуры, использованной в закрытых налоговых периодах), и как обойти эти ограничения легально. Особое внимание уделено методу "пометки на удаление" как наиболее безопасной альтернативе физическому стиранию.
1. Подготовка к удалению: проверка ссылочной целостности
Прежде чем удалять номенклатуру программно, необходимо убедиться, что она не используется в других объектах базы. В 1С для этого есть встроенный механизм проверки ссылок, но он работает не всегда корректно при массовых операциях. Рекомендуется дополнительно выполнять ручной аудит через запросы.
Основные объекты, где может "зависнуть" номенклатура:
- 📄 Документы: реализации, поступления, инвентаризации, заказы клиентов/поставщиков.
- 📊 Регистры: остатки товаров, цены, себестоимость.
- 🔗 Справочники: комплекты номенклатуры, характеристики, серии.
- 📈 Отчёты: если номенклатура используется в сохранённых настройках отчётов.
Для проверки ссылок вручную используйте следующий запрос (работает в 1С 8.3.20+):
ВЫБРАТЬ
Ссылка КАК Объект,
ВИД(Ссылка) КАК ТипОбъекта
ИЗ
РегистрСведений.СсылкиОбъектов КАК СсылкиОбъектов
ГДЕ
СсылкиОбъектов.Ссылка = &Номенклатура
⚠️ Внимание: Если номенклатура используется в закрытых налоговых периодах (даже в архивных документах), её физическое удаление может нарушить требования ФНС по хранению данных. В таких случаях применяйте пометку на удаление или архивирование.
2. Метод 1: Пометка на удаление (рекомендуемый способ)
Самый безопасный способ — пометка на удаление. Он не разрушает ссылочную целостность, но скрывает номенклатуру из основных списков. Восстановить её можно в любой момент. Этот метод подходит для:
- 🔄 Устаревшей номенклатуры, которая больше не используется, но может понадобиться для истории.
- 📅 Номенклатуры из закрытых периодов (legal-safe вариант).
- 🛠️ Тестирования: перед физическим удалением.
Пример кода для пометки одной позиции:
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Старый товар");
Если НЕ Номенклатура.Пустая() Тогда
Номенклатура.УстановитьПометкуУдаления(Истина);
Номенклатура.Записать();
КонецЕсли;
Для массовой пометки используйте обработку с циклом. Важно: после пометки выполните ПроведениеДокументов.ПерепровестиДокументы(), чтобы избежать ошибок в связанных документах.
Создать резервную копию базы|Проверить права пользователя (полный доступ к справочнику)|Отключить регламентные задания на время операции|Согласовать действие с бухгалтерией (если номенклатура в отчётности)-->
3. Метод 2: Физическое удаление через встроенный язык
Физическое удаление необратимо и должно применяться только для номенклатуры, которая гарантированно не используется в базе. Технически это реализуется через метод Удалить(), но перед его вызовом необходимо:
- Убедиться, что номенклатура не используется в документах (см. раздел 1).
- Получить исключительные права на объект (
Номенклатура.ПолучитьИсключительнуюБлокировку()). - Выполнить операцию в транзакции.
Пример безопасного удаления с контролем:
Процедура УдалитьНоменклатуру(ИмяНоменклатуры)
НачатьТранзакцию();
Попытка
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ИмяНоменклатуры);
Если Номенклатура.Пустая() Тогда
Предупреждение("Номенклатура не найдена!");
ОтменитьТранзакцию();
Возврат;
КонецЕсли;
// Проверка использования в документах
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ Документ.Ссылка КАК Документ
|ИЗ Документ.РеализацияТоваровУслуг КАК Документ
|ГДЕ Документ.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура.Ссылка);
Результат = Запрос.Выполнить();
Если Результат.Выбрать() Тогда
Предупреждение("Номенклатура используется в документах! Удаление невозможно.");
ОтменитьТранзакцию();
Возврат;
КонецЕсли;
Номенклатура.Удалить();
ЗафиксироватьТранзакцию();
Сообщить("Номенклатура успешно удалена!");
Исключение
ОтменитьТранзакцию();
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
⚠️ Внимание: В конфигурациях с включённым механизмом версионирования данных (например, 1С:ERP) физическое удаление может заблокировать объекты для других пользователей. Используйте РегламентныеЗадания.ВыполнитьИсключительно() для массовых операций.
4. Метод 3: Удаление через запрос (для опытных)
Для массового удаления можно использовать прямые SQL-запросы (в файловом варианте 1С) или Запрос на встроенном языке. Этот метод на порядок быстрее, но требует глубокого понимания структуры базы.
Пример запроса для удаления номенклатуры, не используемой в документах:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа
| И НЕ СУЩЕСТВУЕТ(
| ВЫБРАТЬ
| Документ.Ссылка
| ИЗ
| Документ.РеализацияТоваровУслуг КАК Документ
| ГДЕ
| Документ.Номенклатура = Номенклатура.Ссылка
| )";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Ссылка = Выборка.Ссылка.ПолучитьОбъект();
Ссылка.Удалить();
КонецЦикла;
Для ускорения процесса можно использовать пакетное удаление:
МассивСсылок = Новый Массив;
Пока Выборка.Следующий() Цикл
МассивСсылок.Добавить(Выборка.Ссылка);
КонецЦикла;
Объект.Номенклатура.УдалитьМассив(МассивСсылок);
| Метод удаления | Скорость | Безопасность | Когда использовать |
|---|---|---|---|
| Пометка на удаление | Средняя | ⭐⭐⭐⭐⭐ | Для номенклатуры в закрытых периодах или с неясными ссылками |
| Физическое удаление (встроенный язык) | Низкая | ⭐⭐⭐ | Для гарантированно неиспользуемой номенклатуры |
| Удаление через запрос | Высокая | ⭐⭐ | Для массовой чистки больших баз (требует тестирования) |
| Внешняя обработка | Зависит от реализации | ⭐⭐⭐⭐ | Для сложных сценариев с логикой контроля |
5. Метод 4: Использование внешних обработок
Если стандартные методы не подходят (например, нужно удалить номенклатуру с учётом характеристик или серий), разумно использовать внешние обработки. Они позволяют:
- 🔍 Гибко настраивать фильтры (по дате создания, группе, артикулу).
- 📋 Вести лог удалённых позиций.
- 🔄 Откатывать изменения при ошибках.
Пример структуры обработки:
// Основной модуль обработки
Перем мМассивУдалённых;
Процедура УдалитьОтобранное(Команда)
мМассивУдалённых = Новый Массив;
Для Каждого Строка Из СписокНоменклатуры Цикл
Попытка
Номенклатура = Строка.Ссылка.ПолучитьОбъект();
Если НЕ ИспользуетсяВДокументах(Номенклатура) Тогда
Номенклатура.Удалить();
мМассивУдалённых.Добавить(Номенклатура.Наименование);
КонецЕсли;
Исключение
Сообщить("Ошибка при удалении " + Строка.Наименование + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Сообщить("Успешно удалено: " + мМассивУдалённых.Количество() + " позиций");
КонецПроцедуры
Функция ИспользуетсяВДокументах(Номенклатура)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ Первые 1 Документ.Ссылка КАК Документ
|ИЗ Документ.РеализацияТоваровУслуг КАК Документ
|ГДЕ Документ.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура.Ссылка);
Возврат Запрос.Выполнить().Выбрать();
КонецФункции
Готовые обработки для удаления номенклатуры можно найти на портале Infostart или 1С-Галлерея. Популярные решения:
- 📌 "Массовое удаление номенклатуры" (автор: AlexOvechkin) — поддерживает фильтры по группам и датам.
- 📌 "Чистка справочников" (автор: KoderLine) — удаляет неиспользуемую номенклатуру с контролем ссылок.
Перед использованием внешней обработки проверьте её совместимость с вашей версией 1С. Некоторые обработки написаны для Управления торговлей 10.3 и не работают в ERP 2.5 без доработок.
6. Метод 5: Архивирование вместо удаления
Если номенклатура не должна отображаться в рабочих списках, но её нельзя удалять (например, по требованиям ФЗ-402 о хранении данных), используйте архивирование. Создайте отдельную группу справочника (например, "Архив") и переносите туда ненужные позиции.
Преимущества метода:
- 📂 Сохраняется история документов.
- 🔍 Легко восстановить номенклатуру при необходимости.
- 📊 Не ломаются отчёты по прошлым периодам.
Пример кода для переноса в архив:
Процедура АрхивироватьНоменклатуру(Номенклатура, ГруппаАрхив)
Если Номенклатура.Родитель <> ГруппаАрхив Тогда
Номенклатура.Родитель = ГруппаАрхив;
Номенклатура.ПометкаУдаления = Ложь; // Снимаем пометку, если была
Номенклатура.Записать();
КонецЕсли;
КонецПроцедуры
⚠️ Внимание: В конфигурациях с территориально распределёнными базами (например, 1С:УНФ) архивирование может вызвать конфликты репликации. Перед массовым переносом выполните тест на копии базы.
7. Ошибки и их решение
При программном удалении номенклатуры чаще всего возникают следующие ошибки:
| Ошибка | Причина | Решение |
|---|---|---|
Объект используется в документе [X] |
Номенклатура привязана к проведённому документу. | Используйте пометку на удаление или архивирование. Для принудительного удаления нужно сначала удалить документ. |
Недостаточно прав для удаления |
У пользователя нет роли с правом Удаление для справочника. |
Назначьте роль "Администратор" или создайте кастомную роль с нужными правами. |
Ошибка блокировки данных |
Объект заблокирован другим пользователем или регламентным заданием. | Используйте ПолучитьИсключительнуюБлокировку() или выполните операцию в нерабочее время. |
Нарушение ссылочной целостности |
Удаление разорвало связи в регистрах или документах. | Восстановите базу из резервной копии и используйте пометку на удаление. |
Если после удаления 1С выдаёт ошибку при открытии связанных документов, попробуйте:
- Выполнить
ТестированиеИИсправление()с флагомРеиндексацияТаблиц. - Перепровести документы, где использовалась номенклатура.
- Очистить кэш метаданных (
Файл → Открыть → Конфигуратор → Администрирование → Очистить кэш).
Что делать если после удаления номенклатуры перестали открываться отчёты?
Если отчёты (например, "Ведомость по товарам") выдают ошибку после удаления номенклатуры, это связано с кэшированием запросов. Решение:
1. Закройте все сеансы 1С.
2. В конфигураторе выполните: Администрирование → Тестирование и исправление → Проверка логической целостности.
3. Перезапустите сервер 1С (если используется клиент-серверный вариант).
4. Обновите конфигурацию базы данных (Конфигурация → Обновить конфигурацию базы данных).
Если проблема осталась, восстановите базу из резервной копии и используйте пометку на удаление вместо физического стирания.
8. Юридические аспекты удаления номенклатуры
Согласно Федеральному закону №402-ФЗ (о бухгалтерском учёте), удаление данных, используемых в отчётности, запрещено в течение 5 лет после отчётного периода. Это касается:
- 📑 Номенклатуры, указанной в первичных документах (накладные, акты).
- 💰 Товаров, участвующих в расчёте налога на прибыль или НДС.
- 📊 Позиций, включённых в инвентаризационные описи.
Что делать если номенклатуру нельзя удалять, но она мешает в работе:
- 🔖 Используйте архивирование (перенос в отдельную группу).
- 🏷️ Помечайте устаревшие позиции дополнительным реквизитом (например, "Устарело = Истина") и фильтруйте их в отчётах.
- 🔍 Настройте права доступа так, чтобы пользователи не видели ненужную номенклатуру.
Для проверки, можно ли удалять номенклатуру с точки зрения закона, используйте запрос:
ВЫБРАТЬ РАЗЛИЧНЫЕ
Документ.Дата КАК ДатаДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ГДЕ
Документ.Номенклатура = &Номенклатура
И Документ.Дата < ДобавитьМесяц(ТекущаяДата(), -60) // 5 лет назад
⚠️ Внимание: В 1С:Бухгалтерии 3.0 при попытке удалить номенклатуру, использованную в закрытом периоде, система автоматически блокирует операцию. Обойти это ограничение можно только через режим конфигуратора с правами администратора, но это нарушает лицензионное соглашение и может привести к проблемам при проверках ФНС.
Пометка на удаление — единственный легальный способ "скрыть" номенклатуру из закрытых периодов без нарушения закона. Физическое удаление таких позиций может квалифицироваться как уничтожение первичных документов (штраф до 300 000 руб. по ст. 15.11 КоАП РФ).
FAQ: Частые вопросы по удалению номенклатуры
Можно ли удалить номенклатуру, которая используется в непроведённом документе?
Да, но сначала нужно удалить или провести документ. Если документ не важен, проще удалить его целиком. Если документ нужен, но номенклатуру необходимо убрать — замените её на другую позицию или удалите строку из табличной части.
Как удалить номенклатуру вместе с её характеристиками и сериями?
Используйте каскадное удаление через запрос:
// Удаление характеристик
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.ХарактеристикиНоменклатуры ГДЕ Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура.Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Характеристика = Выборка.Ссылка.ПолучитьОбъект();
Характеристика.Удалить();
КонецЦикла;
Аналогично удаляются серии через Справочник.СерииНоменклатуры.
Почему после удаления номенклатуры в отчётах появляются пустые строки?
Это связано с тем, что 1С сохраняет ссылки на удалённые объекты в регистрах. Чтобы исправить:
- Выполните перепроведение документов за период.
- Обновите отчёт с флагом
ИгнорироватьПомеченныеНаУдаление. - Если проблема остаётся — восстановите номенклатуру из архива или резервной копии.
Как удалить номенклатуру в облачной версии 1С (1С:Fresh)?
В 1С:Fresh физическое удаление справочников заблокировано. Доступны только:
- Пометка на удаление.
- Архивирование (перенос в отдельную группу).
- Скрытие через настройку прав доступа.
Для массовых операций используйте стандартные обработки из раздела Администрирование → Сервисные функции.
Можно ли автоматизировать удаление номенклатуры, которая не продавалась больше года?
Да, для этого создайте регламентное задание с следующим кодом:
Процедура УдалитьНеиспользуемуюНоменклатуру() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа
| И НЕ СУЩЕСТВУЕТ(
| ВЫБРАТЬ РАЗЛИЧНЫЕ Документ.Ссылка
| ИЗ Документ.РеализацияТоваровУслуг КАК Документ
| ГДЕ Документ.Номенклатура = Номенклатура.Ссылка
| И Документ.Дата > ДобавитьГод(ТекущаяДата(), -1)
| )";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Номенклатура = Выборка.Ссылка.ПолучитьОбъект();
Номенклатура.УстановитьПометкуУдаления(Истина);
Номенклатура.Записать();
КонецЦикла;
КонецПроцедуры
Настройте выполнение задания ежемесячно с уведомлением администратора о результатах.