Как удалить помеченные на удаление счета-фактуры в 1С:ERP и почему этому мешают регистры сведений?

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

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

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

Выясним причину: почему платформа блокирует удаление?

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

Разработчики фирмы 1С сознательно не делают измерения регистров Статусы проверки документов и Уникальные номера документов ведущими. В высоконагруженных ERP-системах ведущие измерения требуют от СУБД создания дополнительных индексов и наложения жестких транзакционных блокировок при записи документов. Чтобы избежать снижения производительности и частых взаимоблокировок (deadlocks) при одновременной работе сотен пользователей, разработчики конфигурации пожертвовали удобством удаления документов в пользу общей стабильности и быстродействия системы.

Способ 1. Удаление записей пользователем через типовой интерфейс (без программиста)

Вопреки распространенному мнению, что для удаления подобных документов обязательно нужно вызывать программиста или использовать сложные Инструменты разработчика (ИР), в типовом решении есть полностью штатный и безопасный механизм очистки «зависших» записей.

Разберем по шагам, как решить эту задачу в стандартном окне удаления помеченных объектов:

  1. Откроем помощник удаления помеченных объектов через меню НСИ и администрирование — Обслуживание — Удаление помеченных объектов.
  2. Выберем режим удаления (автоматический или выборочный) и запустим процесс анализа связей.
  3. После завершения анализа в левом окне помощника отобразится список документов, которые системе не удалось удалить (включая наши счета-фактуры). При выделении конкретного счета-фактуры в правом окне «Места использования» отобразятся мешающие связи — те самые записи регистров сведений.
  4. Для очистки этих связей выполним двойной клик левой кнопкой мыши по строке записи регистра в правом окне.
  5. Платформа автоматически откроет карточку (форму) этой конкретной записи регистра сведений.
  6. В открывшейся карточке нажмем кнопку «Ещё» — «Удалить» (или воспользуемся горячей клавишей Delete, если это доступно).
  7. После того как карточка записи закроется, а сама запись исчезнет из списка связей, нажмем кнопку «Повторить удаление» внизу окна помощника.

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

Способ 2. Автоматизация удаления через подписку на события (решение для программиста)

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

Рассмотрим пример реализации программного решения:

  1. Создадим новое расширение конфигурации (или откроем существующее).
  2. Добавим в расширение новую Подписку на событие. Назовем её, например, ПередУдалениемДокументовОчисткаРегистров.
  3. В качестве источника выберем типы документов, которые вызывают сложности (например, ДокументОбъект.СчетФактураВыданный, ДокументОбъект.СчетФактураПолученный, ДокументОбъект.РеализацияТоваровУслуг).
  4. В качестве события выберем ПередУдалением.
  5. Создадим обработчик события в общем модуле расширения и напишем следующий код:

Процедура ПередУдалениемДокументовОчисткаРегистровПередУдалением(Источник, Отказ) Экспорт
    
    // Если удаление уже отменено другими механизмами, прерываем выполнение
    Если Отказ Тогда
        Возврат;
    КонецЕсли;
    
    СсылкаНаДокумент = Источник.Ссылка;
    
    // 1. Очистка записей в регистре "Статусы проверки документов"
    НаборСтатусы = РегистрыСведений.СтатусыПроверкиДокументов.СоздатьНаборЗаписей();
    НаборСтатусы.Отбор.Документ.Установить(СсылкаНаДокумент);
    
    Попытка
        НаборСтатусы.Записать();
    Исключение
        ЗаписьЖурналаРегистрации("ОчисткаРегистровПриУдалении",
            УровеньЖурналаРегистрации.Предупреждение,
            ,
            ,
            "Не удалось очистить статус проверки для документа: " + СсылкаНаДокумент + Символы.ПС + ОписаниеОшибки());
    КонецПопытки;
    
    // 2. Очистка записей в регистре "Уникальные номера документов"
    НаборНомера = РегистрыСведений.УникальныеНомераДокументов.СоздатьНаборЗаписей();
    НаборНомера.Отбор.Документ.Установить(СсылкаНаДокумент);
    
    Попытка
        НаборНомера.Записать();
    Исключение
        ЗаписьЖурналаРегистрации("ОчисткаРегистровПриУдалении",
            УровеньЖурналаРегистрации.Предупреждение,
            ,
            ,
            "Не удалось очистить уникальный номер для документа: " + СсылкаНаДокумент + Символы.ПС + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

Этот код при физическом удалении документа находит все записи в проблемных независимых регистрах сведений с отбором по удаляемому документу и записывает пустой набор данных, стирая «зависшие» хвосты. В результате стандартный помощник удаления помеченных объектов отработает быстро и без ошибок.

Почему не стоит давать пользователям «Инструменты разработчика» (ИР)?

В процессе обсуждения подобных проблем часто звучит совет: «Используйте Инструменты разработчика (ИР) или внешнюю обработку поиска и замены дублей/удаления объектов». Важно понимать, что предоставление таких инструментов обычным бухгалтерам или менеджерам несет в себе огромные риски:

Подобные инструменты должны оставаться исключительно в арсенале квалифицированных ИТ-специалистов и администраторов баз данных.

Оптимизация документооборота как стратегическое решение

Если в вашей базе данных потребность в регулярном и массовом удалении документов возникает постоянно, проанализируем бизнес-процессы компании. Наличие сотен «ошибочно» введенных документов, которые затем приходится удалять, сигнализирует о проблемах в организации работы персонала:

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

← На главную