При программном создании проводок в «1С:Бухгалтерии 3.0» разработчики часто сталкиваются с неочевидным поведением системы. Вы создаете свой документ, в обработке проведения формируете движения по регистру бухгалтерии, указываете сумму по бухгалтерскому учету (БУ) и намеренно ставите нулевую сумму по налоговому учету (НУ). Однако после записи документа вы обнаруживаете, что в проводке сумма НУ стала равна сумме БУ, как будто ваш код был проигнорирован. Рассмотрим, почему это происходит и как правильно записать нулевые суммы в налоговом учете.
Такое поведение — не ошибка, а результат работы штатного механизма конфигурации «1С:Бухгалтерия», который предназначен для автоматизации учета по ПБУ 18/02 «Учет расчетов по налогу на прибыль организаций». Основная задача этого механизма — обеспечить выполнение контрольного соотношения: БУ = НУ + ПР + ВР, где ПР — постоянные разницы, а ВР — временные разницы.
Когда вы формируете набор записей регистра бухгалтерии и нажимаете «Записать», перед фактической записью в базу данных срабатывают системные обработчики. Один из них, а именно процедура ОбработатьПроводкиНалоговогоУчета, проверяет, были ли суммы налогового учета заполнены вручную или программно. Если система считает, что суммы НУ не были рассчитаны (а именно так она по умолчанию и думает), она запускает процедуру ЗаполнитьСуммыНалоговогоУчета. Эта процедура, видя пустую или нулевую сумму НУ при наличии суммы БУ, делает предположение, что данные НУ просто не заполнены, и «исправляет» ситуацию, копируя сумму из БУ в НУ.
Таким образом, система пытается «помочь» пользователю, предотвращая появление необоснованных расхождений между видами учета. Наша задача — явно указать системе, что мы заполнили суммы НУ осознанно, и автоматическое вмешательство не требуется.
Для управления поведением механизма автоматического заполнения сумм НУ в платформе 1С предусмотрен специальный флаг. Его нужно установить в дополнительное свойство набора записей регистра бухгалтерии. Этот флаг называется "СуммыНалоговогоУчетаЗаполнены".
Чтобы система не перезаписывала ваши нулевые значения, перед записью движений добавьте в код одну строку:
Движения.Хозрасчетный.ДополнительныеСвойства.Вставить("СуммыНалоговогоУчетаЗаполнены", Истина);
Эта команда добавляет в коллекцию дополнительных свойств набора записей флаг, который говорит системе: «Суммы налогового учета уже рассчитаны и заполнены корректно. Не нужно запускать автоматические алгоритмы их заполнения». Увидев это свойство, процедура ОбработатьПроводкиНалоговогоУчета пропустит шаг автоматического расчета и запишет в базу данных именно те значения, которые вы указали в коде.
Проанализируем полный пример кода для обработки проведения документа. Предположим, у нас есть документ, который должен отразить расходы, принимаемые в бухгалтерском учете, но не принимаемые для целей налога на прибыль (классический случай возникновения постоянной разницы).
Исходный код, который не работает как ожидалось:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// ... код получения данных из документа ...
// Формирование движений
Движения.Хозрасчетный.Записывать = Истина;
// Цикл по табличной части документа
Для Каждого ТекСтрокаТЧ Из Объект.Товары Цикл
Проводка = Движения.Хозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.Организация = Организация;
Проводка.Содержание = "Списание расходов, не принимаемых в НУ";
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Затраты; // Например, счет 26
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.Материалы; // Например, счет 10.01
// Указываем аналитику (субконто)
// ...
// Заполняем суммы
Проводка.Сумма = ТекСтрокаТЧ.СуммаБУ; // Например, 1000 руб.
Проводка.СуммаНУДт = ТекСтрокаТЧ.СуммаНУ; // Здесь мы передаем 0
Проводка.СуммаНУКт = ТекСтрокаТЧ.СуммаНУ; // И здесь тоже 0
КонецЦикла;
КонецПроцедуры
После проведения документа с таким кодом, в проводке СуммаНУДт будет равна 1000 руб. вместо ожидаемого нуля.
Теперь добавим одну строку для корректной работы. Правильный вариант кода:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// ... код получения данных из документа ...
// Формирование движений
Движения.Хозрасчетный.Записывать = Истина;
// ВАЖНО: Устанавливаем флаг до добавления проводок или перед записью движений
Движения.Хозрасчетный.ДополнительныеСвойства.Вставить("СуммыНалоговогоУчетаЗаполнены", Истина);
// Цикл по табличной части документа
Для Каждого ТекСтрокаТЧ Из Объект.Товары Цикл
Проводка = Движения.Хозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.Организация = Организация;
Проводка.Содержание = "Списание расходов, не принимаемых в НУ";
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Затраты;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.Материалы;
// Указываем аналитику (субконто)
// ...
// Заполняем суммы
Проводка.Сумма = ТекСтрокаТЧ.СуммаБУ; // 1000 руб.
Проводка.СуммаНУДт = ТекСтрокаТЧ.СуммаНУ; // 0
Проводка.СуммаНУКт = ТекСтрокаТЧ.СуммаНУ; // 0
// После установки флага система автоматически рассчитает ПР
// СуммаПРДт будет равна 1000 (БУ - НУ)
КонецЦикла;
КонецПроцедуры
С этим изменением проводка будет записана корректно: сумма БУ будет равна 1000, сумма НУ — 0, а система автоматически рассчитает и запишет постоянную разницу (ПР) в дебет счета в размере 1000 рублей, обеспечивая целостность учета.
Таким образом, для корректной программной записи проводок с расхождениями между бухгалтерским и налоговым учетом в «1С:Бухгалтерии 3.0» всегда используйте установку дополнительного свойства "СуммыНалоговогоУчетаЗаполнены". Это позволит вам полностью контролировать данные, передаваемые в регистр, и избежать их нежелательной модификации стандартными механизмами конфигурации.