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