Как очистить регистр сведений «Объекты доступа документов» при свертке базы 1С:Управление торговлей 10.3?

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

При проведении свертки информационной базы в конфигурации «Управление торговлей», редакция 10.3, специалисты часто сталкиваются со следующей проблемой: после переноса остатков и пометки старых документов на удаление стандартная обработка «Удаление помеченных объектов» отказывается удалять документы. Программа сообщает, что на документы существуют ссылки в регистре сведений Объекты доступа документов.

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

Что представляет собой регистр «Объекты доступа документов»?

Давайте проанализируем структуру и назначение этого технического объекта. Регистр сведений Объекты доступа документов имеет крайне простую структуру, состоящую всего из двух ключевых измерений:

  1. ДокументСсылка — ссылка на сам документ системы (например, «Реализация товаров и услуг», «Счет-фактура выданный» и т. д.).
  2. ОбъектДоступа — ссылка на объект, по которому разграничиваются права (обычно это справочники «Контрагенты», «Организации» или группы доступа контрагентов).

Этот регистр является важнейшим элементом механизма RLS (Row Level Security) — ограничения прав доступа на уровне записей. Рассмотрим подробнее, зачем понадобилось выносить эти данные в отдельную таблицу.

Если бы этого регистра не существовало, то при каждом открытии динамического списка (например, журнала документов) СУБД приходилось бы выполнять сложнейшие запросы: «на лету» соединять таблицы документов, определять контрагента, проверять его принадлежность к группе доступа, сопоставлять с правами текущего пользователя и только после этого выводить список. На базах с высокой интенсивностью документооборота это приводило бы к колоссальным задержкам и блокировкам.

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

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

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

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

Последствия очистки регистра

Давайте выясним, что произойдет, если мы очистим записи в этом регистре:

  1. Если механизм RLS включен и активно используется: удаление записей по актуальным (не удаляемым) документам приведет к тому, что рядовые пользователи с ограниченными правами просто перестанут видеть эти документы в списках. Система посчитает, что раз связки в регистре нет, то и прав на просмотр документа у пользователя тоже нет. Чтобы вернуть видимость, документы придется перепроводить или запускать специальную обработку обновления доступа.
  2. Если документы подлежат удалению в рамках свертки: удаление записей регистра по этим документам является полностью безопасным и необходимым действием. Поскольку сами документы будут физически удалены из базы данных, информация об ограничении доступа к ним теряет всякий смысл.
  3. Если механизм RLS полностью выключен в системе: вы можете полностью очистить весь регистр. Это не повлияет на видимость документов пользователями, но позволит существенно уменьшить физический размер базы данных (особенно актуально для СУБД MS SQL Server и PostgreSQL, где индексы этой таблицы могут разрастаться до огромных размеров).

Пошаговый алгоритм очистки регистра при свертке базы

Для того чтобы успешно удалить помеченные архивные документы, нам необходимо предварительно очистить соответствующие им записи в регистре Объекты доступа документов. Выполним эту задачу по шагам.

Шаг 1. Анализ документов к удалению

Перед очисткой убедимся, что все документы, ссылки на которые мешают удалению в регистре, действительно помечены на удаление и их дата меньше даты свертки базы данных. Очищать записи для актуальных документов, которые остаются в базе, не рекомендуется (если используется RLS).

Шаг 2. Создание обработки для программного удаления записей

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

Давайте посмотрим на пример программного кода, который решает эту задачу оптимальным образом с использованием пакетов (транзакций), чтобы избежать переполнения лога транзакций СУБД и блокировок:


Процедура ОчиститьОбъектыДоступаДокументовПередУдалением(ДатаСвертки) Экспорт
    
    // Шаг 1. Выбираем все ссылки на документы, которые помечены на удаление и дата которых меньше даты свертки,
    // и по которым еще существуют записи в регистре "Объекты доступа документов"
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |	ОбъектыДоступа.ДокументСсылка КАК ДокументСсылка
        |ИЗ
        |	РегистрСведений.ОбъектыДоступаДокументов КАК ОбъектыДоступа
        |ГДЕ
        |	ОбъектыДоступа.ДокументСсылка.Дата < &ДатаСвертки
        |	И ОбъектыДоступа.ДокументСсылка.ПометкаУдаления = ИСТИНА";
    
    Запрос.УстановитьПараметр("ДатаСвертки", ДатаСвертки);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        Сообщить("Записей для очистки не обнаружено.");
        Возврат;
    КонецЕсли;
    
    Выборка = РезультатЗапроса.Выбрать();
    ВсегоДокументов = Выборка.Количество();
    Обработано = 0;
    
    Сообщить("Начата очистка регистра для " + ВсегоДокументов + " документов...");
    
    // Шаг 2. Начинаем обход и удаление записей порциями для снижения нагрузки на СУБД
    Пока Выборка.Следующий() Цикл
        
        // Создаем набор записей с отбором по конкретному документу
        НаборЗаписей = РегистрыСведений.ОбъектыДоступаДокументов.СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.ДокументСсылка.Установить(Выборка.ДокументСсылка);
        
        Попытка
            // Запись пустого набора удаляет все записи по данному отбору из базы данных
            НаборЗаписей.Записать();
            Обработано = Обработано + 1;
        Исключение
            Сообщить("Ошибка при очистке документа " + Выборка.ДокументСсылка + ": " + ОписаниеОшибки(), СтатусСообщения.Важное);
        КонецПопытки;
        
        // Выводим прогресс каждые 1000 документов
        Если Обработано % 1000 = 0 Тогда
            Сообщить("Обработано документов: " + Обработано + " из " + ВсегоДокументов);
        КонецЕсли;
        
    КонецЦикла;
    
    Сообщить("Очистка успешно завершена. Обработано документов: " + Обработано);
    
КонецПроцедуры

Шаг 3. Запуск удаления помеченных объектов

После успешного выполнения программного скрипта все ссылки из регистра Объекты доступа документов на удаляемые документы будут стерты. Теперь мы можем запустить стандартную обработку «Удаление помеченных объектов» (меню Операции -> Удаление помеченных объектов). Процедура удаления пройдет быстро и без ошибок ссылочной целостности по данному регистру.

Особенности для клиент-серверного варианта (SQL)

Если ваша база данных УТ 10.3 работает на MS SQL Server или PostgreSQL, после массового удаления записей из регистра Объекты доступа документов рекомендуется выполнить обслуживание базы данных на уровне СУБД:

Таким образом, мы детально разобрали механизм работы регистра сведений Объекты доступа документов, выяснили его техническую роль в системе прав доступа RLS и научились быстро и безопасно очищать его при свертке информационной базы данных.

← На главную