Проводка по одному счету без аналитики: почему возникает Дт 57.2 — Кт 57.2 в 1С 7.7 и как это исправить

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет Финансы и профессиональные услуги
← На главную

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

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

Бухгалтерский смысл проводки вида Дт Х — Кт Х

В классической бухгалтерии проводка, в которой дебет и кредит приходятся на один и тот же счет, имеет право на жизнь только при условии ведения аналитического учета (субконто) по этому счету. Такие записи используются для отражения внутренних перемещений или реклассификации. Рассмотрим несколько стандартных примеров:

  1. Дт 10 — Кт 10 — перемещение материалов между складами компании или смена материально-ответственного лица (МОЛ). В этом случае дебетовое субконто «Склад-получатель» отличается от кредитового «Склад-отправитель».
  2. Дт 01 — Кт 01 — перевод основного средства из одной группы в другую (например, перемещение оборудования между цехами или смена ответственного лица).
  3. Дт 60.1 — Кт 60.1 — перенос задолженности с одного договора контрагента на другой в рамках одного и того же юридического лица.

Однако, если на счете аналитика отсутствует полностью (как в случае с транзитным счетом 57.2), то проводка вида Дт 57.2 — Кт 57.2 лишена всякого экономического и методологического смысла. Она никак не меняет конечное сальдо счета, но при этом искусственно завышает обороты по дебету и кредиту в оборотно-сальдовой ведомости (ОСВ) и «шахматке». Подобное «раздувание» оборотов искажает бухгалтерскую отчетность и считается грубой методологической ошибкой.

Выясним, почему же такая проводка все-таки появляется в базе данных 1С 7.7.

Анализ программного кода: ищем причину бага

Платформа 1С:Предприятие 7.7 технически позволяет записать любую проводку, даже самую абсурдную — движок базы данных не проверяет экономическую логику операций. Если программист при написании кода проведения документа не заложил проверку на равенство счетов дебета и кредита, система послушно выполнит проведение.

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


Процедура ПроводкаПоСчету57_2(перДК="", перСодержание="", перСчет="",
    перСуб1="", перСуб2="", перСуб3="", perСумма=0, перВалюта="", перВалСумма=0)
    
    Операция.НоваяПроводка();
    Операция.СодержаниеПроводки    = перСодержание;
    Операция.ПервичныйДокумент  = ПервичныйДакумент;
    Если перДК = "Дебет" Тогда
        Операция.Дебет.Счет        = Счет57_2;
        Операция.Кредит.Счет    = перСчет;
        Операция.Кредит.Субконто(1, перСуб1);
        Операция.Кредит.Субконто(2, перСуб2);
        Операция.Кредит.Субконто(3, перСуб3);
    ИначеЕсли перДК = "Кредит" Тогда
        Операция.Кредит.Счет    = Счет57_2;
        Операция.Дебет.Счет        = перСчет;
        Операция.Дебет.Субконто(1, перСуб1);
        Операция.Дебет.Субконто(2, перСуб2);
        Операция.Дебет.Субконто(3, перСуб3);
    КонецЕсли;
    Операция.Сумма = перСумма;
    
    Если перСчет.Валютный = 1 Тогда
        текВалюта = ?(ПустоеЗначение(перВалюта)=1, Константа.ОсновнаяВалюта, перВалюта);
        Если текВалюта <> Константа.ОсновнаяВалюта Тогда
            Операция.Валюта        = перВалюта;
            Операция.ВалСумма    = перВалСумма;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры // ПроводкаПоСчету57_2(...)

Эта процедура является универсальной. Она вызывается из различных алгоритмов проведения — например, при прямой покупке валюты:


Процедура ПрямаяПокупкаВалюты()
    
    КредитСумма = глОкрСумм(Приход*КурсВалюты, ДатаДок);
    ПроводкаПоСчету57_2("Кредит", СокрЛП(ВидДвижения),
        КоррСчет, Субконто1, Субконто2, Субконто3,
        КредитСумма, Валюта, Приход);
        
    ДебетСумма = глОкрСумм(Приход*ОснКурс, ДатаДок);
    Если БанкСчетГруппы5Х = 1 Тогда
        
        ПроводкаПоСчету57_2("Дебет", СокрЛП(ВидДвижения),
            БанковскийСчет.Счет, БанковскийСчет, ВидДвижения, "",
            ДебетСумма, Валюта, Приход);
            
    ИначеЕсли БанкСчетГруппы6Х = 1 Тогда
            
        ПроводкаПоСчету57_2("Дебет", СокрЛП(ВидДвижения),
            БанковскийСчет.Счет, Контрагент, Договор, БанковскийСчет,
            ДебетСумма, Валюта, Приход);
        
    КонецЕсли;
    
    КурсоваяРазница57_2(КредитСумма-ДебетСумма);
    
КонецПроцедуры // ПрямаяПокупкаВалюты()

В чем заключается логическая ошибка кода?

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

В результате мы получаем бессмысленную запись Дт 57.2 — Кт 57.2, которая завышает обороты в базе данных.

Почему бухгалтеры выбирают счет 57.2 в документе?

