Каждый практикующий специалист или активный пользователь программы «1С:Управление нашей фирмой» (1С:УНФ) рано или поздно сталкивается с ситуацией, когда при проведении расходной накладной, акта списания или документа передачи на ответственное хранение система выдает досадную ошибку: «Не хватает остатка по учету запасов и затрат на складе». При этом пользователь открывает стандартные складские отчеты, видит там достаточный (а иногда и избыточный) остаток товара, но документ все равно упорно отказывается проводиться. Давайте детально разберем, почему возникает этот сбой, как провести точную диагностику системы и какими способами можно оперативно исправить ситуацию.
Чаще всего подобная коллизия возникает после того, как в базе данных было произведено групповое изменение реквизитов номенклатуры (в частности, менялись счета учета запасов или затрат). Рассмотрим внутреннюю механику работы конфигурации, чтобы понять физику процесса:
Запасы (в некоторых версиях — Запасы и затраты). При этом в регистр записывается не только количество и склад, но и ключевое измерение — СчетУчета. Он подтягивается из карточки номенклатуры на момент проведения документа прихода.Запасы при этом остаются неизменными. Весь ранее оприходованный товар продолжает числиться на старом счете учета.Стандартные отчеты по складу часто группируют данные только по полям «Номенклатура» и «Структурная единица» (склад), полностью игнорируя разрезы счетов учета. Именно поэтому визуально в отчете товар есть, а для проведения документа — его нет.
Прежде чем предпринимать какие-либо действия по исправлению данных, нам необходимо локализовать ошибку и убедиться, что причина действительно в расхождении счетов учета. Для этого воспользуемся встроенным инструментом системы.
Выполним следующие шаги по настройке отчета:
Счет учета (оно должно находиться в иерархии рядом с номенклатурой и складом).Проанализируем ситуацию по результатам сформированного отчета. Если мы видим картину, при которой на одном счете учета (например, «Сырье») висит положительный остаток прихода, а по другому счету учета (например, «Товары») идет попытка расхода, то диагноз подтвержден. У нас произошел классический «разрыв» аналитики.
Если документов за отчетный период относительно немного, а сам период открыт для редактирования и исправления, самым правильным и методологически чистым решением будет последовательное восстановление хронологии проведения.
Разберем этот процесс по шагам:
Запасы уже новый счет учета из карточки товара), а затем — расходный документ.Важное предупреждение: этот способ не подходит, если документы находятся в закрытом периоде, так как перепроведение может повлечь за собой изменение себестоимости, финансовых результатов и искажение уже сданной регламентированной отчетности.
Для программистов и опытных администраторов баз данных существует более элегантный способ решения проблемы. Мы можем скорректировать счета учета непосредственно в движениях документов прихода без изменения дат их проведения и без перезаписи себестоимости.
Для этого можно создать внешнюю обработку и выполнить в ней следующий код, который найдет все нестыковки в регистре накопления Запасы и перезапишет движения в соответствии с актуальными счетами учета из карточек номенклатуры:
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Т.Регистратор КАК Регистратор,
| Т.Период КАК Период
|ИЗ
| РегистрНакопления.Запасы КАК Т
|ГДЕ
| Т.Номенклатура.СчетУчетаЗапасов <> Т.СчетУчета
|УПОРЯДОЧИТЬ ПО
| Т.Период");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НаборЗаписей = РегистрыНакопления.Запасы.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = Выборка.Регистратор;
НаборЗаписей.Прочитать();
Модифицирован = Ложь;
Для Каждого Запись Из НаборЗаписей Цикл
Если Запись.СчетУчета <> Запись.Номенклатура.СчетУчетаЗапасов Тогда
Запись.СчетУчета = Запись.Номенклатура.СчетУчетаЗапасов;
Модифицирован = Истина;
КонецЕсли;
КонецЦикла;
Если Модифицирован Тогда
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
КонецЕсли;
КонецЦикла;
Проанализируем работу этого алгоритма. Программа выбирает только те записи регистра Запасы, в которых текущее значение измерения СчетУчета не совпадает с реквизитом СчетУчетаЗапасов в карточке соответствующей номенклатуры. Затем для каждого такого регистратора создается набор записей, счета учета обновляются, и набор записывается в режиме ОбменДанными.Загрузка = Истина. Это позволяет избежать запуска тяжелых стандартных подписок на события и проведения дополнительных проверок конфигурации, что гарантирует высокую скорость работы скрипта.
Обратите внимание: если в вашей информационной базе ведется полноценный управленческий или бухгалтерский учет, аналогичные расхождения могут возникнуть и в регистре бухгалтерии (управленческом). В таком случае потребуется аналогичным образом скорректировать и его проводки.
Если проблему нужно решить экстренно (например, клиенту уезжает машина с товаром, а документы не проводятся), можно временно деактивировать контроль остатков в системе.
Для этого выполним следующие действия:
Важно понимать, что этот способ является лишь «тушением пожара». Он не решает проблему, а лишь откладывает ее решение, создавая пересортицу по счетам учета в базе данных, которую все равно придется исправлять методами, описанными в первых двух способах.
Чтобы избежать подобных сложностей при дальнейшей работе в 1С:УНФ, рекомендуем придерживаться простых правил ведения учета:
Применяя эти несложные рекомендации и понимая внутреннее устройство регистров 1С, вы сможете эффективно диагностировать и решать любые возникающие проблемы с проведением документов.