Настройка двусторонней синхронизации 1С и 1С-Битрикс
Двусторонняя синхронизация — технически самая сложная схема обмена: изменения в любой из систем должны попасть в другую без потери данных и без конфликтов версий. Стандартный CommerceML частично покрывает эту задачу (каталог из 1С + заказы в 1С), но полноценный двусторонний обмен требует чёткого определения правил приоритета.
Правила приоритета — фундамент двустороннего обмена
До начала разработки ответить на вопросы:
| Поле | Мастер-система | Обоснование |
|---|---|---|
| Цена | 1С | Финансовый учёт в 1С |
| Остатки | 1С | Складской учёт в 1С |
| Описание товара | Сайт | SEO-контент пишется на сайте |
| Фото товара | Сайт | Фотографии загружаются в медиатеку сайта |
| Статус заказа | 1С | Заказ исполняется в 1С |
| Адрес доставки | Сайт | Покупатель вводит на сайте |
| Реквизиты покупателя | 1С | Юридически значимые данные в 1С |
Нарушение этих правил ведёт к «мерцанию» данных: 1С перезаписывает описание → редактор исправляет → 1С снова перезаписывает.
Реализация через обработчики событий
На стороне сайта — контроль полей при импорте из 1С:
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'iblock',
'OnIBlockElementBeforeUpdate',
function(\Bitrix\Main\Event $event) {
$fields = $event->getParameter('fields');
$elementId = $event->getParameter('id');
// Получить список защищённых полей для этого элемента
$protected = getProtectedFields($elementId);
foreach ($protected as $fieldCode) {
unset($fields[$fieldCode]);
}
return new \Bitrix\Main\EventResult(
\Bitrix\Main\EventResult::SUCCESS,
['fields' => $fields]
);
}
);
Обнаружение конфликтов
Конфликт версий возникает, когда одно поле изменилось в обеих системах между сеансами обмена. Обнаружение через timestamp последнего изменения:
// Хранить в доп. поле элемента время последнего обновления с сайта
$lastSiteUpdate = $element['UF_LAST_SITE_UPDATE']; // timestamp
$lastExchangeUpdate = $element['UF_LAST_EXCHANGE_UPDATE']; // timestamp из 1С
if ($lastSiteUpdate > $lastExchangeUpdate) {
// Поле изменялось на сайте после последнего обмена — не перезаписывать
}
Кейс: двусторонняя синхронизация для дистрибьютора
Компания-дистрибьютор, 15 000 SKU. 1С ведёт цены и остатки, сайт — описания и SEO. Два раза в год — переоценка в 1С: меняются цены на 80% ассортимента. До настройки двустороннего обмена при переоценке цены обновлялись, но одновременно перезаписывались SEO-описания, написанные копирайтерами.
Решение: поле DETAIL_TEXT внесено в «защищённый список» через пользовательское свойство UF_PROTECT_DESCRIPTION. При обмене обработчик проверяет флаг и пропускает перезапись описания, но применяет обновление цены. После внедрения — ни одного случая потери SEO-контента за 8 месяцев эксплуатации.
Синхронизация изображений
Изображения — отдельная сложность в двустороннем обмене. Если 1С передаёт изображения через CommerceML (<Картинки>), а сайт имеет дополнительную галерею с ретушированными фото:
- Основное изображение (
PREVIEW_PICTURE) — защитить, если есть флаг «обработано фотографом» - Дополнительные изображения из 1С — добавлять, но не удалять фото с сайта
Сроки настройки
| Задача | Срок |
|---|---|
| Двусторонний обмен с правилами приоритета | 2–4 дня |
| + детектирование конфликтов версий | +1–2 дня |
| + двусторонняя синхронизация пользователей | +1–2 дня |







