Как рассчитать и вывести курсовую разницу в отчете по продажам в 1С:Управление торговлей 11.4?

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

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

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

Почему ручной расчет курсовой разницы в запросе — это ошибка?

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

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

Поэтому мы настоятельно рекомендуем использовать уже готовые данные, которые система 1С:УТ 11.4 рассчитывает автоматически на уровне проведения документов и регламентных операций.

Как 1С:УТ 11.4 сопоставляет продажи и оплаты

В системе заложен мощный механизм онлайн-взаиморасчетов. Программа сама сопоставляет документы по принципу ФИФО или на основании явных указаний пользователя в платежных документах (поле Основание платежа или табличная часть «Расшифровка платежа»).

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

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

Где хранятся начисленные курсовые разницы?

В конфигурации 1С:УТ 11.4 для хранения информации о расчетах с клиентами используются специализированные регистры накопления:

Для разработки отчета по продажам с детализацией до документов отгрузки наиболее удобным является регистр РасчетыСКлиентамиПоДокументам.

Важный маркер курсовой разницы в регистре:
Когда система производит переоценку валютного долга (например, при регламентном закрытии месяца или в момент проведения документов оплаты), она делает записи в этот регистр со следующими особенностями:

  1. Ресурс СуммаВВалюте равен 0 (так как сумма долга в валюте контракта не изменилась).
  2. Ресурс Сумма (рублевый эквивалент) — заполнен (это и есть сумма начисленной в рублях курсовой разницы).
  3. Поле Хозяйственная операция принимает значение ПереоценкаВалютныхСредств (или аналогичное, связанное с курсовыми разницами).

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

Разрабатываем запрос для отчета (СКД)

Рассмотрим, как связать данные о продажах и курсовых разницах в одном запросе. Мы будем использовать виртуальную таблицу оборотов регистра РасчетыСКлиентамиПоДокументам.Обороты.

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


ВЫБРАТЬ
    Продажи.Организация КАК Организация,
    Продажи.Контрагент КАК Контрагент,
    Продажи.Договор КАК Договор,
    Продажи.ЗаказКлиента КАК ОбъектРасчетов,
    Продажи.Реализация КАК ДокументПродажи,
    Продажи.СуммаВВалюте КАК СуммаПродажиВалюта,
    Продажи.СуммаРегл КАК СуммаПродажиРуб,
    
    // Получаем оплату из регистра расчетов
    ЕСТЬNULL(ВзаиморасчетыОплата.СуммаОплатыВалюта, 0) КАК СуммаОплатыВалюта,
    ЕСТЬNULL(ВзаиморасчетыОплата.СуммаОплатыРуб, 0) КАК СуммаОплатыРуб,
    
    // Вытаскиваем курсовую разницу
    ЕСТЬNULL(ВзаиморасчетыКурсовые.КурсоваяРазница, 0) КАК КурсоваяРазница
ИЗ
    // Первым источником выбираем ваши данные по продажам (например, из регистра "ВыручкаИСебестоимостьПродаж")
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК Продажи

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

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

Проанализируем этот запрос. Мы разделили получение оплат и получение курсовых разниц на два разных пакета (подзапроса). В блоке ВзаиморасчетыКурсовые мы применили ключевой фильтр: Взаиморасчеты.СуммаВВалютеОборот = 0. Это позволяет отсечь обычные рублевые оплаты по текущему курсу и выбрать только те транзакции переоценки, которые изменили рублевую стоимость долга без изменения его валютного объема.

Альтернатива: Использование типовых отчетов программы

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

  1. Перейдите в раздел Продажи — Отчеты по продажам — Ведомость расчетов с клиентами.
  2. Откройте настройки отчета (кнопка Настройки...), выберите расширенный вид настройки.
  3. На вкладке Структура добавьте группировку по Объекту расчетов и Расчетному документу.
  4. На вкладке Поля и сортировки добавьте показатели:
    • Сумма (Регл.) — сумма в рублях;
    • Сумма (Вал.) — сумма в валюте договора;
    • Поля корректировок и переоценок (в зависимости от релиза программы они могут называться «Переоценка» или выводиться в составе оборотов).

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

← На главную