Почему в 1С:Бухгалтерия 3.0 возникают отрицательные остатки в регистре Расходы при УСН при зачете ЕНС и как это исправить

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

При работе в конфигурации 1С:Бухгалтерия предприятия 3.0 (начиная с релизов ветки 3.0.139) многие пользователи и технические специалисты столкнулись с критической проблемой: после выполнения регламентной операции закрытия месяца "Зачет аванса по единому налоговому счету" регистр накопления Расходы при УСН некорректно уходит в минус. Это ведет к искажению Книги учета доходов и расходов (КУДиР) и неправильному расчету налога.

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

Суть проблемы: технический анализ ошибки

Проблема локализована в модуле НалоговыйУчетУСН, в процедуре ОплатаПрочееУСН. Давайте разберем алгоритм работы системы при закрытии месяца. Программа выполняет зачет авансов по Единому налоговому счету (ЕНС), формируя движения по регистру РасчетыПоНалогамНаЕдиномНалоговомСчете. В рамках одной регламентной операции может быть несколько строк оплаты, которые относятся к разным платежным документам или налогам, но выполняются в рамках одного "момента времени".

Рассмотрим фрагмент кода, который вызывает сбой. В цикле по таблице оплат программа пытается определить, какие расходы в регистре Расходы при УСН можно закрыть этой оплатой. Для этого вызывается функция ВыполнитьЗапросПоРасходам:


// Фрагмент из модуля НалоговыйУчетУСН
ТаблицаРасходов = ВыполнитьЗапросПоРасходам(Новый Граница(МоментДокумента, ВидГраницы.Включая), СтруктураШапкиДокумента.Организация, ТаблицаФильтров);

Проанализируем ситуацию: если в документе "Регламентная операция" есть три строки с суммами оплаты, программа трижды зайдет в этот цикл. На каждой итерации она выполняет запрос к базе данных, чтобы получить остатки. Однако, поскольку запись движений самого документа происходит после завершения всех расчетов в процедуре ОтразитьВУСН, база данных на каждой итерации выдает одни и те же остатки. Программа "не видит", что первая сумма уже "забронировала" часть остатка, и вторая сумма снова пытается списать тот же самый остаток. В итоге происходит кратное списание одной и той же суммы, и регистр уходит в минус.

Влияние аналитики Отражение в НУ и данных из ЗУП

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

Когда в документе "Отражение зарплаты в бухучете" все суммы имеют статус "Принимается", остатка в регистре Расходы при УСН обычно достаточно, чтобы перекрыть ошибки округления или мелкие повторы. Но как только появляется разделение на "принимаемые" и "непринимаемые" расходы, запрос остатков по конкретным аналитикам (статусам) начинает выдавать некорректные данные из-за описанного выше эффекта "зависшей границы". В этом случае программа ошибочно распределяет оплату ЕНС на те партии расходов, которые уже были фактически погашены предыдущей строкой в том же цикле.

Разбор программного кода в цикле обработки

Посмотрим на структуру кода, которая отвечает за распределение платежей по ЕНС. Проблема заключается в том, что вызов ОплатаПрочееУСН происходит внутри цикла по платежным документам:


Для Каждого ПлатежныйДокумент Из ПлатежныеДокументы Цикл
    
    ТаблицаПогашенийПоДокументу = СтруктураДопПараметров.ТаблицаУплатыПоЕдиномуНалоговомуСчету.Скопировать(Новый Структура("ПлатежныйДокумент", ПлатежныйДокумент));
    
    ТаблицаОплат.Очистить();
    
    Для Каждого СтрокаТаблицы Из ТаблицаПогашенийПоДокументу Цикл
        // ... заполнение ТаблицаОплат ...
    КонецЦикла;
    
    Если ТаблицаОплат.Количество() <> 0 Тогда
        СтруктураШапкиДокумента.Вставить("ДокументОплаты", ПлатежныйДокумент);
        ОплатаПрочееУСН(СтруктураШапкиДокумента, ТаблицаОплат, ДвиженияРегистров, КУДиР, ОписаниеПолучателя);
    КонецЕсли;

КонецЦикла;

Здесь мы видим, что процедура ОплатаПрочееУСН вызывается многократно. Внутри неё каждый раз происходит обращение к остаткам регистра через Граница(МоментДокумента, ВидГраницы.Включая). Поскольку это один и тот же документ, его движения еще не записаны в физические таблицы БД (они находятся в коллекции Движения в памяти), и запрос их не учитывает. Это классическая архитектурная ловушка при разработке механизмов проведения в 1С.

Рекомендации по исправлению и обходу проблемы

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

  1. Обновление конфигурации. Разработчики 1С признали наличие проблемы в логике распределения ЕНС для УСН. В последующих релизах (начиная с 3.0.140.20 и выше) были внесены изменения в механизмы работы с временными таблицами остатков. В новых версиях программа старается сначала подготовить общую таблицу движений, а затем однократно корректировать остатки в памяти, не обращаясь к БД на каждой итерации.
  2. Перепроведение документов с начала года. Если вы уже обновились на актуальный релиз, но "минусы" сохраняются, необходимо восстановить последовательность. Рекомендуется распровести все регламентные операции по закрытию месяца, начиная с января текущего года (или с момента введения ЕНС), и выполнить закрытие заново. Это позволит системе пересчитать партии расходов с учетом исправленных алгоритмов.
  3. Корректировка данных ЗУП. Если оперативное обновление невозможно, проанализируйте документы "Отражение зарплаты в бухучете". Если в них присутствуют строки со статусом "Не принимается", попробуйте временно привести аналитику к единообразию (если это допустимо с точки зрения налогового учета) или воспользуйтесь документом "Записи книги доходов и расходов УСН" для ручной корректировки остатков в регистре Расходы при УСН.
  4. Программная доработка (для программистов). Если требуется исправление "здесь и сейчас", необходимо модифицировать процедуру ОплатаПрочееУСН так, чтобы она принимала накопленную таблицу остатков и уменьшала её программно в памяти (в коллекции ТаблицаЗначений), а не пересчитывала запросом к БД каждый раз. Это исключит влияние того, что движения документа еще не зафиксированы в базе.

Заключение

Мы выяснили, что причина "минусов" в регистре Расходы при УСН кроется в несовершенстве алгоритма зачета ЕНС в специфических релизах 1С:Бухгалтерия 3.0. Использование объекта Граница внутри цикла обработки строк одного и того же документа приводит к игнорированию уже совершенных списаний. Наиболее эффективным способом решения является обновление на самый свежий релиз и полный пересчет итогов за период с начала года. Это обеспечит чистоту данных в регистрах и корректное формирование налоговой отчетности.

← На главную