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