Как исправить ошибку «Не хватает остатка по учету запасов и затрат на складе» в 1С:УНФ?

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

Каждый практикующий специалист или активный пользователь программы «1С:Управление нашей фирмой» (1С:УНФ) рано или поздно сталкивается с ситуацией, когда при проведении расходной накладной, акта списания или документа передачи на ответственное хранение система выдает досадную ошибку: «Не хватает остатка по учету запасов и затрат на складе». При этом пользователь открывает стандартные складские отчеты, видит там достаточный (а иногда и избыточный) остаток товара, но документ все равно упорно отказывается проводиться. Давайте детально разберем, почему возникает этот сбой, как провести точную диагностику системы и какими способами можно оперативно исправить ситуацию.

Выясняем причину: в чем кроется корень проблемы?

Чаще всего подобная коллизия возникает после того, как в базе данных было произведено групповое изменение реквизитов номенклатуры (в частности, менялись счета учета запасов или затрат). Рассмотрим внутреннюю механику работы конфигурации, чтобы понять физику процесса:

  1. Когда мы приходуем товар на склад (документами «Приходная накладная», «Оприходование запасов» и др.), программа делает записи в регистр накопления Запасы (в некоторых версиях — Запасы и затраты). При этом в регистр записывается не только количество и склад, но и ключевое измерение — СчетУчета. Он подтягивается из карточки номенклатуры на момент проведения документа прихода.
  2. Если позже мы решаем изменить счет учета в карточке номенклатуры (например, с «Сырье и материалы» на «Товары, продукция») вручную или с помощью обработки «Групповое изменение реквизитов», эти изменения записываются только в сам справочник номенклатуры.
  3. Исторические движения в регистре Запасы при этом остаются неизменными. Весь ранее оприходованный товар продолжает числиться на старом счете учета.
  4. При проведении расходного документа (например, «Расходная накладная») система обращается к карточке товара, видит там новый счет учета и пытается списать товар именно по нему. Программа заглядывает в регистр накопления, но видит по новому счету учета нулевой остаток. Результат — блокировка проведения и сообщение об ошибке.

Стандартные отчеты по складу часто группируют данные только по полям «Номенклатура» и «Структурная единица» (склад), полностью игнорируя разрезы счетов учета. Именно поэтому визуально в отчете товар есть, а для проведения документа — его нет.

Шаг 1. Диагностика проблемы с помощью Универсального отчета

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

Выполним следующие шаги по настройке отчета:

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

Проанализируем ситуацию по результатам сформированного отчета. Если мы видим картину, при которой на одном счете учета (например, «Сырье») висит положительный остаток прихода, а по другому счету учета (например, «Товары») идет попытка расхода, то диагноз подтвержден. У нас произошел классический «разрыв» аналитики.

Способ 1. Последовательное перепроведение документов (штатный метод)

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

Разберем этот процесс по шагам:

  1. Найдем все документы, которые делали движения по данной номенклатуре за проблемный период.
  2. Распроведем (отменим проведение) для всех расходных документов по этой позиции (накладные, списания, сборки).
  3. Затем распроведем все приходные документы (приходные накладные, оприходования), которыми этот товар вводился на склад.
  4. Последовательно начнем проводить их заново в строгом хронологическом порядке: сначала приходный документ (он автоматически запишет в регистр Запасы уже новый счет учета из карточки товара), а затем — расходный документ.

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

Способ 2. Программное исправление записей регистра накопления (без перепроведения)

Для программистов и опытных администраторов баз данных существует более элегантный способ решения проблемы. Мы можем скорректировать счета учета непосредственно в движениях документов прихода без изменения дат их проведения и без перезаписи себестоимости.

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


Запрос = Новый Запрос(
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |   Т.Регистратор КАК Регистратор,
    |   Т.Период КАК Период
    |ИЗ
    |   РегистрНакопления.Запасы КАК Т
    |ГДЕ
    |   Т.Номенклатура.СчетУчетаЗапасов <> Т.СчетУчета
    |УПОРЯДОЧИТЬ ПО
    |   Т.Период");

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    НаборЗаписей = РегистрыНакопления.Запасы.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Значение = Выборка.Регистратор;
    НаборЗаписей.Прочитать();
    
    Модифицирован = Ложь;
    Для Каждого Запись Из НаборЗаписей Цикл
        Если Запись.СчетУчета <> Запись.Номенклатура.СчетУчетаЗапасов Тогда
            Запись.СчетУчета = Запись.Номенклатура.СчетУчетаЗапасов;
            Модифицирован = Истина;
        КонецЕсли;
    КонецЦикла;
    
    Если Модифицирован Тогда
        НаборЗаписей.ОбменДанными.Загрузка = Истина;
        НаборЗаписей.Записать();
    КонецЕсли;
КонецЦикла;

Проанализируем работу этого алгоритма. Программа выбирает только те записи регистра Запасы, в которых текущее значение измерения СчетУчета не совпадает с реквизитом СчетУчетаЗапасов в карточке соответствующей номенклатуры. Затем для каждого такого регистратора создается набор записей, счета учета обновляются, и набор записывается в режиме ОбменДанными.Загрузка = Истина. Это позволяет избежать запуска тяжелых стандартных подписок на события и проведения дополнительных проверок конфигурации, что гарантирует высокую скорость работы скрипта.

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

Способ 3. Временное отключение контроля остатков

Если проблему нужно решить экстренно (например, клиенту уезжает машина с товаром, а документы не проводятся), можно временно деактивировать контроль остатков в системе.

Для этого выполним следующие действия:

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

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

Как не допускать подобных ошибок в будущем?

Чтобы избежать подобных сложностей при дальнейшей работе в 1С:УНФ, рекомендуем придерживаться простых правил ведения учета:

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

← На главную