Разберем распространенную проблему в 1С, когда отчет «Ведомость товаров на складах» выводит отрицательный остаток по номенклатуре, хотя по реальным документам числится положительный приход, а при отмене проведения всех документов отрицательный остаток все равно сохраняется и отображается без документа-регистратора.
В платформе 1С данные регистра накопления остатков хранятся в двух связанных таблицах СУБД: физической таблице движений (самих записей документов) и таблице итогов (агрегированных рассчитанных остатков). При некорректном завершении сеанса, сбоях сети или ошибках обмена в РИБ (распределенной информационной базе) может произойти рассинхронизация таблицы итогов и таблицы движений.
В результате возникают следующие ситуации:
ТоварыНаСкладах продолжает висеть «залипшая» отрицательная запись.Рассмотрим пошаговые варианты диагностики и полного устранения данной ошибки.
Прежде чем выполнять технические процедуры, проанализируем реальные записи в базе данных. Виртуальная таблица ТоварыНаСкладах.Остатки показывает итоговое агрегированное значение и не содержит поля регистратора. Чтобы увидеть абсолютно все записи (включая фантомные или без регистратора), сделаем прямой запрос к основной таблице движений регистра накопления.
Выполним запрос следующего вида:
ВЫБРАТЬ
ТоварыНаСкладах.Период КАК Период,
ТоварыНаСкладах.Регистратор КАК Регистратор,
ТоварыНаСкладах.ВидДвижения КАК ВидДвижения,
ТоварыНаСкладах.Количество КАК Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
ГДЕ
ТоварыНаСкладах.Номенклатура = &Номенклатура
Если в результате запроса найдены строки с пустым регистратором или значением Объект не найден, значит, в базе присутствуют некорректные записи движений, не удаленные при распроведении документов.
Иногда отрицательные значения или некорректные группировки в отчете на Системе компоновки данных (СКД) обусловлены кэшированием схемы запроса или временных данных платформой. Очистим кэш сеанса 1С.
%AppData%\1C\1CEStart и %LocalAppData%\1C\1Cv8.Наиболее эффективным штатным методом исправления рассинхронизации таблиц движений и итогов является реструктуризация и пересчет итогов через Конфигуратор.
Процедура пересчета полностью удалит физическую таблицу итогов регистра ТоварыНаСкладах и сформирует ее заново исключительно на основании действительно существующих документов и движений.
Если базу нельзя монопольно заблокировать для полного тестирования, вызовем пересчет итогов конкретного регистра ТоварыНаСкладах программно с помощью внешней обработки или через консоль кода.
Рассмотрим пример кода для принудительного перестроения итогов конкретного регистра остатков:
// Отключаем использование итогов (очищает таблицу итогов)
РегистрыНакопления.ТоварыНаСкладах.УстановитьИспользованиеИтогов(Ложь);
// Включаем использование итогов обратно (принудительно пересчитывает итоги по движениям)
РегистрыНакопления.ТоварыНаСкладах.УстановитьИспользованиеИтогов(Истина);
// Выполняем явный пересчет итогов регистра
РегистрыНакопления.ТоварыНаСкладах.ПересчитатьИтоги();
После выполнения этого кода платформа перестроит агрегаты остатков, и фантомный отрицательный остаток исчезнет.
Если проблема возникла в периферийном узле РИБ, а в центральной базе остаток отображается корректно, причина кроется в рассинхронизации наборов записей при обмене. Для решения проделаем следующее:
ТоварыНаСкладах для узла периферийной базы с помощью вызова ПланыОбмена.ЗарегистрироватьИзменения().