Как исключить переоценку валютных авансов (документов "Платежное поручение входящее") в 1С:Управление торговлей 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Согласно законодательству (в частности, ПБУ 3/2006 в РФ), полученные и выданные авансы в иностранной валюте переоценке не подлежат. Курс аванса должен «замораживаться» на дату его получения. Если аванс пришел по курсу 70 рублей за евро, то и отгрузка под этот аванс должна пройти по курсу 70 рублей, независимо от того, какой курс установлен на конец месяца.

В этой статье мы подробно разберем, почему стандартный механизм УТ 10.3 переоценивает авансы, почему их невозможно просто «выкинуть» из стандартного запроса остатков, и рассмотрим два способа решения этой проблемы: методологический (через настройки) и программный (через доработку кода).

---

Почему стандартный запрос переоценки не видит платежные поручения?

Проанализируем исходный запрос, который используется в документе ПереоценкаВалютныхСредств для получения остатков взаиморасчетов:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ВзаиморасчетысКонтрагентамиОстатки.Организация,
    ВзаиморасчетысКонтрагентамиОстатки.Контрагент,
    ВзаиморасчетысКонтрагентамиОстатки.ДоговорКонтрагента,
    ВзаиморасчетысКонтрагентамиОстатки.Сделка,
    ВзаиморасчетысКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток КАК СуммаВзаиморасчетовОстаток,
    ВзаиморасчетысКонтрагентамиОстатки.СуммаУпрОстаток КАК СуммаУпрОстаток,
    ВзаиморасчетысКонтрагентамиОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов КАК Валюта,
    КурсыВалютСрезПоследних.Курс КАК КурсВалютыДенежныхСредств,
    КурсыВалютСрезПоследних.Кратность КАК КратностьВалютыДенежныхСредств
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(
        &ДатаДокумента,
        Организация = &Организация
        ИЛИ &ПоВсемОрганизациям) КАК ВзаиморасчетысКонтрагентамиОстатки
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаДокумента, ) КАК КурсыВалютСрезПоследних
    ПО КурсыВалютСрезПоследних.Валюта = ВзаиморасчетысКонтрагентамиОстатки.ДоговорКонтрагента.ВалютаВзаиморасчетов
ГДЕ
    КурсыВалютСрезПоследних.Курс ЕСТЬ НЕ NULL
    И ВзаиморасчетысКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток > 0

Обратим внимание на источник данных. Запрос обращается к виртуальной таблице остатков регистра накопления ВзаиморасчетыСКонтрагентами. Физически в этой таблице нет никаких документов-регистраторов (таких как платежки или накладные). Там хранятся только итоговые свернутые суммы в разрезе измерений: Организация, Контрагент, ДоговорКонтрагента и Сделка.

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

---

Решение 1. Методологическое (изменение настроек учета без изменения кода)

Самый правильный и надежный способ решить проблему переоценки авансов — это использование правильной аналитики учета взаиморасчетов. Чтобы система «знала», какая сумма является авансом по конкретной платежке, необходимо вести учет в разрезе документов расчетов.

Выполним следующие шаги для настройки системы:

  1. Откроем карточку договора контрагента.
  2. В поле «Ведение взаиморасчетов» установим значение «По документам расчетов с контрагентами».
  3. При проведении документов оплаты (ПлатежноеПоручениеВходящее) и отгрузки (РеализацияТоваровУслуг) теперь обязательно нужно указывать конкретный документ расчетов, либо программа будет создавать их автоматически при проведении.

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

---

Решение 2. Программное (если включен учет по документам расчетов)

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

Допустим, в регистре остатков у вас задействовано измерение Сделка или ДокументРасчетов, в котором хранятся документы-основания. Нам нужно исключить из выборки те строки, у которых типом этого измерения является ПлатежноеПоручениеВходящее или ПлатежныйОрдерПоступлениеДенежныхСредств.

Модернизируем условие ГДЕ в запросе:


ГДЕ
    КурсыВалютСрезПоследних.Курс ЕСТЬ НЕ NULL
    И ВзаиморасчетысКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток > 0
    И НЕ ВзаиморасчетысКонтрагентамиОстатки.Сделка ССЫЛКА Документ.ПлатежноеПоручениеВходящее
    И НЕ ВзаиморасчетысКонтрагентамиОстатки.Сделка ССЫЛКА Документ.ПлатежныйОрдерПоступлениеДенежныхСредств

