Показать цену в долларах и принять оплату в долларах - разные задачи, и вторая почти всегда упирается не в сайт, а в банк и валютное законодательство. Разбираем по порядку: что решается вёрсткой, а что требует отдельного разговора с бухгалтерией.
Вопрос обычно приходит с двух сторон: магазин продаёт за рубеж и хочет показать понятную цену покупателю в Германии или Казахстане, либо российский бизнес закупает товар за валюту и хочет, чтобы цена на сайте не отставала от курса закупки. Запрос звучит одинаково, а решения нужны разные.
Три задачи, которые прячутся под одним словом "валюта"
Витрина. Показать цену в валюте посетителя - оформительская задача: взять курс, пересчитать, вывести рядом с рублёвой ценой или вместо неё. Дороже всего здесь стоит не разработка, а то, откуда брать курс и как его обновлять.
Приём оплаты. Провести платёж в долларах или евро - это уже про эквайринг, валютный расчётный счёт и банк-эквайер, который умеет работать с зарубежными картами. Сайт передаёт сумму платёжному шлюзу, а дальше работает банковская инфраструктура, к которой сайт отношения не имеет.
Учёт и отчётность. Бухгалтерия ведётся в рублях, даже если цена показана в евро, а оплата принята в долларах. Валютная выручка пересчитывается в рубли по курсу ЦБ на дату поступления, и это забота бухгалтера, а не разработчика.
Просьба "сделать мультивалютность" почти всегда означает только первую задачу - витрину. Вторую и третью решают банк и бухгалтерия, сайт здесь лишь передаточное звено.
Откуда брать курс и почему "по курсу ЦБ" может подвести
Три источника курса дают разный результат. Курс ЦБ РФ - справочный и официальный, публикуется раз в сутки и не включает банковскую комиссию за конвертацию. Биржевой курс меняется в течение дня, но для витрины интернет-магазина избыточно точен. Свой фиксированный курс - тот, который продавец задаёт вручную с запасом сверху и меняет по расписанию, например раз в неделю.
Витрине обычно нужен именно третий вариант. Опасность "цены по курсу ЦБ" проявляется при резком скачке: ночью курс подскочил на 5-7 процентов, а магазин ещё сутки продаёт по вчерашней цене, потому что обновление идёт с задержкой или его вовсе нет. При заказе за валюту фактический платёж пройдёт по новому курсу, и разница ляжет на продавца. Собственный курс с запасом 2-4 процента снимает этот риск и не требует ежедневного пересчёта.
Округление, которое портит красивую цену
Пересчёт по курсу почти никогда не даёт круглое число. Товар за 4 990 рублей при курсе 95 рублей за доллар превращается в 52,53 доллара - и это единственный технически честный вариант, но неудобный визуально и для расчёта.
Решают это правилом округления, зафиксированным заранее: до целого числа, до 0,99 или до пятёрки на конце. Правило должно быть одно на весь каталог, иначе разные товары округляются по-разному и расхождение с рублёвой ценой становится заметным при пересчёте назад. Отдельно стоит решить, округлять вверх, в пользу продавца, или к ближайшему значению: если курс уже взят с запасом, округление вверх обычно не нужно - запас его перекрывает.
Правовая сторона: рубли, резиденты и валютный контроль
Расчёты между резидентами РФ по общему правилу ведутся в рублях. Продать товар физлицу-россиянину напрямую за доллары, минуя рубли, - нарушение валютного законодательства с редкими исключениями вроде дьюти-фри. Поэтому на витрине для российских покупателей валютная цена почти всегда работает как справочная: рядом или вместо неё печатается формулировка "оплата в рублях по курсу на день заказа", а фактическое списание идёт в рублях.
Другое дело - экспорт, продажа за рубеж нерезиденту. Здесь расчёты в валюте законны и обычны, но появляется валютный контроль: банк требует контракт или инвойс на сумму сделки, а по крупным суммам - постановку на учёт контракта. Это процедура банка, а не сайта, но она определяет, какие документы должны появиться в оформлении заказа - счёт с реквизитами на английском, инвойс, иногда упрощённая декларация. Формировать их сайт не обязан, но должен собрать исходные данные для бухгалтерии: страну доставки, назначение платежа, реквизиты получателя.
Переключатель валют и определение по стране
Валюту можно определять по геолокации посетителя автоматически - это удобно, но раздражает, если делается молча. Правило простое: определять валюту по умолчанию можно, менять её без спроса нельзя. Посетитель должен видеть переключатель и понимать, что валюту можно сменить руками, а выбор - запомнить в cookie на следующий визит.
Молчаливая подмена валюты особенно вредна на кэшированных страницах: если сервер отдаёт одну и ту же HTML-страницу всем посетителям, а валюта проставляется на сервере по IP при первом заходе, кэш быстро "запоминает" валюту первого посетителя и показывает её всем остальным. Правильная схема - определять валюту в браузере после загрузки страницы и пересчитывать цену на клиенте: тогда кэш остаётся общим, а выбор персональным.
Как хранить цену, чтобы не переругаться с кэшем
Базовая цена товара должна храниться в одной валюте - обычно в рублях, если основная аудитория российская, или в долларах, если бизнес экспортный. Все остальные валюты на витрине - это пересчёт при выводе, а не отдельное поле в базе.
Дублировать прайс по валютам проще на старте, но схема ломается при первом же обновлении курса: администратор меняет цену в одной валюте и забывает про остальные. Пересчитывать цену при выводе надёжнее: курс меняется в одном месте - в настройках или в отдельной таблице - и применяется ко всему каталогу сразу.
С кэшем страниц это тоже дружит лучше: HTML кэшируется с ценой в базовой валюте или вообще без цены в разметке, а конкретное значение в выбранной валюте подставляется скриптом на странице. Чуть больше работы на старте - зато не приходится сбрасывать кэш при каждом движении курса.
Что реально доступно из способов оплаты и что ещё нужно для экспорта
Из способов принять валютную оплату на практике работают: зарубежный платёжный шлюз, подключённый к валютному счёту; счёт-инвойс с оплатой банковским переводом, частый вариант для B2B-экспорта; оплата через маркетплейс или агрегатора, который берёт валютные расчёты на себя. У каждого варианта своя комиссия и пакет документов, и выбор чаще определяет банк, а не сайт. Про рублёвые способы приёма платежей писали в статье про эквайринг для интернет-магазина; для внутренних заказов пригодится и оплата по QR через СБП - валюты она не касается, но часто нужна на том же сайте параллельно.
Экспорт редко ограничивается только валютой. К витрине почти всегда добавляется сайт на нескольких языках - хотя бы английская версия для большинства зарубежных покупателей, привычные покупателю единицы измерения (дюймы вместо сантиметров, фунты вместо килограммов), расчёт международной доставки и условия поставки Инкотермс в описании товара. При продажах в конкретные страны стоит отдельно оценить мультирегиональную структуру сайта - она решает, показывать ли разным странам разные разделы или обходиться одним каталогом с переключателями.
Когда мультивалютность не нужна
Мультивалютность оправдана не всегда, и это стоит проверить до того, как заказывать доработку.
- Заказов из-за рубежа за последний год было меньше десятка - хватит строки "цена указана в рублях, для оплаты из другой страны свяжитесь с нами".
- Иностранные покупатели и так платят картой через агрегатор, который сам показывает им их валюту на своей странице оплаты - переключатель на сайте задваивает то, что уже решено.
- Каталог меняется редко, а курс волатилен - тогда постоянное обновление валютных цен создаёт больше работы, чем экономит.
- Бизнес работает только с юрлицами по счёту - валюта в договоре и инвойсе решается индивидуально на каждую сделку, и общая витрина в валюте не нужна вовсе.
Если ни один пункт не подошёл, порядок такой: выбрать валюту хранения цены, определить источник курса и правило округления, поставить переключатель с запоминанием выбора, проверить поведение с кэшем страниц и отдельно обсудить с банком валютный счёт и платёжный шлюз, если предстоит реальный приём оплаты в валюте.
С какого шага начинать, если решили продавать за рубеж
Начинать стоит не с виджета переключения валют, а с ответа на вопрос, что именно нужно: показать цену иностранцу, принять от него деньги или и то и другое. Витрина в валюте - доработка на несколько дней. Приём валютной оплаты - это уже банк, договор с платёжным шлюзом и валютный счёт, и сайт здесь только один из участников. Разделив задачи заранее, проще понять, сколько времени и денег уйдёт на самом деле, и не удивляться, когда простой на вид виджет упирается в переговоры с банком.
Если готовите сайт под экспорт и не уверены, с какого решения начать - от переключателя валют до выбора платёжной системы, можно посмотреть, как эти задачи решались на похожих проектах, в наших кейсах.

