Как исправить ошибку «Поле "Временные разницы" должно быть пустым» при программном создании проводок в 1С?

Программист 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке обработок по переносу данных или автоматизации ввода первичных документов в конфигурации «1С:Бухгалтерия предприятия 2.0» (и аналогичных на базе 1С:Предприятие 8), программисты часто сталкиваются с ошибкой контроля записи регистра бухгалтерии: «Запись не верна! Поле "Временные разницы" должно быть пустым!». Эта ошибка блокирует запись документа ОперацияБух и может поставить в тупик, если не знать принципов организации налогового учета в системе.

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

Причина возникновения ошибки

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

Ошибка возникает в тот момент, когда программный код пытается присвоить значение (даже если это ноль или пустая строка) ресурсам СуммаВРДт, СуммаВРКт, СуммаНУДт и другим, в то время как выбранный счет (например, вспомогательный счет 000 или счета НДС 19.03) не поддерживает налоговый учет.

Разбор программного кода с ошибкой

Рассмотрим фрагмент кода, который чаще всего приводит к проблеме. В данном примере разработчик пытается программно заполнить проводки в документе Операция, используя данные из внешней таблицы:


Для каждого Стр Из ДанныеЛиста Цикл
    Проводка = ДокОпер.Движения.Хозрасчетный.Добавить();
    Проводка.СчетДт = Стр.СчетДТ;
    Проводка.СчетКт = Стр.СчетКТ;
    Проводка.Сумма = Стр.Сумма;

    // Ошибочный блок: безусловное заполнение налоговых ресурсов
    Проводка.СуммаНУДт = Стр.СуммаНУДт;
    Проводка.СуммаВРДт = Стр.Сумма - Стр.СуммаНУДт - Стр.СуммаПРДт;
    Проводка.СуммаПРДт = Стр.СуммаПРДт;

    Проводка.СуммаНУКт = Стр.СуммаНУКт;
    Проводка.СуммаВРКт = Стр.Сумма - Стр.СуммаНУКт - Стр.СуммаПРКт;
    Проводка.СуммаПРКт = Стр.СуммаПРКт;
КонецЦикла;
ДокОпер.Записать();

Проанализируем ситуацию: если в переменной Стр.СчетДТ окажется счет 000 (Вспомогательный), то при попытке выполнить строку Проводка.СуммаВРДт = ..., система выдаст ошибку при записи. Счет 000 предназначен только для технического балансирования при вводе остатков в бухгалтерском учете, налоговый учет по нему не ведется.

Правила баланса БУ = НУ + ПР + ВР

Для понимания того, как правильно заполнять данные, важно помнить фундаментальную формулу, заложенную в методологию 1С (согласно ПБУ 18/02):

Сумма БУ = Сумма НУ + Сумма ПР + Сумма ВР

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

Решение проблемы по шагам

Чтобы код стал универсальным и не вызывал ошибок при работе с разными счетами, необходимо добавить проверку признака налогового учета для каждого счета в проводке.

  1. Проверка счета дебета: Перед заполнением ресурсов СуммаНУДт, СуммаПРДт и СуммаВРДт нужно убедиться, что у Проводка.СчетДт установлен флаг НалоговыйУчет.
  2. Проверка счета кредита: Аналогичную проверку нужно выполнить для Проводка.СчетКт перед заполнением СуммаНУКт, СуммаПРКт и СуммаВРКт.
  3. Учет ПБУ 18/02: Дополнительно рекомендуется проверять, применяется ли в организации ПБУ 18/02, так как ВР и ПР имеют смысл только в рамках этого положения.

Исправленный пример кода

Рассмотрим, как должен выглядеть корректный код заполнения налоговых ресурсов в проводке:


Для каждого Стр Из ДанныеЛиста Цикл
    Проводка = ДокОпер.Движения.Хозрасчетный.Добавить();
    Проводка.СчетДт = Стр.СчетДТ;
    Проводка.СчетКт = Стр.СчетКТ;
    Проводка.Сумма  = Стр.Сумма;
    Проводка.Организация = ОрганизацияПоУмолчанию;
    Проводка.Период = ДатаОп;

    // Корректное заполнение НУ для Дебета
    Если Проводка.СчетДт.НалоговыйУчет Тогда
        Проводка.СуммаНУДт = Стр.СуммаНУДт;
        // Заполняем разницы только если это необходимо по методологии
        Проводка.СуммаПРДт = Стр.СуммаПРДт;
        Проводка.СуммаВРДт = Проводка.Сумма - Проводка.СуммаНУДт - Проводка.СуммаПРДт;
    КонецЕсли;

    // Корректное заполнение НУ для Кредита
    Если Проводка.СчетКт.НалоговыйУчет Тогда
        Проводка.СуммаНУКт = Стр.СуммаНУКт;
        Проводка.СуммаПРКт = Стр.СуммаПРКт;
        Проводка.СуммаВРКт = Проводка.Сумма - Проводка.SуммаНУКт - Проводка.СуммаПРКт;
    КонецЕсли;
КонецЦикла;

Важные нюансы при работе со счетом 000 и НДС

Выясним причину, почему именно на счетах типа 000 или 19.03 чаще всего «спотыкаются» разработчики:

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

Счета учета НДС (19, 68.02): Для большинства счетов учета НДС налоговый учет по налогу на прибыль не ведется. Попытка записать туда «Временные разницы» — методологическая ошибка, так как НДС и налог на прибыль — это разные контуры учета, и временные разницы между ними в таком ключе не возникают.

Дополнительная очистка данных

Обратите внимание на заполнение валютных ресурсов. В исходном коде автора часто встречаются строки вида Проводка.ВалютаДт = "";. Проанализируем это: присвоение пустой строки объекту типа СправочникСсылка.Валюты некорректно. Если валютный учет на счете не ведется, эти поля лучше вообще не трогать, либо присваивать им значение Неопределено.

Использование конструкции Выполнить() для заполнения субконто, как в примере автора, также является избыточным и небезопасным. Рекомендуется использовать обращение к коллекции через индекс или имя: Проводка.СубконтоДт[ВидСубконто] = Значение;.

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

← На главную