Діагностика та усунення помилок обміну 1С і 1С-Бітрікс
Обмін зламався — товари не оновлюються, замовлення не потрапляють у 1С. Стандартна ситуація для будь-якого магазину, що працює довше півроку. Проблема в тому, що повідомлення про помилки в CommerceML-обміні нечіткі, а причин може бути десятки. Нижче — систематичний підхід до діагностики.
Перша точка діагностики: лог обміну в Бітрікс
Магазин → Журнал обміну з 1С — перше місце для перевірки:
- Зелений рядок — обмін пройшов успішно
- Червоний рядок — помилка, розкрити для деталей
- Відсутність записів — обмін не запускався (проблема в розкладі або авторизації)
Типові повідомлення та їх значення:
| Повідомлення | Причина |
|---|---|
Невірний логін або пароль |
Користувач обміну заблокований або змінився пароль |
Невірна відповідь сервера |
HTTP 500 на 1c_exchange.php, дивитися PHP error_log |
Не знайдено властивість PROP_XXX |
Властивість видалено на сайті, але 1С все ще її передає |
Перевищено ліміт часу |
Таймаут PHP при розборі великого XML |
Помилка розбору XML |
Пошкоджений файл або неправильне кодування |
Діагностика через прямий запит
Перевірити роботу endpoint вручну через curl або Postman:
# Крок 1: авторизація
curl -c cookies.txt \
"https://myshop.ua/bitrix/admin/1c_exchange.php?type=catalog&mode=checkauth" \
-u "login:password"
# Крок 2: ініціалізація
curl -b cookies.txt \
"https://myshop.ua/bitrix/admin/1c_exchange.php?type=catalog&mode=init"
Відповідь success на перший запит — авторизація працює. Відповідь failure — перевірити права користувача та статус облікового запису.
Помилки типу «товари задвоїлися»
Найнеприємніша ситуація: після обміну кількість товарів в інфоблоці подвоїлася. Причина — змінилися GUID-ідентифікатори товарів у 1С (перенос бази, реструктуризація), Бітрікс не знайшов наявні елементи за ID і створив нові.
Діагностика:
SELECT XML_ID, COUNT(*) as cnt
FROM b_iblock_element
WHERE IBLOCK_ID = :iblock_id
GROUP BY XML_ID
HAVING cnt > 1;
Дублі: записи з однаковим XML_ID або схожим артикулом, різним ID.
Усунення:
- Знайти відповідність старих і нових GUID через артикул або штрих-код
- Оновити
XML_IDу наявних елементів на нові GUID із 1С - Деактивувати (не видаляти) дублі
- Запустити обмін повторно — тепер 1С знайде елементи за коректним XML_ID
Помилки при обміні замовленнями
Замовлення не потрапляють у 1С. Перевірити:
- У налаштуваннях обміну на сайті увімкнена опція «Вивантажувати замовлення»
- Статус замовлення включено до списку статусів для вивантаження
- Користувач обміну має доступ до модуля
sale
1С створює замовлення з «невідомою номенклатурою». Товар у замовленні не має властивості CML2_LINK з GUID із 1С. Таке буває для товарів, створених вручну на сайті. Рішення — вручну заповнити CML2_LINK або виключити такі товари з передачі в 1С.
Проблеми з кодуванням
1С у старих конфігураціях може вивантажувати Windows-1251. Ознака — кракозябри в назвах товарів після імпорту.
// В обробнику події перед імпортом
if (!mb_detect_encoding($xmlContent, 'UTF-8', true)) {
$xmlContent = mb_convert_encoding($xmlContent, 'UTF-8', 'Windows-1251');
}
У нових версіях УТ проблема усунена — вивантаження завжди в UTF-8.
Кейс: «зниклі» товари після планових робіт
Хостинг-провайдер переніс базу даних на новий сервер з іншою версією MySQL. Після переносу — обмін пройшов, але 12% товарів «зникли» з сайту (статус ACTIVE = N). Причина: при переносі кілька тисяч значень XML_ID отримали зайві пробіли через різницю в обробці полів CHAR і VARCHAR. Бітрікс не знайшов елементи за XML_ID із пробілом — створив нові, старі деактивував.
Діагностика показала проблему за 15 хвилин (SELECT * FROM b_iblock_element WHERE XML_ID LIKE '% %'). Виправлення: UPDATE b_iblock_element SET XML_ID = TRIM(XML_ID) — і повторний запуск обміну відновив усі товари.
Превентивний моніторинг
Налаштувати автоматичну перевірку після кожного обміну:
// Підозрілі ознаки — сигнал для сповіщення
$checks = [
'deactivated_count' => 'SELECT COUNT(*) FROM b_iblock_element WHERE ACTIVE = "N" AND MODIFIED_BY = 1', // змінено агентом обміну
'duplicate_xml_id' => 'SELECT COUNT(*) FROM (SELECT XML_ID FROM b_iblock_element GROUP BY XML_ID HAVING COUNT(*) > 1) t',
'last_exchange' => 'SELECT MAX(TIMESTAMP_X) FROM b_iblock_element WHERE IBLOCK_ID = ' . CATALOG_IBLOCK_ID,
];
Якщо кількість деактивованих товарів за один сеанс обміну перевищує поріг (наприклад, 100 штук) — надіслати алерт і заблокувати наступний сеанс обміну до ручної перевірки.
Терміни діагностики та усунення
| Тип проблеми | Термін усунення |
|---|---|
| Помилка авторизації / таймаут | 1–2 години |
| Задвоєння товарів | 4–8 годин |
| Невідповідність кодувань | 1–3 години |
| Втрата замовлень при обміні | 2–4 години |
| Системні проблеми після переносу БД | 1–2 дні |







