К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как удалить группу в 1С программно

Программное удаление группы справочника в 1С: методы Удалить, УстановитьПометкуУдаления, работа с иерархией, проверка подчинённых элементов и типовые ошибки.

Программное удаление группы справочника — типовая задача при обменах, очистке тестовых данных и автоматизации ведения классификаторов в 1С. В отличие от обычного элемента, группа может содержать подчинённые элементы и вложенные группы, поэтому перед удалением нужно решить, что делать с её содержимым: удалить вместе с группой, перенести в другую группу или отказаться от операции.

В встроенном языке 1С для групп доступны те же методы, что и для элементов справочника: Удалить() выполняет непосредственное физическое удаление объекта из базы, а УстановитьПометкуУдаления() ставит или снимает пометку без физического удаления. В большинстве прикладных решений рекомендуется именно пометка с последующим штатным удалением помеченных объектов — это защищает базу от нарушения ссылочной целостности.

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

Что такое группа в терминах 1С и чем она отличается от элемента

Группа в иерархическом справочнике — это узел дерева, который объединяет элементы и другие группы. В таблице справочника группа отличается признаком ЭтоГруппа = Истина. У группы есть код, наименование и ссылка, но обычно недоступна часть реквизитов, если в конфигураторе для них задано использование «Для элемента».

Ключевое отличие при удалении: на группу могут ссылаться подчинённые элементы через реквизит Родитель. Если удалить группу физически без обработки дочерних объектов, в зависимости от настроек и режима работы можно получить либо ошибку, либо элементы с «битым» родителем. Поэтому работа с группой всегда начинается с анализа её содержимого.

Как получить объект группы для удаления

Удалить группу можно только через объектную модель: сначала находим ссылку, затем получаем объект и вызываем метод удаления. Найти ссылку можно по коду, наименованию или через запрос.

ГруппаСсылка = Справочники.Номенклатура.НайтиПоНаименованию("Устаревшие товары", Истина);

Если Не ГруппаСсылка.Пустая() Тогда

ГруппаОбъект = ГруппаСсылка.ПолучитьОбъект();

ГруппаОбъект.УстановитьПометкуУдаления(Истина);

КонецЕсли;

Обратите внимание на второй параметр НайтиПоНаименованию — признак точного соответствия. Для надёжности лучше искать по коду или по заранее известной ссылке, потому что наименования групп могут совпадать. Если справочник подчинён владельцу, поиск нужно выполнять с указанием владельца.

Проверка Пустая() обязательна: попытка получить объект по несуществующей ссылке приведёт к ошибке. Дополнительно полезно проверить ГруппаСсылка.ЭтоГруппа, чтобы случайно не удалить обычный элемент с похожим наименованием.

Непосредственное удаление методом Удалить()

Метод Удалить() удаляет объект из базы сразу, без возможности отката вне транзакции. Этот способ применяют в сервисных обработках, при очистке тестовых баз и в обменах, когда гарантировано, что на группу нет ссылок.

ГруппаОбъект = ГруппаСсылка.ПолучитьОбъект();

ГруппаОбъект.Удалить();

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

Для безопасного сценария оберните операцию в транзакцию и выполните поиск ссылок через НайтиПоСсылкам():

МассивСсылок = Новый Массив;

МассивСсылок.Добавить(ГруппаСсылка);

НайденныеСсылки = НайтиПоСсылкам(МассивСсылок);

Если НайденныеСсылки.Количество() = 0 Тогда

ГруппаСсылка.ПолучитьОбъект().Удалить();

Иначе

Сообщить("На группу есть ссылки: " + НайденныеСсылки.Количество());

КонецЕсли;

Удаление через пометку — рекомендуемый способ

Метод УстановитьПометкуУдаления(Истина) только меняет признак, данные остаются в базе. Помеченная группа перестаёт участвовать в большинстве прикладных механизмов, но при необходимости пометку можно снять тем же методом с параметром Ложь.

Физическое удаление помеченных объектов выполняется штатной обработкой «Удаление помеченных объектов» (в типовых конфигурациях — в разделе администрирования) либо программно через метод УдалитьПомеченныеОбъекты() в монопольном режиме. Платформа при этом проверяет ссылки и не даст удалить объект, если на него есть ссылки и выбран режим контроля.

Безопасный порядок удаления группы
  1. 1
    Найдите ссылку на группу по коду или наименованию и проверьте, что это именно группа
  2. 2
    Проверьте наличие подчинённых элементов и вложенных групп запросом по Родитель
  3. 3
    Перенесите или пометьте на удаление содержимое группы
  4. 4
    Установите пометку удаления на саму группу
  5. 5
    Выполните штатное удаление помеченных объектов с контролем ссылок
  6. 6
    Проверьте результат: группа исчезла из списка и из дерева справочника

