В процессе сопровождения нетиповых («самописных») конфигураций на платформе 1С:Предприятие 7.7 разработчики и бухгалтеры иногда сталкиваются с весьма странными проводками. Одной из таких загадок является ситуация, когда программа формирует проводку, в которой и по дебету, и по кредиту указан один и тот же счет — например, 57.2 («Денежные средства для приобретения валюты»). При этом на счете отсутствует аналитический учет (субконто).
В этой статье мы подробно разберем, имеет ли смысл такая проводка с точки зрения методологии бухгалтерского учета, почему она возникает в программном коде 1С 7.7 и как устранить этот логический баг раз и навсегда.
В классической бухгалтерии проводка, в которой дебет и кредит приходятся на один и тот же счет, имеет право на жизнь только при условии ведения аналитического учета (субконто) по этому счету. Такие записи используются для отражения внутренних перемещений или реклассификации. Рассмотрим несколько стандартных примеров:
Однако, если на счете аналитика отсутствует полностью (как в случае с транзитным счетом 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, которая завышает обороты в базе данных.
Посмотрим на ситуацию со стороны пользователя. Зачем бухгалтеру вообще понадобилось указывать счет 57.2 в качестве корреспондирующего в банковской выписке?
При покупке валюты коммерческие банки списывают рубли с рублевого счета организации (Дт 57.2 — Кт 51) и зачисляют эквивалент в валюте на валютный счет (Дт 52 — Кт 57.2). Но эти две операции выполняются по разным курсам:
Из-за разницы курсов на транзитном счете 57.2 неизбежно зависает остаток (излишек или перерасход). В типовых конфигурациях этот остаток автоматически списывается документом на финансовые результаты (прочие доходы или расходы):
В нетиповой («самописной») конфигурации этот автоматический механизм списания разниц мог работать некорректно или отсутствовать вовсе. Столкнувшись с «зависшим» сальдо по счету 57.2, бухгалтеры начали искать способы «закрыть» счет вручную через выписку банка. Выбирая в полях документа корреспондирующий счет 57.2, они пытались скорректировать остаток, что из-за недоработки программиста привело к появлению пустых оборотов.
Для того чтобы предотвратить формирование бессмысленных самокорреспондирующих проводок, нам необходимо добавить в программный код простую, но надежную проверку. Если счет дебета совпадает со счетом кредита, и при этом на счете нет субконто (или значения субконто на обеих сторонах идентичны), программа должна игнорировать запись такой проводки.
Модифицируем универсальную процедуру ПроводкаПоСчету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 — Кт 51 (на сумму списанных банком рублей по курсу покупки банка).
Дт 52 — Кт 57.2 (валютная сумма, пересчитанная в рубли по официальному курсу ЦБ РФ).
Дт 91.2 (Прочие расходы) — Кт 57.2
Дт 57.2 — Кт 91.1 (Прочие доходы)
Реализовав проверку на совпадение счетов в коде конфигурации 1С 7.7 и настроив автоматический расчет разниц с отнесением на 91 счет, мы полностью избавим информационную базу от некорректных проводок-пустышек и обеспечим ведение учета в строгом соответствии с требованиями законодательства.