Как заменить ссылки на удаляемый объект на пустую ссылку в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Причина ограничения в типовой обработке

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

Стоит отметить, что в современных версиях БСП обработка может предлагать действие Очистить ссылку прямо в списке мест использования, но это происходит только в том случае, если на уровне метаданных реквизиту не установлено свойство ПроверкаЗаполнения со значением ВыдаватьОшибку. Если проверка есть, система не предложит очистку, чтобы не нарушить целостность данных.

Решение 1: Программная замена ссылок через метаданные

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

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


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

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

Решение 2: Использование "Группового изменения реквизитов"

Разберем более простой и "типовой" путь, который не требует навыков программирования. Мы можем использовать стандартную обработку ГрупповоеИзменениеРеквизитов, которая есть практически в любой современной конфигурации.

Алгоритм действий следующий:

  1. В окне Удаление помеченных объектов проанализируйте список ссылающихся объектов (места использования). Запомните, в каких конкретно справочниках или документах "застряли" ссылки на ваш объект.
  2. Откройте обработку Групповое изменение реквизитов (обычно находится в разделе "Администрирование" -> "Обслуживание").
  3. В поле выбора типа объектов выберите тот документ или справочник, который ссылается на удаляемый элемент.
  4. Нажмите на ссылку Все элементы для настройки отбора. Добавьте условие фильтрации: выберите нужный реквизит и установите его равным вашему удаляемому объекту.
  5. В табличной части обработки найдите этот реквизит. В колонке Новое значение ничего не указывайте (оставьте поле пустым).
  6. Нажмите Изменить реквизиты.

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

Особые случаи: Регистры сведений и модули менеджеров

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

Для разработчиков также существует возможность переопределить логику стандартной обработки БСП. В модуле менеджера объекта (который мы удаляем) можно разместить экспортную процедуру ПриОпределенииОбъектовССылками. В ней можно программно прописать правила: какие ссылки считать допустимыми для автоматической очистки, а какие должны строго блокировать удаление. Это позволяет тонко настроить систему под бизнес-логику конкретного предприятия.

← На главную