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