При разработке и доработке печатных форм в конфигурации 1С:Управление торговлей 11 (а также ERP и Комплексная автоматизация) разработчики часто сталкиваются с ситуацией: документ Реализация товаров и услуг оформлен в иностранной валюте (например, EUR или USD), в табличной части указаны валютные цены и суммы, однако при формировании печатной формы Универсального передаточного документа (УПД) или ТОРГ-12 все показатели автоматически выводятся в рублях.
При попытке изучить итоговый пакетный запрос печати в модуле менеджера документа может возникнуть путаница, так как в основном тексте запроса нет явных математических формул деления или умножения сумм на курс валюты. Разберем по шагам, откуда берутся рублевые значения, как устроена архитектура запросов печати и какими параметрами управляется пересчет.
В типовых конфигурациях 1С печать первичных документов строится модульно с использованием объекта МенеджерВременныхТаблиц. Перед выполнением основного запроса формирования макета система вызывает вспомогательные процедуры, которые подготавливают промежуточные временные таблицы:
ТаблицаДанныхДокументов — сохраняет ссылки, организации, склады и валюту документов из массива переданных объектов.РеализацияТоваровУслугТаблицаТоваров — формируется серверной процедурой (например, ПоместитьВременнуюТаблицуТоваров) и содержит обработанный состав номенклатуры, количество, ставки НДС и итоговые суммы.ТаблицаСчетовФактур и ТаблицаОтветственныеЛица — заполняют реквизиты подписантов и связанных счетов-фактур.Посмотрим на типовой фрагмент инициализации менеджера временных таблиц перед основным запросом:
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Запрос.Текст = "
|ВЫБРАТЬ
| ДанныеДокументов.Ссылка КАК Ссылка,
| ДанныеДокументов.Валюта КАК Валюта,
| ДанныеДокументов.Организация КАК Организация,
| ДанныеДокументов.Подразделение КАК Подразделение,
| ДанныеДокументов.Склад КАК Склад
|ПОМЕСТИТЬ ТаблицаДанныхДокументов
|ИЗ
| Документ.РеализацияТоваровУслуг КАК ДанныеДокументов
|ГДЕ
| ДанныеДокументов.Ссылка В (&МассивОбъектов)
|ИНДЕКСИРОВАТЬ ПО
| Ссылка
|;";
Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
Запрос.Выполнить();
ПоместитьВременнуюТаблицуТоваров(МенеджерВременныхТаблиц, Истина);
ПродажиСервер.ПоместитьВременнуюТаблицуСчетовФактур(МенеджерВременныхТаблиц);
ОтветственныеЛицаСервер.СформироватьВременнуюТаблицуОтветственныхЛицДокументов(МассивОбъектов, МенеджерВременныхТаблиц);
Главный секрет пересчета сумм кроется внутри процедуры ПоместитьВременнуюТаблицуТоваров. Система не умножает значения табличной части на курс ЦБ РФ на дату реализации «на лету» простым умножением. Согласно законодательству РФ и правилам бухгалтерского учета (ПБУ 3/2006, ст. 153 НК РФ), если по сделке были получены авансы, выручка и база по НДС рассчитываются по курсам на даты получения предоплат.
Поэтому конфигурация берет уже рассчитанные и зафиксированные при проведении рублевые суммы из регистра сведений РегистрСведений.СуммыДокументовВВалютеРегл (или СуммыДокументовВВалютахУчета в версиях 11.5+).
Проанализируем фрагмент запроса формирования временной таблицы РеализацияТоваровУслугТаблицаТоваров:
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.СуммыДокументовВВалютеРегл КАК СуммыДокументовВВалютеРегл
ПО
ТаблицаДокумента.Ссылка = СуммыДокументовВВалютеРегл.Регистратор
И ТаблицаДокумента.ИдентификаторСтроки = СуммыДокументовВВалютеРегл.ИдентификаторСтроки
И СуммыДокументовВВалютеРегл.Активность
И &ПересчитыватьВВалютуРегл
И далее в полях выборки:
ЕСТЬNULL(
СуммыДокументовВВалютеРегл.СуммаБезНДСРегл,
ТаблицаДокумента.СуммаСНДС - ТаблицаДокумента.СуммаНДС
) КАК СуммаБезНДС,
ЕСТЬNULL(
СуммыДокументовВВалютеРегл.СуммаНДСРегл,
ТаблицаДокумента.СуммаНДС
) КАК СуммаНДС
Когда параметр &ПересчитыватьВВалютуРегл установлен в Истина, условие соединения с регистром отрабатывает, и функция ЕСТЬNULL подставляет значения СуммаБезНДСРегл и СуммаНДСРегл (рубли). Если параметр равен Ложь, соединение не происходит, и запрос берет исходные валютные суммы прямо из табличной части документа.
В итоговом запросе печати цена рассчитывается расчетным путем: полученная рублевая сумма строки без НДС делится на количество товара. Рассмотрим фрагмент выборки финального запроса:
ВЫБОР
КОГДА &ВыводитьБазовыеЕдиницыИзмерения
ТОГДА ТаблицаДокумента.СуммаБезНДС / ТаблицаДокумента.Количество
ИНАЧЕ ТаблицаДокумента.СуммаБезНДС / ТаблицаДокумента.КоличествоУпаковок
КОНЕЦ КАК Цена
Так как в поле ТаблицаДокумента.СуммаБезНДС из временной таблицы уже пришла рублевая сумма, результат деления также дает цену единицы в рублях с учетом распределенных авансов.
Флаг пересчета устанавливается в коде модуля менеджера автоматически перед вызовом запросов печати на основании настроек договора и соглашения:
ПересчитыватьВВалютуРегл = Истина. Согласно ст. 169 НК РФ и Постановлению Правительства РФ № 1137, счет-фактура и УПД (со статусом 1) обязаны выставляться в рублях (код 643).ПересчитыватьВВалютуРегл = Ложь. УПД формируется в иностранной валюте.Если печатная форма выводит не те суммы или валюту, которую вы ожидаете, выполним следующие шаги:
СуммыДокументовВВалютеРегл могут быть неактуальны. В коде перед печатью типовая конфигурация запускает актуализацию:
ВзаиморасчетыСервер.ВыполнитьПроведениеДокументовПоРасчетамСКлиентами(МассивАналитикУчетаПоПартнерам);
ПересчитыватьВВалютуРегл = Ложь.