При работе в конфигурации 1С:Бухгалтерия предприятия 3.0 (начиная с релизов ветки 3.0.139) многие пользователи и технические специалисты столкнулись с критической проблемой: после выполнения регламентной операции закрытия месяца "Зачет аванса по единому налоговому счету" регистр накопления Расходы при УСН некорректно уходит в минус. Это ведет к искажению Книги учета доходов и расходов (КУДиР) и неправильному расчету налога.
В данной статье мы подробно разберем, почему это происходит с точки зрения программного кода, как аналитика из зарплатных программ влияет на эту ошибку и какие пути решения существуют на данный момент. Проанализируем ситуацию глазами разработчика и бухгалтера, чтобы понять механику "зацикливания" запроса, которая и порождает отрицательные значения.
Проблема локализована в модуле НалоговыйУчетУСН, в процедуре ОплатаПрочееУСН. Давайте разберем алгоритм работы системы при закрытии месяца. Программа выполняет зачет авансов по Единому налоговому счету (ЕНС), формируя движения по регистру РасчетыПоНалогамНаЕдиномНалоговомСчете. В рамках одной регламентной операции может быть несколько строк оплаты, которые относятся к разным платежным документам или налогам, но выполняются в рамках одного "момента времени".
Рассмотрим фрагмент кода, который вызывает сбой. В цикле по таблице оплат программа пытается определить, какие расходы в регистре Расходы при УСН можно закрыть этой оплатой. Для этого вызывается функция ВыполнитьЗапросПоРасходам:
// Фрагмент из модуля НалоговыйУчетУСН
ТаблицаРасходов = ВыполнитьЗапросПоРасходам(Новый Граница(МоментДокумента, ВидГраницы.Включая), СтруктураШапкиДокумента.Организация, ТаблицаФильтров);
Проанализируем ситуацию: если в документе "Регламентная операция" есть три строки с суммами оплаты, программа трижды зайдет в этот цикл. На каждой итерации она выполняет запрос к базе данных, чтобы получить остатки. Однако, поскольку запись движений самого документа происходит после завершения всех расчетов в процедуре ОтразитьВУСН, база данных на каждой итерации выдает одни и те же остатки. Программа "не видит", что первая сумма уже "забронировала" часть остатка, и вторая сумма снова пытается списать тот же самый остаток. В итоге происходит кратное списание одной и той же суммы, и регистр уходит в минус.
Важным фактором, усугубляющим проблему, является интеграция с программой "1С:Зарплата и управление персоналом" (ЗУП). Выясним причину, по которой ошибка проявляется не у всех. Если данные из ЗУП передаются с разной аналитикой в поле Отражение в НУ (например, часть суммы помечена как "Принимается", а часть как "Не принимается"), алгоритм распределения оплат начинает работать более детально.
Когда в документе "Отражение зарплаты в бухучете" все суммы имеют статус "Принимается", остатка в регистре Расходы при УСН обычно достаточно, чтобы перекрыть ошибки округления или мелкие повторы. Но как только появляется разделение на "принимаемые" и "непринимаемые" расходы, запрос остатков по конкретным аналитикам (статусам) начинает выдавать некорректные данные из-за описанного выше эффекта "зависшей границы". В этом случае программа ошибочно распределяет оплату ЕНС на те партии расходов, которые уже были фактически погашены предыдущей строкой в том же цикле.
Посмотрим на структуру кода, которая отвечает за распределение платежей по ЕНС. Проблема заключается в том, что вызов ОплатаПрочееУСН происходит внутри цикла по платежным документам:
Для Каждого ПлатежныйДокумент Из ПлатежныеДокументы Цикл
ТаблицаПогашенийПоДокументу = СтруктураДопПараметров.ТаблицаУплатыПоЕдиномуНалоговомуСчету.Скопировать(Новый Структура("ПлатежныйДокумент", ПлатежныйДокумент));
ТаблицаОплат.Очистить();
Для Каждого СтрокаТаблицы Из ТаблицаПогашенийПоДокументу Цикл
// ... заполнение ТаблицаОплат ...
КонецЦикла;
Если ТаблицаОплат.Количество() <> 0 Тогда
СтруктураШапкиДокумента.Вставить("ДокументОплаты", ПлатежныйДокумент);
ОплатаПрочееУСН(СтруктураШапкиДокумента, ТаблицаОплат, ДвиженияРегистров, КУДиР, ОписаниеПолучателя);
КонецЕсли;
КонецЦикла;
Здесь мы видим, что процедура ОплатаПрочееУСН вызывается многократно. Внутри неё каждый раз происходит обращение к остаткам регистра через Граница(МоментДокумента, ВидГраницы.Включая). Поскольку это один и тот же документ, его движения еще не записаны в физические таблицы БД (они находятся в коллекции Движения в памяти), и запрос их не учитывает. Это классическая архитектурная ловушка при разработке механизмов проведения в 1С.
Для решения данной проблемы рассмотрим несколько подходов, в зависимости от ваших возможностей по обновлению и доработке системы.
Расходы при УСН.ОплатаПрочееУСН так, чтобы она принимала накопленную таблицу остатков и уменьшала её программно в памяти (в коллекции ТаблицаЗначений), а не пересчитывала запросом к БД каждый раз. Это исключит влияние того, что движения документа еще не зафиксированы в базе.Мы выяснили, что причина "минусов" в регистре Расходы при УСН кроется в несовершенстве алгоритма зачета ЕНС в специфических релизах 1С:Бухгалтерия 3.0. Использование объекта Граница внутри цикла обработки строк одного и того же документа приводит к игнорированию уже совершенных списаний. Наиболее эффективным способом решения является обновление на самый свежий релиз и полный пересчет итогов за период с начала года. Это обеспечит чистоту данных в регистрах и корректное формирование налоговой отчетности.