В 1С-Битрикс оплата заказа — это не одно поле, а отдельная сущность Payment внутри коллекции оплат заказа. Понимание этой модели снимает большинство вопросов: почему заказ считается оплаченным, откуда берётся статус PAID и как корректно провести оплату руками, не сломав учёт.
Разберём объектную модель D7, работу с внутренним счётом и бонусами, ручное проставление оплаты в админке и связку с платёжными системами.
Модель оплат: заказ и коллекция Payment
В ядре продаж (модуль sale) заказ описывается объектом Bitrix\Sale\Order. Деньги живут не в самом заказе, а в дочерней коллекции — PaymentCollection, которую возвращает метод $order->getPaymentCollection(). Каждый элемент коллекции — это объект Bitrix\Sale\Payment, то есть одна конкретная оплата.
Такая архитектура заложена намеренно: на один заказ можно повесить несколько оплат. Классический сценарий — предоплата 30% онлайн и доплата при получении, или оплата частью бонусов и частью картой. Каждая оплата хранит свою сумму (SUM), привязку к платёжной системе (PAY_SYSTEM_ID) и собственный флаг оплаченности.
Общая логика — заказ, коллекция оплат, коллекция отгрузок и коллекция корзины — обрабатывается транзакционно: изменения фиксируются одним вызовом $order->save(). Отдельно сохранять Payment в обход заказа не нужно и не рекомендуется.
b_sale_order_payment, а сам заказ — в b_sale_order. Работать с ними напрямую через SQL не стоит: обходятся обработчики событий и пересчёт статусов.Флаг PAID и статус оплаты заказа
У каждой оплаты есть булево поле PAID (значения Y/N). Именно оно определяет, засчитана ли конкретная оплата. Устанавливается флаг не присваиванием напрямую, а методом $payment->setPaid('Y') — так запускается корректная бизнес-логика: фиксируется дата оплаты (DATE_PAID), пользователь-плательщик и суммируется оплаченное по заказу.
На уровне всего заказа есть агрегирующее поле PAYED (историческое написание в API — именно так). Заказ переходит в состояние оплачен, когда суммарно оплаченные Payment покрывают сумму заказа. Проверить это можно методом $order->isPaid().
$payment->isPaid()— оплачена ли отдельная оплата;$order->isPaid()— считается ли оплаченным весь заказ;$order->getSumPaid()— сколько уже оплачено по заказу.
PAID = Y прямым UPDATE в БД или присваиванием поля. В этом случае не сработают события OnSalePaymentEntitySaved, не спишутся бонусы, не отправятся уведомления и не пробьётся чек по 54-ФЗ.Ручное проставление оплаты в админке
Оператор проводит оплату вручную, когда деньги пришли мимо онлайн-эквайринга: наличными, по банковскому счёту или переводом. Делается это в детальной карточке заказа: Магазин → Заказы → [заказ] → вкладка «Оплата».
- Открываете блок оплаты (или добавляете новую оплату, если её ещё нет).
- Выбираете платёжную систему — например, «Оплата наличными» или «Банковский перевод».
- Переключаете статус в «Оплачено» и сохраняете заказ.
После сохранения Битрикс проставит PAID = Y, зафиксирует дату и пересчитает статус заказа. Если магазин работает с онлайн-кассой, в этот момент штатно формируется чек прихода. Ручная отметка оплаты — легитимный и штатный механизм, а не «костыль»: он проходит по той же бизнес-логике, что и автоматическое зачисление от платёжной системы.
sale. Менеджеру без нужного уровня доступа переключатель статуса будет недоступен — это защищает учёт от случайных отметок.Внутренний счёт и бонусы
Отдельная платёжная система в Битрикс — внутренний счёт покупателя (обработчик inner). Это виртуальный кошелёк: баланс хранится в таблице b_sale_user_account и в объекте Bitrix\Sale\Internals\UserAccount. Покупатель пополняет счёт, а затем оплачивает им заказы полностью или частично.
Технически оплата внутренним счётом — это обычный Payment с PAY_SYSTEM_ID, указывающим на платёжную систему типа «Внутренний счёт». При установке setPaid('Y') ядро само списывает средства с баланса пользователя, а при отмене оплаты — возвращает их. Ручное «жонглирование» балансом через SQL приводит к рассинхрону между b_sale_user_account и историей транзакций.
- Бонусы в редакции «Бизнес» — это тот же механизм внутреннего счёта, только пополняемый по правилам лояльности;
- частичная оплата счётом хорошо сочетается с доплатой картой — две оплаты на один заказ;
- возврат средств на внутренний счёт удобнее возврата на карту: деньги остаются в обороте магазина.
Связь с платёжными системами
Каждая оплата ссылается на платёжную систему через PAY_SYSTEM_ID. Настраиваются они в Магазин → Настройки → Платёжные системы. Одна платёжная система — это набор из бизнес-значения (наличные, безнал, ЮKassa, СБП и т. п.) и обработчика, который умеет формировать форму оплаты и принимать ответ от эквайринга.
Для онлайн-систем ключевую роль играет обработчик результата — служебная страница, которую платёжный шлюз дёргает после успешной транзакции (callback / уведомление). Именно этот запрос, а не редирект покупателя, инициирует setPaid('Y'). Поэтому оплата фиксируется даже если клиент закрыл вкладку, не вернувшись на сайт.
| Тип оплаты | Как проставляется PAID | Когда виден статус |
|---|---|---|
| Онлайн-эквайринг | Автоматически по уведомлению шлюза | Через секунды после платежа |
| Внутренний счёт / бонусы | Списанием баланса при setPaid | Сразу при оформлении |
| Наличные, банковский перевод | Вручную оператором в админке | После отметки менеджера |
События и учёт: где всё стыкуется
Смена статуса оплаты — точка, к которой привязана вся сопутствующая автоматика. При сохранении заказа ядро вызывает события модуля sale, на которые подписываются другие подсистемы и ваш код.
OnSaleOrderPaid/OnSalePaymentEntitySaved— оповещение об оплате: сюда вешают отправку в 1С, письма, задачи в CRM;- онлайн-касса формирует чек прихода именно по факту
setPaid; - обмен с 1С выгружает признак оплаты — важно, чтобы учёт на сайте и в учётной системе совпадал.
Отсюда практическое правило: оплата и отгрузка — независимые сущности. Заказ может быть оплачен, но не отгружен, и наоборот. Не пытайтесь связать их одним статусом заказа — используйте isPaid() и статус отгрузки раздельно, а бизнес-правила стройте на событиях.
Итог
Оплата в 1С-Битрикс — это коллекция объектов Payment внутри заказа: несколько оплат на заказ, флаг PAID у каждой, агрегирующий признак оплаченности у заказа. Проставлять оплату нужно только через API (setPaid) или штатную админку — тогда корректно спишутся бонусы, пробьётся чек и уйдёт обмен с 1С. Внутренний счёт и бонусы — это те же оплаты, но с виртуальным балансом, а платёжные системы фиксируют оплату по серверному уведомлению, а не по редиректу покупателя.
Мы в B2Bsite настраиваем платёжные системы, увязываем оплаты с онлайн-кассой и обменом с 1С, чиним «зависающие» оплаты и дорабатываем сценарии предоплаты и рассрочки. Если учёт оплат в вашем магазине расходится с реальностью — поможем найти и устранить причину.
Частые вопросы
Можно ли в Битрикс сделать несколько оплат на один заказ?
Да. Заказ содержит коллекцию оплат PaymentCollection, и в неё можно добавить сколько угодно объектов Payment. Так реализуют предоплату с доплатой или смешанную оплату счётом и картой.
Как правильно проставить оплату вручную?
В карточке заказа на вкладке «Оплата» выберите платёжную систему и переключите статус в «Оплачено», затем сохраните заказ. Битрикс сам выставит PAID=Y, зафиксирует дату и пересчитает статус.
Чем поле PAID отличается от PAYED?
PAID — флаг оплаченности отдельной оплаты Payment, а PAYED (историческое написание) — агрегирующий признак у всего заказа. Заказ считается оплаченным, когда суммы оплат покрывают сумму заказа.
Почему нельзя выставить PAID через прямой UPDATE в базе?
При прямом изменении в БД не срабатывают события модуля sale: не спишутся бонусы, не отправятся уведомления, не пробьётся кассовый чек и не уйдёт признак оплаты в 1С. Используйте метод setPaid.
Что такое внутренний счёт покупателя?
Это виртуальный кошелёк с балансом в таблице b_sale_user_account. Покупатель пополняет его и оплачивает заказы полностью или частично. Оплата счётом — обычный Payment, при setPaid ядро само списывает средства.
Бонусы — это отдельный механизм?
В редакции «Бизнес» бонусы реализованы через тот же внутренний счёт, пополняемый по правилам лояльности. Технически это оплата внутренним счётом, поэтому списание и возврат работают штатно.
Почему онлайн-оплата не отметилась, хотя деньги списаны?
Скорее всего, до сайта не дошло серверное уведомление платёжной системы (callback): обработчик результата закрыт правами доступа, .htaccess или указан неверный внешний URL. Проверьте доступность страницы обработчика.
Связаны ли статус оплаты и статус отгрузки?
Нет, это независимые сущности. Заказ может быть оплачен, но не отгружен, и наоборот. Проверяйте оплату через isPaid(), а отгрузку — отдельно по статусу Shipment.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.