При оформлении складских операций (например, перемещения или реализации) пользователи могут столкнуться с ситуацией, когда проведение документа блокируется ошибкой контроля остатков. В сообщении системы указывается, что требуемого количества товара нет в наличии, а свободный остаток принимает отрицательное значение (например, -1), хотя по стандартным отчетам движения товаров и партиям на складе числится положительный остаток, а резервы отсутствуют.
Разберем причины возникновения подобной ошибки, методы локализации проблемы с помощью отладчика и консоли запросов, а также способы исправления итогов регистров накопления.
В большинстве конфигураций 1С контроль доступного количества при проведении документов и при подборе номенклатуры обращается к виртуальным таблицам остатков регистров накопления. Рассмотрим типовой запрос контроля остатков, выполняемый при проведении документа:
ВЫБРАТЬ
ТаблицаТоваров.Номенклатура,
ТаблицаТоваров.ХарактеристикаНоменклатуры,
СУММА(ТаблицаТоваров.Количество) КАК КоличествоДок,
МАКСИМУМ(ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0)) КАК КоличествоОст,
МАКСИМУМ(ЕСТЬNULL(РегРезервы.КоличествоОстаток, 0)) КАК КоличествоРезерв
ИЗ
ТаблицаТоваров
ЛЕВОЕ СОЕДИНЕНИЕ
(ВЫБРАТЬ
Таб.Номенклатура,
Таб.ХарактеристикаНоменклатуры,
Таб.КоличествоОстаток
ИЗ
РегистрНакопления.ОстаткиНоменклатуры.Остатки(&Дата, Фирма = &Фирма И Склад = &Склад И Номенклатура В (ВЫБРАТЬ РАЗЛИЧНЫЕ ТаблицаТоваров.Номенклатура ИЗ ТаблицаТоваров)) КАК Таб) КАК ОстаткиНоменклатурыОстатки
ПО ТаблицаТоваров.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
И ТаблицаТоваров.ХарактеристикаНоменклатуры = ОстаткиНоменклатурыОстатки.ХарактеристикаНоменклатуры
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрНакопления.РезервыНоменклатуры.Остатки(&Дата, Фирма = &Фирма И Склад = &Склад И Номенклатура В (ВЫБРАТЬ РАЗЛИЧНЫЕ ТаблицаТоваров.Номенклатура ИЗ ТаблицаТоваров)) КАК РегРезервы
ПО ТаблицаТоваров.Номенклатура = РегРезервы.Номенклатура
И ТаблицаТоваров.ХарактеристикаНоменклатуры = РегРезервы.ХарактеристикаНоменклатуры
СГРУППИРОВАТЬ ПО
ТаблицаТоваров.Номенклатура,
ТаблицаТоваров.ХарактеристикаНоменклатуры
Если отчет по движениям (обороты) строится корректно, а виртуальная таблица Остатки() возвращает некорректные или отрицательные данные, это свидетельствует о расхождении между фактическими записями движений и таблицей агрегированных итогов регистра.
В платформе 1С данные регистра накопления хранятся в двух физических таблицах СУБД: таблице движений и таблице итогов. Расхождения между ними могут возникать в следующих случаях:
rphost, разрыв соединения с СУБД или сбои питания в момент фиксации транзакции проведения документа.Для устранения расхождения необходимо выполнить актуализацию и пересчет итогов регистров накопления. Рассмотрим доступные варианты решения задачи.
Для исправления проблемы без остановки работы пользователей можно использовать штатные механизмы управления итогами:
Если требуется исправить только проблемный регистр через внешнюю обработку или консоль кода, используем методы менеджера регистров накопления:
// Пересчет итогов по конкретному регистру накопления
РегистрыНакопления.ОстаткиНоменклатуры.ПересчитатьИтоги();
// Установка актуальной границы рассчитанных итогов
РегистрыНакопления.УстановитьПериодРассчитанныхИтогов(КонецМесяца(ТекущаяДата()));
Метод ПересчитатьИтоги() полностью восстанавливает агрегированные таблицы выбранного регистра на основе фактических записей таблицы движений.
В случаях, когда есть возможность получить монопольный доступ к базе данных, пересчет выполняется средствами конфигуратора:
После завершения пересчета итогов виртуальные таблицы остатков синхронизируются с реальными движениями документов, и контроль остатков позволит провести документ без ложных ошибок о нехватке товара.