Как исправить ошибку удаления версий файлов из-за скрытых ссылок в 1С:Документооборот

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

При активной работе в программе 1С:Документооборот 8 КОРП (особенно в редакциях линейки 2.1) администраторы часто сталкиваются со следующей проблемой: при попытке выполнить стандартное удаление помеченных объектов для справочника ВерсииФайлов система сообщает о наличии блокирующих ссылок. Чаще всего контроль ссылочной целостности указывает на регистры сведений ФайлыКУдалению или ОбращениеКВерсиям. При этом ручное открытие этих регистров показывает, что они абсолютно пусты. Удалить версию файла стандартными средствами не удается.

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

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

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

  1. Регистр сведений ФайлыКУдалению хранит информацию о файлах, которые физически должны быть стерты с дисковых томов хранения. Запись в этот регистр попадает в тот момент, когда пользователь помечает версию файла на удаление.
  2. Регистр сведений ОбращениеКВерсиям предназначен для логирования истории: кто, когда и к какому именно файлу обращался в процессе работы.

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

Почему же при ручном открытии через интерфейс регистры кажутся пустыми? Рассмотрим две основные причины:

В результате пользователь видит пустую таблицу в интерфейсе, хотя в физической таблице СУБД записи по-прежнему присутствуют.

Шаг 1. Поиск «невидимых» ссылок с помощью консоли запросов

Убедимся в наличии фантомных записей напрямую. Для этого мы обойдем интерфейсные фильтры и механизмы RLS. Воспользуемся инструментом «Консоль запросов». Запросы в 1С обращаются к таблицам базы данных напрямую, игнорируя настройки экранных форм.

Напишем и выполним простой запрос к регистру сведений ОбращениеКВерсиям, чтобы проверить наличие записей по конкретной версии файла:


ВЫБРАТЬ
	ОбращениеКВерсиям.ВерсияФайла КАК ВерсияФайла,
	ОбращениеКВерсиям.Пользователь КАК Пользователь,
	ОбращениеКВерсиям.ДатаОбращения КАК ДатаОбращения
ИЗ
	РегистрСведений.ОбращениеКВерсиям КАК ОбращениеКВерсиям
ГДЕ
	ОбращениеКВерсиям.ВерсияФайла = &ПроблемнаяВерсия

Аналогичный запрос можно выполнить и для таблицы РегистрСведений.ФайлыКУдалению:


ВЫБРАТЬ
	ФайлыКУдалению.Файл КАК Файл,
	ФайлыКУдалению.Версия КАК Версия
ИЗ
	РегистрСведений.ФайлыКУдалению КАК ФайлыКУдалению
ГДЕ
	ФайлыКУдалению.Версия = &ПроблемнаяВерсия

Если запросы вернули строки результатов — мы нашли истинную причину блокировки удаления. Перейдем к вариантам решения проблемы.

Шаг 2. Варианты решения проблемы

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

Способ 1. Официальное обновление конфигурации

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

Решение: Обновите конфигурацию до релиза 2.1.12 или выше. Начиная с этой версии, разработчики исправили поведение системы: при удалении версии файла ссылки в служебных регистрах сведений очищаются автоматически в рамках одной транзакции удаления, не вызывая конфликтов.

Способ 2. Программное удаление записей (если обновление невозможно)

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

Напишем небольшую внешнюю обработку или воспользуемся обработкой «Групповое изменение реквизитов» с возможностью выполнения произвольного алгоритма на встроенном языке. Нам нужно перезаписать набор записей регистра, установив отбор по нашей проблемной версии файла.

Посмотрим на пример программного кода для очистки регистра ОбращениеКВерсиям:


// Определяем ссылку на удаляемую версию файла
СсылкаНаВерсию = Справочники.ВерсииФайлов.НайтиПоРеквизиту("Наименование", "Имя_Вашего_Файла"); 

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

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


СсылкаНаВерсию = Справочники.ВерсииФайлов.НайтиПоКоду("Код_Версии");

Если ЗначениеЗаполнено(СсылкаНаВерсию) Тогда
    НаборЗаписей = РегистрыСведений.ФайлыКУдалению.СоздатьНаборЗаписей();
    
    // Устанавливаем отбор по измерению (например, Версия)
    НаборЗаписей.Отбор.Версия.Установить(СсылкаНаВерсию);
    
    // Записываем пустой набор для удаления записей
    НаборЗаписей.Записать(Истина);
    
    Сообщить("Служебные записи в регистре ФайлыКУдалению успешно очищены!");
КонецЕсли;

Важное примечание по регистру ФайлыКУдалению: Очистка записей в этом регистре означает, что физический файл на диске (в томе хранения) может временно остаться «осиротевшим» (база данных больше не хранит команду на его удаление с диска). Для полной очистки дискового пространства после удаления карточки версии из базы рекомендуется выполнить стандартную процедуру проверки целостности томов через меню «Настройка и администрирование» -> «Работа с файлами» -> «Тома хранения файлов» -> «Проверить целостность томов».

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

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

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

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

← На главную