Как ускорить процедуру тестирования и исправления (ТИИ) при большом количестве битых ссылок

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

Процедура «Тестирование и исправление» (ТИИ) является стандартным и необходимым инструментом для поддержания здоровья базы данных 1С. Однако при работе с высоконагруженными или запущенными базами администраторы часто сталкиваются с проблемой: процесс, который должен занимать несколько часов, растягивается на сутки и более. При этом наблюдается характерная динамика — в начале ТИИ работает быстро, но со временем скорость падения производительности становится катастрофической, а потребление оперативной памяти процессом 1cv8.exe вырастает в десятки раз. Разберем причины этого явления и рассмотрим эффективные способы ускорения процесса.

Почему ТИИ замедляется со временем?

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

Выясним основные факторы замедления:

  1. Переполнение буфера сообщений: Платформа тратит все больше ресурсов на отрисовку и управление списком строк в окне сообщений. Чем больше строк уже выведено, тем медленнее добавляется каждая последующая.
  2. Утечка памяти: В 32-битных клиентах 1С (которые до сих пор часто используются для Конфигуратора) предел адресного пространства составляет около 2-3 ГБ. Когда буфер сообщений достигает 1.5–2 ГБ, система начинает активно использовать файл подкачки или вовсе завершает работу с ошибкой «Out of memory».
  3. Запись в Журнал регистрации: По умолчанию каждое сообщение ТИИ дублируется в Журнал регистрации (ЖР). Это создает дополнительную нагрузку на дисковую подсистему и увеличивает размер файлов ЖР.

Решение 1: Использование командной строки с ключом /Out

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

Рассмотрим структуру команды для запуска тестирования и исправления. Нам потребуется файл параметров и сама командная строка.

Пример команды для запуска:


"C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" DESIGNER /F "D:\Bases\WorkBase" /N "Admin" /P "Password" /IBCheckAndRepair -Rebuild -NoQuestion /Out "C:\Logs\tii_log.txt" -Visible

Проанализируем используемые параметры:

Решение 2: Отключение Журнала регистрации

Если в базе миллионы поврежденных объектов, запись каждого чиха в Журнал регистрации может стать «бутылочным горлышком». Перед запуском ТИИ целесообразно временно отключить регистрацию событий.

Рассмотрим по шагам, как это сделать:

  1. Зайдем в Конфигуратор.
  2. Перейдем в меню «Администрирование» — «Настройка журнала регистрации».
  3. Выберем режим «Не регистрировать».
  4. После завершения ТИИ не забудем вернуть настройки в исходное состояние (например, «Регистрировать ошибки, предупреждения, информацию»).

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

Решение 3: Программная очистка битых ссылок (Альтернатива ТИИ)

Иногда стандартное ТИИ работает слишком «тяжело», так как проверяет всю базу целиком. Если наша задача — только «грохнуть» битые ссылки (объекты с пометкой Object not found или Объект не найден), мы можем написать внешнюю обработку. Программный метод работает быстрее, так как мы можем управлять транзакциями и не вызывать лишних обработчиков.

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

Пример кода для поиска и очистки битых ссылок в реквизите:


Выборка = Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
    Объект = Выборка.ПолучитьОбъект();
    Изменено = Ложь;
    
    // Проверяем конкретный реквизит, например, ОсновнойМенеджер
    Если ЗначениеЗаполнено(Объект.ОсновнойМенеджер) И Объект.ОсновнойМенеджер.ПолучитьОбъект() = Неопределено Тогда
        Объект.ОсновнойМенеджер = Справочники.Пользователи.ПустаяСсылка();
        Изменено = Истина;
        Сообщить("Исправлена битая ссылка в контрагенте: " + Объект.Наименование);
    КонецЕсли;
    
    Если Изменено Тогда
        Объект.Записать();
    КонецЕсли;
КонецЦикла;

Важный момент: Чтобы ускорить запись, можно использовать пакетную обработку в одной транзакции. Разберем ситуацию: фиксировать транзакцию после каждого исправления накладно. Лучше объединять исправления в блоки по 1000 записей.

Решение 4: Оптимизация на уровне СУБД (для клиент-серверных баз)

Если процедура ТИИ запущена на SQL-сервере, замедление может быть связано с ростом файла лога транзакций (.ldf).

Проанализируем рекомендации для SQL-администратора:

Подведем итоги

Если ваше ТИИ «зависает» или потребляет всю память, не нужно ждать сутками. Выполните следующие действия:

  1. Прервите текущий процесс.
  2. Запустите ТИИ через командную строку с параметром /Out. Это решит проблему с памятью в 90% случаев.
  3. Если база все равно работает медленно, используйте программные обработки для точечной очистки битых ссылок в наиболее «замусоренных» таблицах.
  4. Для файловых баз попробуйте утилиту chdbfl.exe (в папке bin платформы) перед запуском ТИИ — она проверяет физическую целостность быстрее Конфигуратора.

Помните, что чистота базы — это залог её быстродействия. Регулярное проведение регламентных работ небольшими порциями (по отдельным объектам метаданных) позволит избежать многодневных простоев системы.

← На главную