В типовой конфигурации «Управление торговлей 10.3» алгоритм переоценки валютных активов и обязательств часто вызывает вопросы у разработчиков, особенно когда требуется соблюдение требований ПБУ 3/2006 в части фиксации курса для авансов. В данной статье мы подробно разберем, где искать программный код переоценки, как проанализировать его работу отладчиком и какие изменения необходимо внести для реализации учета авансов по курсу на дату их возникновения.
Для начала определим «точку входа». Вся основная логика по расчету курсовых разниц сосредоточена в одном документе. Проанализируем структуру метаданных: нужный нам объект — это документ ПереоценкаВалютныхСредств. Чтобы найти код, отвечающий за расчеты, выполним следующие шаги:
ПереоценкаВалютныхСредств.ОбработкаПроведения.Именно в процедуре ОбработкаПроведения вызываются основные механизмы формирования движений. Как правило, расчеты не выполняются «в лоб» прямо в теле процедуры, а выносятся в специализированные функции. В УТ 10.3 часто используется вызов из общих модулей, например, ПроцедурыПереоценкиВалютныхСредств (название может варьироваться в зависимости от релиза), либо логика инкапсулирована внутри процедур самого модуля объекта, таких как ПодготовитьТаблицуВзаиморасчетов или ПодготовитьТаблицуДенежныхСредств.
Прежде чем менять код, разберем ситуацию, которая сложилась у автора вопроса. Типовая логика УТ 10.3 работает по принципу «остатка». Система анализирует остатки на валютных счетах и в регистрах взаиморасчетов на дату документа. Формула расчета суммы переоценки в общем виде выглядит так:
СуммаПереоценки = (ОстатокВалюта * ТекущийКурс / Кратность) - ОстатокВВалютеУпрУчета
Проблема заключается в том, что в УТ 10.3 взаиморасчеты часто ведутся в разрезе договоров (флаг «Вести по документам расчетов с контрагентами» может быть снят). В этом случае система видит общую сумму долга или аванса (свернутое сальдо). Рассмотрим подробнее: если у нас есть аванс на 100$, пришедший по курсу 60, и последующая отгрузка на 150$ по курсу 70, система может просто увидеть остаток в 50$ и переоценить его по текущему курсу, не разделяя «историческую» часть аванса.
Чтобы понять, какие данные попадают в расчет, воспользуемся отладчиком. Установим точку останова в модуле объекта документа ПереоценкаВалютныхСредств внутри цикла обхода таблиц, которые готовятся для формирования движений. Проанализируем следующие ключевые моменты:
ВзаиморасчетыСКонтрагентами или РасчетыСКонтрагентами.Если вы видите, что СуммаУпр уже включает в себя авансы, которые вы не хотите переоценивать, значит, алгоритм нужно модифицировать на этапе формирования этой таблицы, чтобы исключить «авансовую» составляющую из базы переоценки.
Выясним причину, почему авансы переоцениваются. В управленческом учете УТ 10.3 не всегда жестко разделяются понятия «предоплата» и «дебиторская задолженность» при расчете разниц. Чтобы реализовать логику «Аванс * Курс аванса + Остаток * Текущий курс», нам потребуется внести изменения в запрос, который собирает данные.
Рассмотрим пример того, как можно изменить логику в коде. Нам нужно обратиться к регистру РасчетыСКонтрагентами, где есть аналитика по статусу оплаты (аванс или нет), либо анализировать документы расчетов.
Пример изменения логики расчета в цикле обхода данных:
// Пример модификации расчета суммы переоценки
Для Каждого СтрокаДанных Из ТаблицаРасчетов Цикл
// Если в настройках мы определили, что это аванс,
// и он не должен переоцениваться по ПБУ:
Если СтрокаДанных.СтатусОплаты = Перечисления.СтатусыОплаты.Аванс Тогда
// Для авансов сумма переоценки (курсовая разница) должна быть равна 0
СуммаКурсовойРазницы = 0;
Иначе
// Стандартный расчет для дебиторской/кредиторской задолженности
ТекущаяСтоимостьВРублях = МодульВалютногоУчета.ПересчитатьИзВалютыВВалюту(
СтрокаДанных.СуммаВзаиморасчетов,
СтрокаДанных.Валюта,
ВалютаУпрУчета,
КурсДокумента,
КратностьДокумента
);
СуммаКурсовойРазницы = ТекущаяСтоимостьВРублях - СтрокаДанных.СуммаУпр;
КонецЕсли;
// Далее формируем движения по регистру
КонецЦикла;
Прежде чем приступать к глубокой модификации кода, проанализируем настройки ведения учета в вашей базе. В УТ 10.3 поведение переоценки сильно зависит от детализации взаиморасчетов:
СуммаУпр для конкретного платежного документа будет соответствовать его курсу на дату создания.Взаиморасчеты с контрагентами, он предназначен для более детального анализа состояния расчетов (аванс/долг).Если ваша задача — строго следовать бухгалтерской методологии (где авансы не переоцениваются), то в УТ 10.3 это требует именно изменения запроса в процедурах переоценки. По умолчанию система стремится привести рублевый эквивалент валютного остатка к текущему курсу ЦБ РФ на дату документа переоценки, независимо от природы возникновения этого остатка.
Таким образом, мы проанализировали ситуацию, нашли место хранения алгоритма в Модуле объекта документа ПереоценкаВалютныхСредств и определили вектор доработки: разделение остатков на авансовые и долговые через запрос к регистру РасчетыСКонтрагентами с последующим обнулением суммы переоценки для строк-авансов.