Почему при проведении документа в 1С возникает ошибка нехватки товара при наличии остатка?

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

При оформлении складских операций (например, перемещения или реализации) пользователи могут столкнуться с ситуацией, когда проведение документа блокируется ошибкой контроля остатков. В сообщении системы указывается, что требуемого количества товара нет в наличии, а свободный остаток принимает отрицательное значение (например, -1), хотя по стандартным отчетам движения товаров и партиям на складе числится положительный остаток, а резервы отсутствуют.

Разберем причины возникновения подобной ошибки, методы локализации проблемы с помощью отладчика и консоли запросов, а также способы исправления итогов регистров накопления.

Диагностика проблемы: анализ механизма контроля остатков

В большинстве конфигураций 1С контроль доступного количества при проведении документов и при подборе номенклатуры обращается к виртуальным таблицам остатков регистров накопления. Рассмотрим типовой запрос контроля остатков, выполняемый при проведении документа:


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

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

Причины рассинхронизации итогов регистра накопления

В платформе 1С данные регистра накопления хранятся в двух физических таблицах СУБД: таблице движений и таблице итогов. Расхождения между ними могут возникать в следующих случаях:

  1. Сбои транзакций: аварийная перезагрузка рабочего процесса сервера rphost, разрыв соединения с СУБД или сбои питания в момент фиксации транзакции проведения документа.
  2. Коллизии обмена данными (РИБ): ошибки объединения пакетов изменений при распределенной информационной базе при интенсивной одновременной записи в узлах.
  3. Неактуальная граница рассчитанных итогов: отставание периода рассчитанных итогов от текущей даты, из-за чего срез остатков вычисляется платформой динамически с погрешностями.

Способы исправления ошибки и пересчета итогов

Для устранения расхождения необходимо выполнить актуализацию и пересчет итогов регистров накопления. Рассмотрим доступные варианты решения задачи.

Вариант 1. Пересчет итогов в режиме «1С:Предприятие» (без монопольного режима)

Для исправления проблемы без остановки работы пользователей можно использовать штатные механизмы управления итогами:

  1. Откроем пункт меню «Все функции» (или «Функции для технического специалиста»).
  2. Перейдем в раздел «Стандартные» и выберем обработку «Управление итогами».
  3. Установим период рассчитанных итогов на будущую дату (например, конец текущего месяца) и нажмем «Установить».
  4. Выполним команду пересчета итогов по всем или выбранным регистрам.

Вариант 2. Программный пересчет для конкретного регистра

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


// Пересчет итогов по конкретному регистру накопления
РегистрыНакопления.ОстаткиНоменклатуры.ПересчитатьИтоги();

// Установка актуальной границы рассчитанных итогов
РегистрыНакопления.УстановитьПериодРассчитанныхИтогов(КонецМесяца(ТекущаяДата()));

Метод ПересчитатьИтоги() полностью восстанавливает агрегированные таблицы выбранного регистра на основе фактических записей таблицы движений.

Вариант 3. Тестирование и исправление в Конфигураторе

В случаях, когда есть возможность получить монопольный доступ к базе данных, пересчет выполняется средствами конфигуратора:

  1. Создадим резервную копию информационной базы.
  2. Запустим информационную базу в режиме Конфигуратор.
  3. Откроем меню «Администрирование» → «Тестирование и исправление...».
  4. Установим единственный флаг «Пересчет итогов» и запустим выполнение процесса.

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

← На главную