При работе в крупных корпоративных системах на базе 1С, таких как 1С:ERP Управление предприятием, 1С:Комплексная автоматизация (КА) или 1С:Управление торговлей (УТ), пользователи часто сталкиваются с неприятной ситуацией. При попытке очистить базу от помеченных на удаление счетов-фактур стандартный помощник выдает ошибку ссылочной целостности. Система сообщает, что документ невозможно удалить, так как на него ссылаются записи независимых регистров сведений — чаще всего это Уникальные номера документов и Статусы проверки документов.
В этой статье мы подробно разберем, почему возникает эта проблема с точки зрения архитектуры платформы 1С:Предприятие, как обычному пользователю без привлечения программиста быстро удалить мешающие записи штатными средствами и как разработчик может автоматизировать этот процесс раз и навсегда.
Сначала проанализируем техническую подоплеку проблемы. В платформе 1С:Предприятие связь между документами и регистрами сведений определяется свойствами измерений этих регистров. Одно из ключевых свойств измерения — это свойство «Ведущее».
<Объект не найден>).Разработчики фирмы 1С сознательно не делают измерения регистров Статусы проверки документов и Уникальные номера документов ведущими. В высоконагруженных ERP-системах ведущие измерения требуют от СУБД создания дополнительных индексов и наложения жестких транзакционных блокировок при записи документов. Чтобы избежать снижения производительности и частых взаимоблокировок (deadlocks) при одновременной работе сотен пользователей, разработчики конфигурации пожертвовали удобством удаления документов в пользу общей стабильности и быстродействия системы.
Вопреки распространенному мнению, что для удаления подобных документов обязательно нужно вызывать программиста или использовать сложные Инструменты разработчика (ИР), в типовом решении есть полностью штатный и безопасный механизм очистки «зависших» записей.
Разберем по шагам, как решить эту задачу в стандартном окне удаления помеченных объектов:
Delete, если это доступно).Этот способ абсолютно безопасен, не требует доработки конфигурации и доступен любому пользователю (например, главному бухгалтеру) с правами на удаление данных.
Если в вашей базе скопились тысячи документов, требующих удаления, ручной клик по каждой записи регистра превращается в рутину. Чтобы избавить пользователей от этой проблемы, мы можем реализовать автоматическую очистку мешающих регистров в момент удаления самого документа. Для этого лучше всего использовать механизм расширений конфигурации и создать подписку на событие.
Рассмотрим пример реализации программного решения:
ПередУдалениемДокументовОчисткаРегистров.ДокументОбъект.СчетФактураВыданный, ДокументОбъект.СчетФактураПолученный, ДокументОбъект.РеализацияТоваровУслуг).ПередУдалением.
Процедура ПередУдалениемДокументовОчисткаРегистровПередУдалением(Источник, Отказ) Экспорт
// Если удаление уже отменено другими механизмами, прерываем выполнение
Если Отказ Тогда
Возврат;
КонецЕсли;
СсылкаНаДокумент = Источник.Ссылка;
// 1. Очистка записей в регистре "Статусы проверки документов"
НаборСтатусы = РегистрыСведений.СтатусыПроверкиДокументов.СоздатьНаборЗаписей();
НаборСтатусы.Отбор.Документ.Установить(СсылкаНаДокумент);
Попытка
НаборСтатусы.Записать();
Исключение
ЗаписьЖурналаРегистрации("ОчисткаРегистровПриУдалении",
УровеньЖурналаРегистрации.Предупреждение,
,
,
"Не удалось очистить статус проверки для документа: " + СсылкаНаДокумент + Символы.ПС + ОписаниеОшибки());
КонецПопытки;
// 2. Очистка записей в регистре "Уникальные номера документов"
НаборНомера = РегистрыСведений.УникальныеНомераДокументов.СоздатьНаборЗаписей();
НаборНомера.Отбор.Документ.Установить(СсылкаНаДокумент);
Попытка
НаборНомера.Записать();
Исключение
ЗаписьЖурналаРегистрации("ОчисткаРегистровПриУдалении",
УровеньЖурналаРегистрации.Предупреждение,
,
,
"Не удалось очистить уникальный номер для документа: " + СсылкаНаДокумент + Символы.ПС + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Этот код при физическом удалении документа находит все записи в проблемных независимых регистрах сведений с отбором по удаляемому документу и записывает пустой набор данных, стирая «зависшие» хвосты. В результате стандартный помощник удаления помеченных объектов отработает быстро и без ошибок.
В процессе обсуждения подобных проблем часто звучит совет: «Используйте Инструменты разработчика (ИР) или внешнюю обработку поиска и замены дублей/удаления объектов». Важно понимать, что предоставление таких инструментов обычным бухгалтерам или менеджерам несет в себе огромные риски:
Подобные инструменты должны оставаться исключительно в арсенале квалифицированных ИТ-специалистов и администраторов баз данных.
Если в вашей базе данных потребность в регулярном и массовом удалении документов возникает постоянно, проанализируем бизнес-процессы компании. Наличие сотен «ошибочно» введенных документов, которые затем приходится удалять, сигнализирует о проблемах в организации работы персонала:
Таким образом, сочетание правильной настройки прав пользователей, понимание штатных механизмов очистки связей в помощнике удаления и точечная программная автоматизация через подписки на события позволят поддерживать базу 1С в чистоте и порядке без лишних трудозатрат.