Что делать, если тестирование и исправление 1С на PostgreSQL «зависает» или показывает более 100% прогресса?

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

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

Проанализируем причины возникновения «бесконечного» тестирования

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

  1. Несовместимость версий: Современные релизы платформы (начиная с 8.3.18 и выше) ориентированы на работу с актуальными версиями PostgreSQL (11, 12, 13 и выше). Использование устаревших версий СУБД (например, 9.3 или 9.4) приводит к некорректной обработке временных таблиц и индексов.
  2. Неявные дубли в итогах: Из-за различий в параметрах Collation (сортировки) в PostgreSQL могут возникнуть записи, которые платформа считает одинаковыми, а СУБД — разными. При попытке исправить логическую целостность ТиИ входит в рекурсию, пытаясь пересчитать итоги по конфликтующим записям.
  3. «Битые» итоги (Totals): Таблицы итогов регистров накопления (имена которых начинаются с _AccumRegTotals) могут содержать некорректные даты (например, 0001-01-01 или значения из далекого будущего).
  4. Накопление «мертвых» строк: В PostgreSQL механизм MVCC оставляет старые версии строк. Если Autovacuum настроен агрессивно или, наоборот, не справляется, объем таблицы итогов может вырасти в десятки раз, что замедляет сканирование до критических значений.

Решение 1: Обновление технологического стека СУБД

Первым делом проанализируем версию вашей СУБД. Если используется PostgreSQL 9.x, это основной кандидат на роль виновника. Платформа 8.3.19 и выше ожидает от СУБД поддержки современных механизмов оптимизации запросов. Рассмотрим алгоритм миграции на новую версию:

  1. Выполним полную выгрузку информационной базы в файл .dt. Если база слишком велика и выгрузка не проходит, этот метод придется пропустить и использовать миграцию на уровне SQL.
  2. Установим актуальную версию PostgreSQL (например, версию 12 или 13, адаптированную для 1С от компаний Postgres Professional или Ethersoft).
  3. Создадим новую пустую базу данных с корректными настройками локали (обычно Russian_Russia.1251).
  4. Загрузим данные из .dt или выполним переливку таблиц.

Важно: При переходе на 13-ю версию PostgreSQL учитывайте, что формат B-tree индексов изменился. После загрузки данных обязательно выполните команду REINDEX DATABASE.

Решение 2: Глубокая очистка СУБД средствами SQL

Если ТиИ зависает на логической проверке, попробуем подготовить базу на уровне СУБД. Выполним «жесткую» очистку и переиндексацию, чтобы исключить влияние физических повреждений таблиц. Рассмотрим последовательность команд в консоли pgAdmin или psql:

Сначала выполним полную очистку базы от «фантомных» записей и обновим статистику планировщика:


VACUUM FULL ANALYZE;
REINDEX DATABASE имя_вашей_базы;

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

Решение 3: Миграция данных через механизм РИБ без начального образа

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

  1. Создадим новую пустую базу с той же самой конфигурацией.
  2. В исходной (рабочей) базе настроим узел обмена. Объявим рабочую базу — Главным узлом, а новую — Периферийным.
  3. Не будем создавать начальный образ (это долго и может привести к той же ошибке). Вместо этого в периферийной базе также настроим узлы обмена вручную, чтобы их коды совпадали с кодами в главной базе.
  4. Выполним синхронизацию конфигураций. Убедимся, что идентификаторы объектов идентичны.
  5. Зарегистрируем данные к обмену порционно. Не стоит пытаться передать 30 Гб за один раз. Начнем со справочников, затем перейдем к документам и, в последнюю очередь, к регистрам накопления.

Этот метод хорош тем, что при записи данных в новую базу 1С автоматически пересчитывает итоги «с нуля», не опираясь на старые (возможно, битые) таблицы итогов _AccumRegTotals.

Решение 4: Использование внешних обработок для очистки регистров

Если мы точно знаем, какой регистр вызывает проблему (например, ТоварыВНТТ), проанализируем возможность его очистки через XML. Рассмотрим этот вариант подробнее:

Воспользуемся стандартной обработкой ВыгрузкаЗагрузкаДанныхXML.epf. Она работает на уровне объектов и игнорирует многие ошибки физического уровня таблиц. Порядок действий следующий:

  1. Выгружаем данные проблемного регистра в XML-файл.
  2. Программно очищаем регистр в базе данных. Для этого можно использовать простой код:
    
    Набор = РегистрыНакопления.ИмяПроблемногоРегистра.СоздатьНаборЗаписей();
    Набор.Записать(); // Записываем пустой набор, что фактически очищает данные
    
  3. Запускаем ТиИ (логическую целостность). На пустом регистре проверка пройдет мгновенно.
  4. Загружаем данные обратно из XML. При загрузке платформа заново сформирует все движения и итоги.

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

Ситуация, когда ТиИ показывает более 100%, — это явный сигнал о несоответствии метаданных 1С и физических таблиц PostgreSQL. Мы рассмотрели несколько путей: от простого обслуживания СУБД командами VACUUM и REINDEX до радикальной миграции данных через РИБ или XML. Помните, что перед любыми манипуляциями с таблицами итогов или версиями СУБД создание резервной копии на уровне файловой системы или снимка виртуальной машины является обязательным условием безопасности ваших данных.

← На главную