Почему при печати УПД из валютного документа реализации в УТ 11 суммы пересчитываются в рубли и как устроен этот запрос?

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

При разработке и доработке печатных форм в конфигурации 1С:Управление торговлей 11 (а также ERP и Комплексная автоматизация) разработчики часто сталкиваются с ситуацией: документ Реализация товаров и услуг оформлен в иностранной валюте (например, EUR или USD), в табличной части указаны валютные цены и суммы, однако при формировании печатной формы Универсального передаточного документа (УПД) или ТОРГ-12 все показатели автоматически выводятся в рублях.

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

Как устроена архитектура выборки данных для печати

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

  1. ТаблицаДанныхДокументов — сохраняет ссылки, организации, склады и валюту документов из массива переданных объектов.
  2. РеализацияТоваровУслугТаблицаТоваров — формируется серверной процедурой (например, ПоместитьВременнуюТаблицуТоваров) и содержит обработанный состав номенклатуры, количество, ставки НДС и итоговые суммы.
  3. ТаблицаСчетовФактур и ТаблицаОтветственныеЛица — заполняют реквизиты подписантов и связанных счетов-фактур.

Посмотрим на типовой фрагмент инициализации менеджера временных таблиц перед основным запросом:


МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

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

ПоместитьВременнуюТаблицуТоваров(МенеджерВременныхТаблиц, Истина);
ПродажиСервер.ПоместитьВременнуюТаблицуСчетовФактур(МенеджерВременныхТаблиц);
ОтветственныеЛицаСервер.СформироватьВременнуюТаблицуОтветственныхЛицДокументов(МассивОбъектов, МенеджерВременныхТаблиц);

Где происходит пересчет: регистр «Суммы документов в валюте регл. учета»

Главный секрет пересчета сумм кроется внутри процедуры ПоместитьВременнуюТаблицуТоваров. Система не умножает значения табличной части на курс ЦБ РФ на дату реализации «на лету» простым умножением. Согласно законодательству РФ и правилам бухгалтерского учета (ПБУ 3/2006, ст. 153 НК РФ), если по сделке были получены авансы, выручка и база по НДС рассчитываются по курсам на даты получения предоплат.

Поэтому конфигурация берет уже рассчитанные и зафиксированные при проведении рублевые суммы из регистра сведений РегистрСведений.СуммыДокументовВВалютеРегл (или СуммыДокументовВВалютахУчета в версиях 11.5+).

Проанализируем фрагмент запроса формирования временной таблицы РеализацияТоваровУслугТаблицаТоваров:


ЛЕВОЕ СОЕДИНЕНИЕ
    РегистрСведений.СуммыДокументовВВалютеРегл КАК СуммыДокументовВВалютеРегл
ПО
    ТаблицаДокумента.Ссылка = СуммыДокументовВВалютеРегл.Регистратор
    И ТаблицаДокумента.ИдентификаторСтроки = СуммыДокументовВВалютеРегл.ИдентификаторСтроки
    И СуммыДокументовВВалютеРегл.Активность
    И &ПересчитыватьВВалютуРегл

И далее в полях выборки:


ЕСТЬNULL(
    СуммыДокументовВВалютеРегл.СуммаБезНДСРегл,
    ТаблицаДокумента.СуммаСНДС - ТаблицаДокумента.СуммаНДС
) КАК СуммаБезНДС,

ЕСТЬNULL(
    СуммыДокументовВВалютеРегл.СуммаНДСРегл,
    ТаблицаДокумента.СуммаНДС
) КАК СуммаНДС

Когда параметр &ПересчитыватьВВалютуРегл установлен в Истина, условие соединения с регистром отрабатывает, и функция ЕСТЬNULL подставляет значения СуммаБезНДСРегл и СуммаНДСРегл (рубли). Если параметр равен Ложь, соединение не происходит, и запрос берет исходные валютные суммы прямо из табличной части документа.

Расчет цены за единицу товара в печатной форме

В итоговом запросе печати цена рассчитывается расчетным путем: полученная рублевая сумма строки без НДС делится на количество товара. Рассмотрим фрагмент выборки финального запроса:


ВЫБОР
    КОГДА &ВыводитьБазовыеЕдиницыИзмерения
        ТОГДА ТаблицаДокумента.СуммаБезНДС / ТаблицаДокумента.Количество
    ИНАЧЕ ТаблицаДокумента.СуммаБезНДС / ТаблицаДокумента.КоличествоУпаковок
КОНЕЦ КАК Цена

Так как в поле ТаблицаДокумента.СуммаБезНДС из временной таблицы уже пришла рублевая сумма, результат деления также дает цену единицы в рублях с учетом распределенных авансов.

Что определяет значение флага «ПересчитыватьВВалютуРегл»

Флаг пересчета устанавливается в коде модуля менеджера автоматически перед вызовом запросов печати на основании настроек договора и соглашения:

  1. Расчеты в условных единицах (у.е.): Валюта документа — иностранная (например, EUR), но в договоре/соглашении с контрагентом указано, что оплата производится в рублях. В этом случае ПересчитыватьВВалютуРегл = Истина. Согласно ст. 169 НК РФ и Постановлению Правительства РФ № 1137, счет-фактура и УПД (со статусом 1) обязаны выставляться в рублях (код 643).
  2. Внешнеэкономическая сделка (экспорт/валютные расчеты): Если валюта документа — EUR, и оплата по договору также осуществляется в EUR, ПересчитыватьВВалютуРегл = Ложь. УПД формируется в иностранной валюте.

Рекомендации по диагностике и доработке

Если печатная форма выводит не те суммы или валюту, которую вы ожидаете, выполним следующие шаги:

  1. Проверим настройки договора: Убедимся, какая валюта указана в реквизитах договора в поле порядка расчетов и оплаты.
  2. Проверим проведение взаиморасчетов: Если документ менялся задним числом, данные в регистре сведений СуммыДокументовВВалютеРегл могут быть неактуальны. В коде перед печатью типовая конфигурация запускает актуализацию:
    
    ВзаиморасчетыСервер.ВыполнитьПроведениеДокументовПоРасчетамСКлиентами(МассивАналитикУчетаПоПартнерам);
    
  3. Доработка формы: Если для управленческих целей требуется принудительно вывести валютные суммы без пересчета, не следует переписывать алгоритмы внутри проведения. Достаточно создать внешнюю печатную форму (ВПФ) или переопределить формирование данных через расширение конфигурации, передав в процедуру подготовки временной таблицы параметр ПересчитыватьВВалютуРегл = Ложь.
← На главную