Работа с иерархией: что делать с содержимым группы

Главный вопрос при удалении группы — судьба её содержимого. Есть три рабочих сценария.

Удаление группы вместе с содержимым

Подходит при очистке устаревших веток классификатора. Сначала запросом выбираются все элементы и группы, у которых родитель — удаляемая группа (при глубокой иерархии используйте В ИЕРАРХИИ), затем каждый объект помечается на удаление, и только после этого помечается сама группа.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ Ссылка

|ИЗ Справочник.Номенклатура

|ГДЕ Ссылка В ИЕРАРХИИ(&Группа) И Ссылка <> &Группа";

Запрос.УстановитьПараметр("Группа", ГруппаСсылка);

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Выборка.Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);

КонецЦикла;

Перенос содержимого в другую группу

Если элементы нужны, а группа — нет, перед удалением перезапишите у них реквизит Родитель на новую группу или на пустую ссылку (перенос в корень). После записи всех элементов группа станет пустой и её можно удалять без риска.

Отказ от удаления непустой группы

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

Маршрут решения

Как выбрать сценарий

Содержимое группы не нужно и ссылок на него нетПометьте на удаление всё содержимое, затем саму группу
Элементы нужны, группа — нетПеренесите элементы в другую группу через реквизит Родитель, затем удаляйте пустую группу
На группу или её содержимое есть ссылки из документовОткажитесь от физического удаления, ограничьтесь пометкой
Операция выполняется в рабочей базе без бэкапаИспользуйте только пометку на удаление, физическое удаление — после создания резервной копии

Особенности: планы видов характеристик, обмены и права

Описанные приёмы работают для любых иерархических объектов с группами — справочников и планов видов характеристик. У планов счетов и планов видов расчёта иерархии в таком виде нет, там удаляются только элементы.

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

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

Типичные ошибки
01
Вызов Удалить() без проверки ссылок — появляются битые ссылки «Объект не найден» в документах и регистрах
02
Удаление группы без обработки подчинённых элементов — элементы остаются с некорректным родителем или удаляются неожиданно для пользователей
03
Поиск группы только по наименованию без точного соответствия — удаляется не та группа с похожим именем
04
Отсутствие проверки ЭтоГруппа — под нож попадает обычный элемент справочника
05
Физическое удаление в базе с обменом — конфликты и рассинхронизация в узлах РИБ
06
Выполнение массового удаления без транзакции и бэкапа — при сбое данные частично потеряны

Проверка результата после удаления

После пометки убедитесь, что у группы установлен признак ПометкаУдаления — это видно в списке справочника при включённом отображении помеченных. После физического удаления проверьте, что поиск по ссылке возвращает пустой результат, а в дереве справочника группа отсутствует.

Дополнительно стоит запустить тестирование и исправление информационной базы с проверкой ссылочной целостности, если удаление выполнялось непосредственным методом. Это выявит битые ссылки, которые могли остаться незамеченными.

Контрольные точки

Как проверить результат

Поиск группы по ссылке или коду
Норма

Ссылка не находится, группа отсутствует в списке

Тревожный признак

Группа по-прежнему доступна в списке без пометки

Подчинённые элементы
Норма

Перенесены в целевую группу или помечены на удаление

Тревожный признак

Элементы ссылаются на удалённого родителя

Ссылки из документов и регистров
Норма

НайтиПоСсылкам не возвращает записей

Тревожный признак

В полях отображается «Объект не найден»

Часто задаваемые вопросы

Можно ли удалить группу запросом, без ПолучитьОбъект()?

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

Чем Удалить() отличается от УстановитьПометкуУдаления()?

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

Что будет с элементами группы, если удалить её методом Удалить()?

Платформа не удалит подчинённые элементы автоматически. Они останутся в базе со ссылкой Родитель на несуществующий объект, что приведёт к ошибкам в отборах по иерархии и отображении. Содержимое нужно обработать заранее.

Как восстановить ошибочно удалённую группу?

Если была установлена только пометка — снимите её методом УстановитьПометкуУдаления(Ложь) или интерактивно. После физического удаления восстановление возможно только из резервной копии базы, поэтому перед массовыми операциями бэкап обязателен.

Как удалить сразу много групп?

Выберите нужные группы запросом с отбором (например, по признаку ЭтоГруппа и условию на наименование или код), в цикле получайте объект каждой ссылки и устанавливайте пометку. Операцию выполняйте в транзакции и на сервере, а физическое удаление — штатной обработкой удаления помеченных объектов.

Итог

Что важно запомнить

Группа удаляется теми же методами, что и элемент: Удалить() — сразу и без контроля, УстановитьПометкуУдаления() — безопасно и обратимо. Перед удалением обязательно обработайте подчинённые элементы, проверьте ссылки на группу и сделайте резервную копию при работе в боевой базе.