Как убрать битые ссылки из виртуальных таблиц остатков регистра накопления, если пересчет итогов не помогает?

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

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

Проанализируем механику хранения итогов

Для начала разберем, как 1С хранит данные. Регистры накопления остатков состоят из двух основных физических таблиц в базе данных SQL:

  1. Таблица движений (_AccumReg[N]) — здесь хранятся все записи, которые создают документы-регистраторы.
  2. Таблица итогов (_AccumRegTotals[N]) — здесь хранятся рассчитанные остатки на начало каждого месяца.

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

Решение 1. Программный сброс и жесткое перевключение итогов

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

Суть метода заключается в том, чтобы заставить систему физически очистить таблицу _AccumRegTotals и заполнить её заново с нуля. Выясним, как это сделать с помощью кода:


// Создадим небольшую внешнюю обработку и выполним следующий код
РегистрНабор = РегистрыНакопления.РасчетыСКлиентами;
// Полностью отключаем использование итогов. 
// В этот момент 1С физически удаляет данные из таблицы _AccumRegTotals[Номер]
РегистрНабор.УстановитьИспользованиеИтогов(Ложь);

// Снова включаем итоги. 
// Система начнет полное сканирование таблицы движений и заново сформирует итоги
РегистрНабор.УстановитьИспользованиеИтогов(Истина);

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

Решение 2. Проверка специфики УТ 11.4: Объекты расчетов

Разберем ситуацию, характерную для конфигураций на базе ERP и УТ 11. В этих программах расчеты ведутся не просто по документам, а в разрезе справочника ОбъектыРасчетов. Часто битая ссылка — это не удаленный документ-регистратор, а удаленный элемент этого вспомогательного справочника.

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


ВЫБРАТЬ
    Реестр.Период,
    Реестр.Регистратор,
    Реестр.ОбъектРасчетов
ИЗ
    РегистрНакопления.РасчетыСКлиентами КАК Реестр
ГДЕ
    Реестр.ОбъектРасчетов.Ссылка ЕСТЬ NULL
    И НЕ Реестр.ОбъектРасчетов = ЗНАЧЕНИЕ(Справочник.ОбъектыРасчетов.ПустаяСсылка)

Если запрос вернет строки, значит, в физической таблице все же есть записи с битыми ссылками в измерениях. В таком случае поможет стандартное ТиИ с опцией «Очищать ссылки» (а не «Создавать объекты»).

Решение 3. Особенности режима «Расчеты онлайн»

Проанализируем современный механизм онлайн-взаиморасчетов. В УТ 11.4 данные в отчеты могут попадать не напрямую из регистров накопления, а через дополнительные регистры сведений, которые выполняют роль «очереди». Если включен режим «Онлайн», проверьте следующие моменты:

Решение 4. Работа с разделителем итогов

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

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

Решение 5. Радикальная очистка через SQL (для клиент-серверного варианта)

Рассмотрим крайний случай: если программное перевключение итогов из встроенного языка не помогло. Иногда в SQL-таблице _AccumRegTotals остаются записи, которые 1С считает «валидными» на уровне платформы, но «битыми» на уровне метаданных. Посмотрим на алгоритм действий системного администратора:

  1. Определите имя таблицы итогов для регистра (например, через консоль запросов или обработку «Структура хранения данных»). Допустим, это _AccumRegTotals123.
  2. В консоли SQL Management Studio выполните команду: TRUNCATE TABLE _AccumRegTotals123. Внимание! Это полностью очистит все текущие итоги регистра.
  3. Сразу после этого в Конфигураторе 1С запустите «Тестирование и исправление» -> «Пересчет итогов».

Этот метод гарантирует, что в таблице итогов не останется ни одной старой записи, и все данные будут перенесены из физической таблицы движений (которая, как мы выяснили, чиста).

Итоги и рекомендации

Мы проанализировали основные причины появления битых ссылок в виртуальных таблицах. Чаще всего проблема решается программным выключением и включением итогов через метод УстановитьИспользованиеИтогов(Ложь). Если это не помогает, следует искать проблему в измерении ОбъектРасчетов или в механизме фоновых заданий онлайн-расчетов УТ 11.4.

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

← На главную