Внутренний счёт покупателя — это его личный денежный баланс внутри магазина, который хранится в модуле «Интернет-магазин» (sale) отдельно по каждой валюте. С него клиент оплачивает заказы, на него возвращаются средства при отмене, а магазин использует счёт для авансов, кэшбэка и переплат. Разберём, как он устроен, как настроить оплату и пополнение и как работать со счётом из кода.
Что такое внутренний счёт и зачем он нужен
Внутренний счёт — штатный механизм модуля «Интернет-магазин» (sale). Это баланс, привязанный к конкретному пользователю сайта и к валюте: у одного покупателя может быть несколько счетов — например, отдельно в рублях и отдельно в долларах. Деньгами на счёте клиент распоряжается так же, как средствами на депозите: тратит на оплату заказов, а магазин их туда зачисляет.
Типичные сценарии, ради которых счёт держат включённым:
- Авансовая модель — клиент кладёт сумму на счёт заранее и потом быстро оплачивает заказы без повторного ввода карты;
- Возвраты — при отмене оплаченного заказа деньги проще вернуть на внутренний счёт, а не гонять их обратно через банк;
- Кэшбэк и компенсации — начисления за акции, лояльность или в качестве извинения за проблему;
- Переплаты — остаток, если клиент заплатил больше, чем нужно.
Где хранится баланс и как он устроен
Балансы лежат в таблице b_sale_user_account. Одна строка — это связка «пользователь + валюта» с текущим остатком. Ключевые поля:
| Поле | Назначение |
|---|---|
USER_ID | ID пользователя-владельца счёта |
CURRENCY | Валюта счёта (RUB, USD и т. д.) |
CURRENT_BUDGET | Текущий остаток средств |
LOCKED | Заблокирован ли счёт (Y/N) |
NOTIFY | Уведомлять ли покупателя об изменениях |
Управляют счетами в административном разделе: Магазин → Покупатели → Счета покупателей. Там виден список пользователей с их балансами по валютам, можно вручную скорректировать сумму, заблокировать счёт или перейти к истории движений. Каждое изменение баланса порождает запись-транзакцию — её мы разбираем в отдельной статье о транзакциях по счёту.
Платёжная система «Внутренний счёт»
Чтобы покупатель мог платить балансом, нужна платёжная система с обработчиком «Внутренний счёт» (inner). Заводится она в разделе Магазин → Настройки → Платёжные системы: добавляете систему и выбираете системный обработчик внутреннего счёта.
Когда клиент оформляет заказ и выбирает этот способ оплаты, Битрикс проверяет остаток на счёте в валюте заказа и списывает нужную сумму с CURRENT_BUDGET. Оплата проходит мгновенно, без внешнего эквайринга.
- Валюта имеет значение — оплатить рублёвый заказ можно только с рублёвого счёта; кросс-валютного пересчёта на лету обработчик не делает.
- Недостаточно средств — если баланса не хватает, оплатить заказ этим способом система не даст; клиенту нужно сначала пополнить счёт.
- Ограничения показа — способ оплаты можно скрывать через ограничения платёжной системы, чтобы он не мозолил глаза гостям и незалогиненным.
USER_ID, поэтому гость без учётной записи оплатить со счёта не может. Убедитесь, что на шаге оформления заказа предусмотрена авторизация или регистрация.Как пополняется счёт
Пополнить внутренний счёт можно несколькими путями, и обычно магазин использует сразу все:
- Через платёжную систему. Покупатель в личном кабинете выбирает «пополнить счёт», оплачивает выбранную сумму картой или другим способом, и после подтверждения оплаты она зачисляется на
CURRENT_BUDGET. - Вручную администратором. В
Магазин → Покупатели → Счета покупателейменеджер корректирует баланс — например, начисляет компенсацию или заводит аванс, поступивший по безналу. - Автоматический возврат. При отмене оплаченного заказа деньги можно вернуть не на карту, а на внутренний счёт — это быстрее и удобнее для повторной покупки.
- Программно. Начисления по акциям, лояльности или интеграциям делаются через API модуля
sale.
Любое пополнение фиксируется транзакцией с типом операции и суммой, поэтому история баланса всегда прозрачна и её можно сверить.
Оплата заказа и возврат средств
При оплате заказа со счёта Битрикс уменьшает баланс на сумму заказа и помечает оплату как проведённую. Если заказ потом отменяют или оформляют возврат, средства логично вернуть обратно на внутренний счёт — тогда клиент сразу пустит их на новую покупку, а магазин избежит комиссий и задержек банковского возврата.
Что важно держать в голове:
- Оплата и отгрузка — разные флаги. Списание со счёта закрывает финансовую часть заказа, но статус доставки меняется отдельно.
- Частичная оплата. Счёт можно комбинировать с другими способами — часть суммы балансом, часть картой, если так настроен процесс.
- Возврат при отмене. Проследите, чтобы в сценарии отмены заказа деньги возвращались на счёт, а не «повисали»: это типовое место для ошибки в кастомных доработках оформления.
Работа со счётом через API
Программно балансом управляют средствами модуля sale. В классическом API это класс CSaleUserAccount, в D7 — таблица \Bitrix\Sale\Internals\UserAccountTable. Основные операции:
- Изменение баланса — метод
CSaleUserAccount::UpdateAccount()зачисляет или списывает сумму и одновременно создаёт транзакцию; - Оплата заказа —
CSaleUserAccount::Pay()списывает средства в счёт конкретного заказа; - Чтение остатка — выборка по
UserAccountTableс фильтром поUSER_IDиCURRENCY.
Правильный способ менять баланс — только через эти методы: они держат в согласии сумму в b_sale_user_account и запись в таблице транзакций.
UPDATE по b_sale_user_account обновит сумму, но не создаст транзакцию — история движений разъедется с фактическим остатком, и восстановить причину расхождения будет практически нечем.Внутренний счёт в личном кабинете
Покупатель видит свой баланс в личном кабинете магазина — в стандартных решениях за это отвечает компонент раздела «Внутренний счёт» с текущим остатком по валютам, историей операций и кнопкой пополнения. В шаблонных интернет-магазинах Битрикс этот раздел обычно уже собран.
Что стоит проверить и донастроить под свой магазин:
- Отображение по валютам — если магазин мультивалютный, покажите балансы раздельно, чтобы клиент не путался;
- Пополнение — кнопка должна вести на корректно настроенную платёжную систему пополнения;
- История — вывод транзакций помогает клиенту самому понять, откуда сумма, и снижает нагрузку на поддержку;
- Уведомления — почтовые события об изменении баланса включаются флагом
NOTIFY.
Итог
Внутренний счёт покупателя в 1С-Битрикс — это личный денежный баланс в модуле sale, хранящийся по валютам в таблице b_sale_user_account. Чтобы он заработал, нужны платёжная система с обработчиком «Внутренний счёт», понятные сценарии пополнения (оплата, ручная корректировка, возврат, API) и аккуратная работа с балансом — только через методы модуля, чтобы транзакции всегда сходились с остатком. В личном кабинете счёт делает повторные покупки быстрыми, а возвраты — безболезненными.
Если счёт нужно вписать в вашу схему оплат, связать с возвратами и учётной системой или починить разъехавшиеся балансы, мы в B2Bsite настраиваем эту механику под процессы магазина, аккуратно дорабатываем оформление заказа и увязываем зачисления с 1С и внешними сервисами.
Частые вопросы
Чем внутренний счёт отличается от бонусных баллов?
Счёт — это фактические деньги в валюте, которыми напрямую оплачивают заказ, они хранятся в таблице b_sale_user_account. Бонусы же начисляются по правилам программы лояльности и считаются отдельно, а не как денежный баланс.
Может ли гость без регистрации оплатить со счёта?
Нет. Баланс привязан к USER_ID конкретного пользователя, поэтому оплата с внутреннего счёта доступна только авторизованным покупателям. Гостю сначала нужно зарегистрироваться и войти.
Как включить оплату заказов с внутреннего счёта?
В разделе Магазин → Настройки → Платёжные системы добавьте платёжную систему с системным обработчиком «Внутренний счёт» (inner). После этого способ появится на шаге оплаты для авторизованных клиентов с достаточным балансом.
Что будет, если на счёте не хватает денег?
Оплатить заказ этим способом система не позволит, пока баланс меньше суммы заказа. Клиенту нужно сначала пополнить счёт или выбрать другой способ оплаты, либо доплатить разницу картой при частичной оплате.
Можно ли иметь счета в разных валютах?
Да. Внутренний счёт привязан к паре «пользователь + валюта», поэтому у одного покупателя может быть несколько балансов — например, отдельно в рублях и в долларах. Оплатить заказ можно только счётом в валюте этого заказа.
Куда вернутся деньги при отмене оплаченного заказа?
Их можно вернуть на внутренний счёт покупателя — это быстрее банковского возврата и удобно для повторной покупки. Такой сценарий возврата настраивается в процессе отмены заказа.
Как правильно менять баланс из кода?
Только через API модуля sale: CSaleUserAccount::UpdateAccount() и ::Pay() либо \Bitrix\Sale\Internals\UserAccountTable. Эти методы одновременно меняют остаток и создают транзакцию, сохраняя историю согласованной.
Почему нельзя обновлять сумму счёта прямым запросом в БД?
Прямой UPDATE по b_sale_user_account изменит остаток, но не создаст запись-транзакцию. История движений разойдётся с фактическим балансом, и найти причину расхождения будет практически невозможно.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.