Настройка обмена договорами контрагентов 1С и 1С-Битрикс
В B2B интернет-магазинах и оптовых порталах договоры — это не просто документы. Договор определяет: по какой цене работает клиент, какой кредитный лимит, какие условия доставки. Без передачи договоров из 1С в Битрикс сайт не может показать корректные цены и условия для конкретного контрагента.
Роль договора в 1С
В УТ, КА и ERP договор контрагента (ДоговорыКонтрагентов) — ключевой объект ценообразования. С договором связаны:
- Вид цены — какой прайс применяется к этому клиенту
- Скидки — персональные скидки или скидки по договору
- Валюта расчётов
- Кредитный лимит и срок кредита
- Условия оплаты (предоплата, постоплата, дней отсрочки)
Если в 1С у клиента 3 действующих договора (например, розничный, оптовый и специальный), на сайте он должен видеть цены по нужному договору и иметь возможность выбрать договор при оформлении заказа.
Передача договоров: архитектура
Стандартный CommerceML не передаёт договоры. Нужна кастомная синхронизация через HTTP-сервис 1С или через файловый обмен.
Минимальный набор данных договора для сайта:
{
"guid": "a1b2c3d4-1234-...",
"number": "Д-2024-0015",
"name": "Договор поставки №15 от 01.03.2024",
"contractor_guid": "контрагент-guid",
"price_type_guid": "вид-цены-guid",
"price_type_name": "Оптовая",
"credit_limit": 500000,
"payment_delay_days": 14,
"currency": "RUB",
"valid_from": "2024-03-01",
"valid_to": "2025-03-01",
"is_active": true
}
В Битрикс договоры хранятся в HighloadBlock ContractorContracts. При открытии каталога — определяется активный договор пользователя, к нему привязывается тип цены в торговом каталоге.
Маппинг договора на цену в Битрикс
Ключевая задача: пользователь с определённым договором должен видеть цены из связанного вида цен.
Реализация:
- При авторизации пользователя — определяем его договор(а) из HighloadBlock
- Определяем тип цены по договору (
price_type_guid→ ID типа цены в Битрикс) - Устанавливаем сессионную переменную или пользовательский параметр
CURRENT_PRICE_TYPE - Компонент каталога читает эту переменную и выводит цены нужного типа
Если у пользователя несколько договоров — предоставляем выбор в личном кабинете: «Работать по договору №...». Выбор сохраняется в сессии.
Синхронизация договоров: периодичность
Договоры меняются редко — новый договор подписывается раз в год, условия пересматриваются раз в квартал. Достаточно синхронизировать раз в час или даже раз в сутки.
Но есть критичный сценарий: договор расторгнут или истёк — клиент не должен продолжать видеть оптовые цены. Для этого в логику авторизации добавляем проверку valid_to договора. Если дата истекла — переводим пользователя на базовый тип цены.
Договор при оформлении заказа
При передаче заказа из Битрикс в 1С нужно указать договор, по которому выставляется заказ. В XML заказа:
<ЗначениеРеквизита>
<Наименование>ДоговорId</Наименование>
<Значение>a1b2c3d4-1234-...</Значение>
</ЗначениеРеквизита>
В УТ при создании заказа покупателя договор берётся из этого реквизита. Без договора — заказ создаётся по умолчанию (первый активный договор контрагента), что может привести к неверному ценообразованию в документах 1С.
Кейс: дистрибьютор с индивидуальными условиями
Дистрибьютор медицинского оборудования: 180 дилеров, у каждого — индивидуальный договор со своей ценой (скидка от 5% до 40% от розницы). Все цены ведутся в УТ как отдельные виды цен на каждого дилера (18 видов цен).
Задача на сайте: каждый дилер при входе видит только свои цены, цены других дилеров недоступны.
Реализация:
- Синхронизация договоров из УТ в Битрикс — раз в 2 часа
- При авторизации — определяется договор, из него берётся GUID вида цены
- GUID маппится на тип цены в Битрикс (таблица маппинга в настройках)
- Каталог показывает цены нужного типа
Дополнительно: у каждого дилера есть «менеджер-куратор» в УТ. При создании заказа на сайте — в заказ автоматически добавляется менеджер (из поля договора ОтветственныйМенеджер). Менеджер в УТ сразу видит заказ своего клиента.
Срок действия и автоматическое продление
Если договор истекает — за N дней до истечения отправляем уведомление ответственному менеджеру в Битрикс24 (через REST API). Регламентное задание в Битрикс проверяет valid_to всех договоров ежедневно.
// Агент проверки срока действия договоров
function checkContractExpiry() {
$soon = date('Y-m-d', strtotime('+30 days'));
$contracts = getContractsExpiringBefore($soon);
foreach ($contracts as $contract) {
notifyManager($contract['manager_id'], $contract);
}
return 'checkContractExpiry()'; // агент перезапускается
}







