Каждый специалист, занимающийся поддержкой и внедрением конфигураций на платформе «1С:Предприятие 8» (таких как «1С:Управление торговлей 11», «1С:Комплексная автоматизация 2» или «1С:ERP Управление предприятием»), рано или поздно сталкивается с проблемами при закрытии месяца. Одна из самых распространенных и труднодиагностируемых ошибок — появление суммовых остатков при нулевом количественном остатке в регистре себестоимости.
В этой статье мы подробно разберем, почему возникает эта ошибка, как провести ее глубокую диагностику и какими системными и программными методами можно ее решить раз и навсегда.
Прежде чем приступать к исправлению, давайте разберемся в физическом смысле происходящего. Ошибка означает, что на складе (в количественном выражении) товара больше нет — он был полностью списан продажами, списаниями или перемещениями. Однако в регистре накопления Себестоимость товаров по данному товару осталась «висеть» какая-то сумма (рублевая или валютная себестоимость, а в случае комиссионных товаров — забалансовая стоимость).
Почему система списывает количество, но «забывает» списать сумму? Выделим несколько ключевых причин:
Таможенная декларация на импорт (пошлины, сборы). Если товар продается в том же периоде, когда распределяются доп. расходы по ГТД, алгоритм расчета себестоимости в старых релизах может некорректно рассчитать сумму списания пошлины, оставив копейки или даже крупные суммы на остатке.Ключи аналитики учета номенклатуры) создаются системой автоматически. Если по какой-то причине (например, сбой при обновлении или некорректный перенос данных) для одного и того же товара на одном складе создалось два разных ключа, система может оприходовать товар на один ключ, а списать с другого.Рассмотрим подробнее, как локализовать и устранить эти расхождения.
Часто пользователи совершают ошибку, пытаясь анализировать проблему с помощью стандартного отчета Ведомость по товарам на складах. Этот отчет строится по регистру накопления Товары на складах, где учитывается только физическое количество. Там вы увидите красивый нулевой остаток, который ничем не поможет.
Для детальной диагностики нам понадобится Универсальный отчет. Разберем по шагам, как его настроить:
ОрганизацияРаздел учетаАналитика учета номенклатуры (внутри нее можно раскрыть поля Номенклатура, Склад)Вид запасовПартия (если используется партионный учет)Регистратор (детальные записи для поиска конкретного документа)Проанализируем полученную таблицу. Нам нужно найти строку, в которой конечный остаток по количеству равен нулю, а конечный остаток по сумме (или забалансовой стоимости) имеет ненулевое значение. По цепочке документов-регистраторов мы сразу увидим, какой именно документ (например, Реализация товаров и услуг или Списание товаров) провел списание количества без соразмерного списания стоимости.
Применим математическое правило проверки каждой строки движения:
Стоимость Конечный Остаток = Стоимость Начальный Остаток + Стоимость Приход - Стоимость Расход
В строке, где это равенство нарушается, и кроется первопричина сбоя.
В зависимости от масштаба проблемы и причин ее возникновения, мы можем применить несколько вариантов решения.
Простое перепроведение документов кнопкой «Провести» часто не дает результатов, так как система при обычном проведении пытается оптимизировать движения и использует уже ранее зафиксированные в табличной части Виды запасов данные. Чтобы заставить систему полностью очистить и перезаполнить виды запасов заново на основе актуальных остатков, необходимо использовать специальный флаг в дополнительных свойствах документа.
Для этого мы можем написать простую обработку. Разберем пример кода, который принудительно перезаполняет виды запасов и перепроводит документы за определенный период:
// Выбираем документы реализации за проблемный период
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода
| И РеализацияТоваровУслуг.Проведен = ИСТИНА";
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(Объект.ПериодРегистрации));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(Объект.ПериодРегистрации));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
// Вставляем специальное свойство, которое заставит систему пересчитать виды запасов
ДокОбъект.ДополнительныеСвойства.Вставить("ПерезаполнитьВидыЗапасов", Истина);
Попытка
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Успешно перепроведен: " + Строка(ДокОбъект));
Исключение
Сообщить("Ошибка проведения документа " + Строка(ДокОбъект) + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Этот способ позволяет автоматически выровнять цепочку партий и видов запасов «снизу вверх». После выполнения данной обработки необходимо запустить закрытие месяца заново.
Иногда система «зацикливается» на старых расчетах. Перед тем как запускать расчет себестоимости заново, рекомендуется полностью распровести или удалить предыдущие документы Расчет себестоимости товаров и Распределение расходов за текущий и последующие месяцы. Это гарантирует, что новые расчеты будут производиться на «чистую» базу данных и исключит влияние заблокированных регистров.
Если документов в базе слишком много, период старый, а перепроведение затрагивает множество смежных цепочек (что крайне нежелательно в рабочей базе), оптимальным выходом будет ручная точечная корректировка движений.
Проанализируем этот процесс на примере комиссионных товаров:
23:59:58, чтобы корректировка легла строго перед итоговым расчетом себестоимости).Стоимость, СтоимостьБезНДС или Забалансовая стоимость (для комиссионных товаров) вносим ту сумму, которая зависла на остатке.Для предотвращения подобных ошибок в будущем рекомендуется:
Применяя данные методики диагностики и исправления, мы сможем оперативно находить «виновников» расхождений и успешно закрывать месяц без ошибок в расчете себестоимости.