Как найти и изменить алгоритм переоценки валютных средств в УТ 10.3 для учета авансов по историческому курсу

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

В типовой конфигурации «Управление торговлей 10.3» алгоритм переоценки валютных активов и обязательств часто вызывает вопросы у разработчиков, особенно когда требуется соблюдение требований ПБУ 3/2006 в части фиксации курса для авансов. В данной статье мы подробно разберем, где искать программный код переоценки, как проанализировать его работу отладчиком и какие изменения необходимо внести для реализации учета авансов по курсу на дату их возникновения.

Где находится алгоритм переоценки в конфигураторе

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

  1. Откроем конфигуратор и найдем в дереве метаданных документ ПереоценкаВалютныхСредств.
  2. Перейдем в Модуль объекта этого документа.
  3. Найдем предопределенную процедуру ОбработкаПроведения.

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

Как работает типовой алгоритм переоценки

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

СуммаПереоценки = (ОстатокВалюта * ТекущийКурс / Кратность) - ОстатокВВалютеУпрУчета

Проблема заключается в том, что в УТ 10.3 взаиморасчеты часто ведутся в разрезе договоров (флаг «Вести по документам расчетов с контрагентами» может быть снят). В этом случае система видит общую сумму долга или аванса (свернутое сальдо). Рассмотрим подробнее: если у нас есть аванс на 100$, пришедший по курсу 60, и последующая отгрузка на 150$ по курсу 70, система может просто увидеть остаток в 50$ и переоценить его по текущему курсу, не разделяя «историческую» часть аванса.

Использование отладчика для анализа данных

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

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

Реализация алгоритма: Аванс по историческому курсу

Выясним причину, почему авансы переоцениваются. В управленческом учете УТ 10.3 не всегда жестко разделяются понятия «предоплата» и «дебиторская задолженность» при расчете разниц. Чтобы реализовать логику «Аванс * Курс аванса + Остаток * Текущий курс», нам потребуется внести изменения в запрос, который собирает данные.

Рассмотрим пример того, как можно изменить логику в коде. Нам нужно обратиться к регистру РасчетыСКонтрагентами, где есть аналитика по статусу оплаты (аванс или нет), либо анализировать документы расчетов.

Пример изменения логики расчета в цикле обхода данных:


// Пример модификации расчета суммы переоценки
Для Каждого СтрокаДанных Из ТаблицаРасчетов Цикл
    
    // Если в настройках мы определили, что это аванс, 
    // и он не должен переоцениваться по ПБУ:
    Если СтрокаДанных.СтатусОплаты = Перечисления.СтатусыОплаты.Аванс Тогда
        // Для авансов сумма переоценки (курсовая разница) должна быть равна 0
        СуммаКурсовойРазницы = 0;
    Иначе
        // Стандартный расчет для дебиторской/кредиторской задолженности
        ТекущаяСтоимостьВРублях = МодульВалютногоУчета.ПересчитатьИзВалютыВВалюту(
            СтрокаДанных.СуммаВзаиморасчетов, 
            СтрокаДанных.Валюта, 
            ВалютаУпрУчета, 
            КурсДокумента, 
            КратностьДокумента
        );
        СуммаКурсовойРазницы = ТекущаяСтоимостьВРублях - СтрокаДанных.СуммаУпр;
    КонецЕсли;
    
    // Далее формируем движения по регистру
КонецЦикла;

Важные рекомендации по настройке

Прежде чем приступать к глубокой модификации кода, проанализируем настройки ведения учета в вашей базе. В УТ 10.3 поведение переоценки сильно зависит от детализации взаиморасчетов:

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

Если ваша задача — строго следовать бухгалтерской методологии (где авансы не переоцениваются), то в УТ 10.3 это требует именно изменения запроса в процедурах переоценки. По умолчанию система стремится привести рублевый эквивалент валютного остатка к текущему курсу ЦБ РФ на дату документа переоценки, независимо от природы возникновения этого остатка.

Таким образом, мы проанализировали ситуацию, нашли место хранения алгоритма в Модуле объекта документа ПереоценкаВалютныхСредств и определили вектор доработки: разделение остатков на авансовые и долговые через запрос к регистру РасчетыСКонтрагентами с последующим обнулением суммы переоценки для строк-авансов.

← На главную