При работе в программе 1С:Управление нашей фирмой (УНФ) пользователи часто сталкиваются с ограничением: при создании Заказа покупателя выбор валюты жестко ограничен либо валютой, указанной в договоре, либо национальный валютой (рублями), если включена соответствующая настройка. Попытка выставить счет в «третьей» валюте, которая не фигурирует в параметрах договора, штатными средствами невозможна. Разберем подробно, почему так происходит, какие методологические принципы лежат в основе этого ограничения и как эффективно решать задачи мультивалютного учета в рамках системы.
Для начала проанализируем ситуацию с точки зрения архитектуры системы. В 1С Договор является ключевым объектом аналитики в регистрах накопления, отвечающих за взаиморасчеты. Система обязана четко понимать, в какой валюте фиксируется задолженность клиента, чтобы корректно рассчитывать курсовые разницы.
Рассмотрим, что произойдет, если разрешить внутри одного договора использовать произвольный набор валют. В этом случае автоматический расчет финансового результата станет невозможным. Формула курсовой разницы в 1С выглядит следующим образом:
(Остаток в валюте * Актуальный курс) - Остаток в рублях = Курсовая разница
Если в рамках одной карточки договора будут висеть долги в евро, долларах и юанях одновременно, система не сможет однозначно определить, к какому именно «валютному куску» относится поступившая оплата в рублях. Это приведет к хаосу в отчетности и неверному расчету прибыли. Именно поэтому разработчики 1С:УНФ заложили жесткую связь: один договор — одна валюта расчетов. Это защищает данные от ошибок, которые неизбежно допустили бы 99,9% пользователей при свободном выборе валют.
Выясним причину появления возможности выбора рублей в валютных договорах. Если в настройках договора с контрагентом установить признак Расчеты в у.е. (в современных версиях это режим «В валюте, оплата в рублях»), программа позволяет выбрать в документе либо валюту договора, либо рубли. Рассмотрим подробнее этот механизм:
Таким образом, режим у.е. — это компромисс, позволяющий выписывать документы в рублях по курсу валюты на дату отгрузки, но не позволяющий использовать любую другую иностранную валюту, кроме той, что указана в договоре.
Проанализируем наиболее правильный и «чистый» с точки зрения методологии 1С способ решения задачи. Если ваш клиент хочет закупать товары в разных валютах, мы рекомендуем завести для него отдельные договоры под каждую валюту. Например:
Посмотрим на преимущества этого подхода:
Если клиент отказывается «плодить» договоры, стоит объяснить ему, что в 1С объект Договор — это не столько юридическая бумага с печатью, сколько аналитический разрез учета. Для системы это разные финансовые потоки, которые нельзя смешивать.
Разберем ситуацию, когда валюта взаиморасчетов — доллары (USD), а документ нужно выставить в евро (EUR). На форумах часто предлагают «просто добавить выбор валюты» в документ. Однако выясним, как в этом случае система будет считать долг. В 1С:УНФ все расчеты идут через базовую валюту (в нашем случае — рубль).
Рассмотрим пример расчета:
Возникает вопрос: будет ли полученный кросс-курс EUR/USD через рубль соответствовать реальному рыночному курсу? Как правило, в системе 1С расчет кросс-курсов реализован именно через отношение курсов к национальной валюте. Если в справочнике Валюты для евро и доллара установлена загрузка из интернета, то программа автоматически вычислит пропорцию. Однако любые ручные корректировки курсов могут привести к копейкам разницы при пересчетах, которые «повиснут» на взаиморасчетах.
Если бизнес-процессы компании категорически требуют возможности выбора любой валюты в заказе, рассмотрим вариант доработки. Для этого в расширении необходимо добавить реквизит ВалютаДокумента и переопределить логику формирования печатных форм и проведения документа по регистрам.
Посмотрим на пример логики, которую придется реализовать в коде (концептуально):
// При изменении валюты в документе, отличной от валюты договора
Процедура ПриИзмененииВалютыДокумента()
КурсДокумента = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ДатаДокумента, ВалютаДокумента);
КурсДоговора = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ДатаДокумента, Договор.ВалютаРасчетов);
// Рассчитываем коэффициент пересчета через рубли
Коэффициент = КурсДокумента.Курс / КурсДоговора.Курс;
// Пересчитываем суммы в табличной части
Для Каждого Строка Из ТабличнаяЧастьТовары Цикл
Строка.Цена = Строка.Цена * Коэффициент;
КонецЦикла;
КонецПроцедуры
Важно: Подобная доработка крайне опасна. Она потребует изменения механизмов проведения по регистру Запасы и продажи и Взаиморасчеты. Большинство специалистов сходятся во мнении, что стоимость такой доработки и риски ошибок в учете значительно превышают неудобства от создания «клонов» договоров.
Проанализировав проблему, мы приходим к следующим выводам:
Договоры дополнительные теги или группы для быстрой фильтрации.Заказ программа автоматически пересчитает цену из валюты прайса в валюту договора по актуальному курсу. Это часто решает проблему «выставления счета в другой валюте» без нарушения структуры договора.Таким образом, ограничение в УНФ — это не ошибка разработчиков, а сознательное решение для обеспечения стабильности и простоты управленческого учета для малого и среднего бизнеса.