Почему в отчете «Ведомость товаров» появляется отрицательный остаток при наличии документов прихода?

Программист 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

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

Причины возникновения «фантомных» отрицательных остатков

В платформе 1С данные регистра накопления остатков хранятся в двух связанных таблицах СУБД: физической таблице движений (самих записей документов) и таблице итогов (агрегированных рассчитанных остатков). При некорректном завершении сеанса, сбоях сети или ошибках обмена в РИБ (распределенной информационной базе) может произойти рассинхронизация таблицы итогов и таблицы движений.

В результате возникают следующие ситуации:

  1. Повреждение таблицы итогов: реальные документы движений отменены или отсутствуют, но в агрегированных итогах регистра ТоварыНаСкладах продолжает висеть «залипшая» отрицательная запись.
  2. «Битые» ссылки в движениях: документ-регистратор был помечен на удаление или не перенесся при обмене РИБ, из-за чего запись движения потеряла связь с регистратором (в запросах к остаткам она учитывается, но группировка по регистратору не может вывести документ).
  3. Сбой режима разделения итогов: при высоком параллелизме записи данные в параллельных таблицах итогов могут суммироваться некорректно до момента принудительного сворачивания.

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

Шаг 1. Проверка физических движений через прямой запрос

Прежде чем выполнять технические процедуры, проанализируем реальные записи в базе данных. Виртуальная таблица ТоварыНаСкладах.Остатки показывает итоговое агрегированное значение и не содержит поля регистратора. Чтобы увидеть абсолютно все записи (включая фантомные или без регистратора), сделаем прямой запрос к основной таблице движений регистра накопления.

Выполним запрос следующего вида:


ВЫБРАТЬ
	ТоварыНаСкладах.Период КАК Период,
	ТоварыНаСкладах.Регистратор КАК Регистратор,
	ТоварыНаСкладах.ВидДвижения КАК ВидДвижения,
	ТоварыНаСкладах.Количество КАК Количество
ИЗ
	РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
ГДЕ
	ТоварыНаСкладах.Номенклатура = &Номенклатура

Если в результате запроса найдены строки с пустым регистратором или значением Объект не найден, значит, в базе присутствуют некорректные записи движений, не удаленные при распроведении документов.

Шаг 2. Очистка локального кэша платформы

Иногда отрицательные значения или некорректные группировки в отчете на Системе компоновки данных (СКД) обусловлены кэшированием схемы запроса или временных данных платформой. Очистим кэш сеанса 1С.

  1. Завершим работу пользователя в 1С:Предприятии.
  2. Удалим информационную базу из списка запуска и добавим ее заново (при этом сбрасывается локальный кэш привязки каталога).
  3. Либо вручную очистим папки кэша пользователя в каталогах %AppData%\1C\1CEStart и %LocalAppData%\1C\1Cv8.

Шаг 3. Запуск тестирования и исправления (пересчет итогов)

Наиболее эффективным штатным методом исправления рассинхронизации таблиц движений и итогов является реструктуризация и пересчет итогов через Конфигуратор.

  1. Откроем информационную базу в режиме Конфигуратор.
  2. Сделаем резервную копию базы данных (меню Администрирование — Выгрузить информационную базу).
  3. Перейдем в меню Администрирование — Тестирование и исправление...
  4. Отметим флажками пункт Пересчет итогов и при необходимости Проверка логической целостности информационной базы.
  5. Нажмем кнопку Выполнить.

Процедура пересчета полностью удалит физическую таблицу итогов регистра ТоварыНаСкладах и сформирует ее заново исключительно на основании действительно существующих документов и движений.

Шаг 4. Программный сброс и пересчет итогов регистра

Если базу нельзя монопольно заблокировать для полного тестирования, вызовем пересчет итогов конкретного регистра ТоварыНаСкладах программно с помощью внешней обработки или через консоль кода.

Рассмотрим пример кода для принудительного перестроения итогов конкретного регистра остатков:


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

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

// Выполняем явный пересчет итогов регистра
РегистрыНакопления.ТоварыНаСкладах.ПересчитатьИтоги();

После выполнения этого кода платформа перестроит агрегаты остатков, и фантомный отрицательный остаток исчезнет.

Шаг 5. Исправление данных при работе в РИБ

Если проблема возникла в периферийном узле РИБ, а в центральной базе остаток отображается корректно, причина кроется в рассинхронизации наборов записей при обмене. Для решения проделаем следующее:

  1. Выполним пересчет итогов в центральной базе.
  2. Программно зарегистрируем изменения регистра накопления ТоварыНаСкладах для узла периферийной базы с помощью вызова ПланыОбмена.ЗарегистрироватьИзменения().
  3. Проведем полный сеанс обмена данными, чтобы актуальные наборы записей перезаписали таблицы в подчиненном узле.
← На главную