В практике администрирования 1С встречается коварная проблема: в отчетах (например, в «Сверке взаиморасчетов» или «Ведомости по расчетам с клиентами») появляются «битые ссылки» (строки вида <Объект не найден>...), которые искажают итоговое сальдо. При этом, если мы попытаемся найти эти ссылки в основной таблице движений регистра, их там не окажется. Проблема локализована исключительно в виртуальных таблицах остатков. Рассмотрим подробно, почему это происходит и как очистить базу от подобных «фантомных» записей.
Для начала разберем, как 1С хранит данные. Регистры накопления остатков состоят из двух основных физических таблиц в базе данных SQL:
_AccumReg[N]) — здесь хранятся все записи, которые создают документы-регистраторы._AccumRegTotals[N]) — здесь хранятся рассчитанные остатки на начало каждого месяца.Виртуальная таблица Остатки формируется системой динамически: она берет ближайшие рассчитанные итоги из таблицы _AccumRegTotals и прибавляет к ним движения из основной таблицы за период от точки итогов до текущего момента. Если в таблице итогов «зависла» запись, на которую нет соответствующего движения (например, из-за программного удаления объекта или сбоя транзакции СУБД), мы получим битую ссылку в виртуальной таблице при «чистой» основной таблице.
Стандартный механизм «Тестирование и исправление» (ТиИ) с галочкой «Пересчет итогов» не всегда эффективен, так как он может пытаться оптимизировать существующие записи, не удаляя те, которые он «не видит» в основной таблице. Проанализируем более радикальный, но безопасный метод — программное управление итогами.
Суть метода заключается в том, чтобы заставить систему физически очистить таблицу _AccumRegTotals и заполнить её заново с нуля. Выясним, как это сделать с помощью кода:
// Создадим небольшую внешнюю обработку и выполним следующий код
РегистрНабор = РегистрыНакопления.РасчетыСКлиентами;
// Полностью отключаем использование итогов.
// В этот момент 1С физически удаляет данные из таблицы _AccumRegTotals[Номер]
РегистрНабор.УстановитьИспользованиеИтогов(Ложь);
// Снова включаем итоги.
// Система начнет полное сканирование таблицы движений и заново сформирует итоги
РегистрНабор.УстановитьИспользованиеИтогов(Истина);
Важно помнить, что на больших базах эта операция может занять значительное время, так как системе придется пересчитать все остатки за всю историю ведения учета. Процедуру следует запускать в монопольном режиме.
Разберем ситуацию, характерную для конфигураций на базе ERP и УТ 11. В этих программах расчеты ведутся не просто по документам, а в разрезе справочника ОбъектыРасчетов. Часто битая ссылка — это не удаленный документ-регистратор, а удаленный элемент этого вспомогательного справочника.
Даже если в регистре РасчетыСКлиентами поле Регистратор заполнено корректно, измерение ОбъектРасчетов может содержать ссылку на несуществующий элемент. Посмотрим, как это проверить. Нам нужно выполнить запрос не к виртуальной, а к физической таблице движений, чтобы убедиться в чистоте данных:
ВЫБРАТЬ
Реестр.Период,
Реестр.Регистратор,
Реестр.ОбъектРасчетов
ИЗ
РегистрНакопления.РасчетыСКлиентами КАК Реестр
ГДЕ
Реестр.ОбъектРасчетов.Ссылка ЕСТЬ NULL
И НЕ Реестр.ОбъектРасчетов = ЗНАЧЕНИЕ(Справочник.ОбъектыРасчетов.ПустаяСсылка)
Если запрос вернет строки, значит, в физической таблице все же есть записи с битыми ссылками в измерениях. В таком случае поможет стандартное ТиИ с опцией «Очищать ссылки» (а не «Создавать объекты»).
Проанализируем современный механизм онлайн-взаиморасчетов. В УТ 11.4 данные в отчеты могут попадать не напрямую из регистров накопления, а через дополнительные регистры сведений, которые выполняют роль «очереди». Если включен режим «Онлайн», проверьте следующие моменты:
ЗаданияКРаспределениюРасчетов. Если в нем есть записи, система может выдавать неактуальные данные в отчетах.Выясним причину, связанную с механизмом разделения итогов. Для повышения производительности 1С может хранить итоги в нескольких «слоях» (таблица _AccumRegProps). Если в одном из слоев зависла запись с битой ссылкой, обычный пересчет может её проигнорировать.
В этом случае при запуске «Тестирования и исправления» обязательно выберите пункт «Сжатие таблиц итогов». Эта операция схлопывает разделители и удаляет записи с нулевыми значениями, что часто помогает убрать «фантомные» копейки и битые ссылки, которые не видны обычным запросом.
Рассмотрим крайний случай: если программное перевключение итогов из встроенного языка не помогло. Иногда в SQL-таблице _AccumRegTotals остаются записи, которые 1С считает «валидными» на уровне платформы, но «битыми» на уровне метаданных. Посмотрим на алгоритм действий системного администратора:
_AccumRegTotals123.TRUNCATE TABLE _AccumRegTotals123. Внимание! Это полностью очистит все текущие итоги регистра.Этот метод гарантирует, что в таблице итогов не останется ни одной старой записи, и все данные будут перенесены из физической таблицы движений (которая, как мы выяснили, чиста).
Мы проанализировали основные причины появления битых ссылок в виртуальных таблицах. Чаще всего проблема решается программным выключением и включением итогов через метод УстановитьИспользованиеИтогов(Ложь). Если это не помогает, следует искать проблему в измерении ОбъектРасчетов или в механизме фоновых заданий онлайн-расчетов УТ 11.4.
При выполнении любых манипуляций с таблицами итогов всегда делайте резервную копию базы данных и проводите работы в периоды минимальной активности пользователей.