Если в вашей конфигурации для детального учета используется измерение ДокументРасчетовСКонтрагентом, запрос будет выглядеть следующим образом:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ВзаиморасчетысКонтрагентамиОстатки.Организация,
    ВзаиморасчетысКонтрагентамиОстатки.Контрагент,
    ВзаиморасчетысКонтрагентамиОстатки.ДоговорКонтрагента,
    ВзаиморасчетысКонтрагентамиОстатки.ДокументРасчетовСКонтрагентом,
    ВзаиморасчетысКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток КАК СуммаВзаиморасчетовОстаток,
    ВзаиморасчетысКонтрагентамиОстатки.СуммаУпрОстаток КАК СуммаУпрОстаток
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&ДатаДокумента, Организация = &Организация) КАК ВзаиморасчетысКонтрагентамиОстатки
ГДЕ
    НЕ ВзаиморасчетысКонтрагентамиОстатки.ДокументРасчетовСКонтрагентом ССЫЛКА Документ.ПлатежноеПоручениеВходящее
    И НЕ ВзаиморасчетысКонтрагентамиОстатки.ДокументРасчетовСКонтрагентом ССЫЛКА Документ.ПлатежныйОрдерПоступлениеДенежныхСредств

Этот способ прост в реализации и эффективно решает задачу, предотвращая переоценку сумм, «зависших» на платежных документах до момента их закрытия накладными.

---

Решение 3. Сложное программное решение (для учета «По договору в целом»)

Если бизнес-логика предприятия не позволяет перевести договоры на аналитику «По документам расчетов», вам придется пойти по сложному пути — вычислять авансы программно по алгоритму ФИФО на основе анализа оборотов регистра взаиморасчетов.

Проанализируем этот алгоритм по шагам:

  1. Запросом получаем все остатки по регистру ВзаиморасчетыСКонтрагентами на дату переоценки.
  2. Для каждого договора, по которому есть остаток (сальдо), получаем таблицу всех движений (оборотов) за период ведения расчетов.
  3. Программно сопоставляем отгрузки и оплаты по методу ФИФО (первый пришел — первый ушел).
  4. Определяем, какая часть текущего остатка обеспечена документами ПлатежноеПоручениеВходящее (то есть является чистым авансом).
  5. Уменьшаем сумму остатка для переоценки на величину выявленного аванса перед передачей таблицы в функцию расчета курсовых разниц.

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


// Примерная схема исключения авансов программным путем
Для Каждого СтрокаОстатков Из ТаблицаРезультата Цикл
    
    // Если сальдо кредитовое (нам должны) или дебетовое (мы должны) — анализируем на аванс
    Если СтрокаОстатков.СуммаВзаиморасчетовОстаток > 0 Тогда
        
        // Запрос по движениям для выявления структуры остатка
        ЗапросДвижений = Новый Запрос;
        ЗапросДвижений.Текст = 
            "ВЫБРАТЬ
            |   Взаиморасчеты.Регистратор,
            |   Взаиморасчеты.ВидДвижения,
            |   Взаиморасчеты.СуммаВзаиморасчетов
            |ИЗ
            |   РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК Взаиморасчеты
            |ГДЕ
            |   Взаиморасчеты.ДоговорКонтрагента = &Договор
            |   И Взаиморасчеты.Период <= &ДатаДокумента
            |УПОРЯДОЧИТЬ ПО
            |   Взаиморасчеты.Период УБЫВ"; // Анализируем с конца к началу
        
        ЗапросДвижений.УстановитьПараметр("Договор", СтрокаОстатков.ДоговорКонтрагента);
        ЗапросДвижений.УстановитьПараметр("ДатаДокумента", ДатаДокумента);
        
        Выборка = ЗапросДвижений.Выполнить().Выбрать();
        
        ОстатокДляАнализа = СтрокаОстатков.СуммаВзаиморасчетовОстаток;
        СуммаАвансовДляИсключения = 0;
        
        Пока Выборка.Следующий() И ОстатокДляАнализа > 0 Цикл
            // Если последнее движение — это платежка (поступление денег)
            Если (Выборка.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее) 
                И Выборка.ВидДвижения = ВидДвиженияНакопления.Приход Тогда
                
                СуммаПоПлатежке = Выборка.СуммаВзаиморасчетов;
                ДоляАванса = Мин(ОстатокДляАнализа, СуммаПоПлатежке);
                
                СуммаАвансовДляИсключения = СуммаАвансовДляИсключения + ДоляАванса;
                ОстатокДляАнализа = ОстатокДляАнализа - ДоляАванса;
            Иначе
                // Если встретилась отгрузка, уменьшаем анализируемый остаток
                ОстатокДляАнализа = ОстатокДляАнализа - Выборка.СуммаВзаиморасчетов;
            КонецЕсли;
        КонецЦикла;
        
        // Исключаем сумму аванса из расчета переоценки
        СтрокаОстатков.СуммаВзаиморасчетовОстаток = СтрокаОстатков.СуммаВзаиморасчетовОстаток - СуммаАвансовДляИсключения;
        
    КонецЕсли;
КонецЦикла;

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

---

Резюме и рекомендации

Подводя итоги, дадим несколько ключевых советов для успешного решения задачи:

← На главную