Как правильно удалять документы в 1С:УТ 11 и очищать связанные регистры сведений

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

В современных конфигурациях на платформе 1С:Предприятие 8.3, таких как Управление торговлей 11, Комплексная автоматизация 2 или ERP, многие программисты и администраторы сталкиваются с проблемой: при удалении документа в базе остаются «хвосты» в регистрах сведений. Эти записи не только замусоривают базу, но и часто блокируют само удаление объекта, так как система видит существующие ссылки. Проанализируем, почему так происходит, и разберем эффективные методы решения этой задачи.

Почему записи в регистрах не удаляются автоматически?

Рассмотрим архитектурную особенность последних версий конфигураций. В отличие от старых систем (например, УТ 10.3 или 7.7), где большинство регистров были подчинены регистратору, в УТ 11 многие ключевые данные хранятся в независимых регистрах сведений. К ним относятся:

  1. ДанныеПервичныхДокументов — хранит информацию для печатных форм и реестров.
  2. РеестрДокументов — используется для быстрого отображения списков документов.
  3. ЗаданияКРасчетуСебестоимости — очередь для фонового расчета партионного учета.
  4. ЗаданияКЗакрытиюМесяца — служебные отметки о необходимости пересчета итогов.

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

Способ 1: Использование штатных механизмов для пользователя

Выясним, как должен действовать рядовой пользователь без привлечения программиста. В 1С:УТ 11 реализован строгий регламент удаления объектов, который состоит из двух этапов:

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

Если же документ «не уходит» из-за ссылок, которые система считает важными (например, ЗаданияКРасчетуСебестоимости), администратору необходимо убедиться, что в базе не зависли регламентные задания, обрабатывающие эти очереди. При работе с большими объемами удаляемых объектов можно использовать обработку для удаления помеченных объектов с предварительным отбором.

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

Если нам необходимо массово удалить документы программно, например, при переходе с версии 7.7 или при исправлении ошибок загрузки, нам придется вручную «подчистить» регистры. Проанализируем пример кода, который позволяет найти записи в регистре ДанныеПервичныхДокументов, ссылающиеся на помеченные документы, и удалить их.

Рассмотрим пример кода, использующий запрос для поиска таких записей:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ДанныеПервичныхДокументов.Организация КАК Организация,
    |   ДанныеПервичныхДокументов.Документ КАК Документ
    |ИЗ
    |   РегистрСведений.ДанныеПервичныхДокументов КАК ДанныеПервичныхДокументов
    |ГДЕ
    |   ДанныеПервичныхДокументов.Документ.ПометкаУдаления = ИСТИНА";

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

Пока Выборка.Следующий() Цикл
    МенеджерЗаписи = РегистрыСведений.ДанныеПервичныхДокументов.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Организация = Выборка.Организация;
    МенеджерЗаписи.Документ = Выборка.Документ;
    МенеджерЗаписи.Прочитать();
    Если МенеджерЗаписи.Выбран() Тогда
        МенеджерЗаписи.Удалить();
    КонецЕсли;
КонецЦикла;

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

Способ 3: Оптимальное удаление через НаборЗаписей

Разберем более профессиональный подход. Вместо перебора каждой записи по отдельности, лучше использовать объект НаборЗаписей с установленным фильтром (отбором). Это работает значительно быстрее, особенно если нужно очистить данные по конкретному документу.

Посмотрим на пример функции, которая очищает записи регистра по ссылке на документ:


Процедура ОчиститьРегистрСведенийПоДокументу(СсылкаНаДокумент)
    
    // Выбираем интересующий нас регистр
    Набор = РегистрыСведений.ДанныеПервичныхДокументов.СоздатьНаборЗаписей();
    
    // Устанавливаем отбор по документу
    Набор.Отбор.Документ.Установить(СсылкаНаДокумент);
    
    // Записываем пустой набор. Это действие удалит все записи из регистра, 
    // которые соответствуют установленному отбору.
    Набор.Записать();
    
КонецПроцедуры

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

Особенности работы с заданиями к закрытию месяца

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

Рекомендация: При массовом программном удалении документов поступления старайтесь не просто очищать регистры заданий, а перепроводить регламентные операции закрытия месяца. Если же удаление носит технический характер (например, удаление дублей или ошибочно загруженных данных), то используйте НаборЗаписей для очистки ссылок, чтобы платформа позволила физически удалить объект ДокументСсылка.

Резюме и практические советы

Подводя итог нашему анализу, выделим основные правила работы с удалением в УТ 11:

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

← На главную