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