Посмотрим на ситуацию со стороны пользователя. Зачем бухгалтеру вообще понадобилось указывать счет 57.2 в качестве корреспондирующего в банковской выписке?

При покупке валюты коммерческие банки списывают рубли с рублевого счета организации (Дт 57.2 — Кт 51) и зачисляют эквивалент в валюте на валютный счет (Дт 52 — Кт 57.2). Но эти две операции выполняются по разным курсам:

  1. Зачисление на валютный счет 52 по закону всегда производится по официальному курсу ЦБ РФ на дату зачисления.
  2. Списание рублей со счета 51 для покупки валюты обычно происходит по коммерческому курсу самого банка, который отличается от курса ЦБ.

Из-за разницы курсов на транзитном счете 57.2 неизбежно зависает остаток (излишек или перерасход). В типовых конфигурациях этот остаток автоматически списывается документом на финансовые результаты (прочие доходы или расходы):

В нетиповой («самописной») конфигурации этот автоматический механизм списания разниц мог работать некорректно или отсутствовать вовсе. Столкнувшись с «зависшим» сальдо по счету 57.2, бухгалтеры начали искать способы «закрыть» счет вручную через выписку банка. Выбирая в полях документа корреспондирующий счет 57.2, они пытались скорректировать остаток, что из-за недоработки программиста привело к появлению пустых оборотов.

Как решить проблему в коде 1С 7.7

Для того чтобы предотвратить формирование бессмысленных самокорреспондирующих проводок, нам необходимо добавить в программный код простую, но надежную проверку. Если счет дебета совпадает со счетом кредита, и при этом на счете нет субконто (или значения субконто на обеих сторонах идентичны), программа должна игнорировать запись такой проводки.

Модифицируем универсальную процедуру ПроводкаПоСчету57_2. Добавим условие блокировки записи проводки, если корреспондирующий счет равен 57.2:


Процедура ПроводкаПоСчету57_2(перДК="", перСодержание="", перСчет="",
    перСуб1="", перСуб2="", перСуб3="", перСумма=0, перВалюта="", перВалСумма=0)
    
    // Блокировка проводки "сам на себя" при отсутствии аналитики
    Если перСчет = Счет57_2 Тогда
        // Если аналитика на счете отсутствует, проводка бессмысленна.
        // Выводим предупреждение в окно сообщений для контроля пользователей.
        Сообщить("Внимание! Попытка сформировать проводку " + Счет57_2.Код + " - " + перСчет.Код + ". Операция отклонена.","!");
        Возврат; 
    КонецЕсли;

    Операция.НоваяПроводка();
    Операция.СодержаниеПроводки    = перСодержание;
    Операция.ПервичныйДокумент  = ПервичныйДакумент;
    
    Если перДК = "Дебет" Тогда
        Операция.Дебет.Счет        = Счет57_2;
        Операция.Кредит.Счет    = перСчет;
        Операция.Кредит.Субконто(1, перСуб1);
        Операция.Кредит.Субконто(2, perСуб2);
        Операция.Кредит.Субконто(3, перСуб3);
    ИначеЕсли перДК = "Кредит" Тогда
        Операция.Кредит.Счет    = Счет57_2;
        Операция.Дебет.Счет        = перСчет;
        Операция.Дебет.Субконто(1, перСуб1);
        Операция.Дебет.Субконто(2, перСуб2);
        Операция.Дебет.Субконто(3, перСуб3);
    КонецЕсли;
    
    Операция.Сумма = перСумма;
    
    Если перСчет.Валютный = 1 Тогда
        текВалюта = ?(ПустоеЗначение(перВалюта)=1, Константа.ОсновнаяВалюта, перВалюта);
        Если текВалюта <> Константа.ОсновнаяВалюта Тогда
            Операция.Валюта        = перВалюта;
            Операция.ВалСумма    = перВалСумма;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры // ПроводкаПоСчету57_2(...)

Благодаря этому простому условию Если перСчет = Счет57_2 Тогда Возврат; КонецЕсли; транзакция Дт 57.2 — Кт 57.2 больше никогда не запишется в базу данных. Обороты компании по транзитному счету станут чистыми и корректными.

Как правильно закрывать разницы по счету 57.2

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

  1. Списание рублевых средств на покупку валюты:
    Дт 57.2 — Кт 51 (на сумму списанных банком рублей по курсу покупки банка).
  2. Зачисление купленной валюты на счет организации:
    Дт 52 — Кт 57.2 (валютная сумма, пересчитанная в рубли по официальному курсу ЦБ РФ).
  3. Автоматическое списание разницы курсов (выполняется кодом программы):
    Если курс покупки банка выше курса ЦБ РФ (получен убыток):
    Дт 91.2 (Прочие расходы) — Кт 57.2
    Если курс покупки банка ниже курса ЦБ РФ (получена выгода):
    Дт 57.2 — Кт 91.1 (Прочие доходы)

Реализовав проверку на совпадение счетов в коде конфигурации 1С 7.7 и настроив автоматический расчет разниц с отнесением на 91 счет, мы полностью избавим информационную базу от некорректных проводок-пустышек и обеспечим ведение учета в строгом соответствии с требованиями законодательства.

← На главную