При интеграции интернет-магазина на базе 1С-Битрикс с конфигурацией 1С:Управление торговлей 11.3 часто возникает специфическая проблема с маркетинговыми акциями. Покупатель добавляет товар в корзину, срабатывает правило, по которому второй товар идет в подарок (с нулевой ценой), и заказ на сайте создается корректно. Однако при выгрузке этого заказа в 1С подарок внезапно обретает свою полную розничную стоимость. Это приводит к расхождению сумм заказов и невозможности автоматического сопоставления оплат.
Рассмотрим подробно причины такого поведения системы и разберем несколько эффективных способов решения проблемы: от простых настроек модуля до глубокой отладки кода.
Если типовые настройки не помогают, первым делом проанализируем, как именно 1С интерпретирует данные, приходящие из XML-файла сайта. Для этого нам потребуется режим конфигуратора и запуск сеанса отладки.
Разберем по шагам процесс поиска проблемного участка:
Б_ОбменССайтомСерверЗагрузкиДанных.СоздатьОбновитьДокумент. Именно здесь происходит основная магия: чтение XML и заполнение строк табличной части "Товары".Обратим внимание на то, передает ли сайт цену 0 или же он передает полную цену и скидку 100%. Если в 1С цена подменяется на прайсовую, значит, срабатывает типовой механизм пересчета цен. Вы можете внести изменения в код, чтобы принудительно фиксировать цену, если она пришла с сайта как нулевая:
// Пример логики в процедуре заполнения строки
Если ДанныеСайта.Цена = 0 Тогда
СтрокаТовара.Цена = 0;
СтрокаТовара.СпособУстановкиЦены = Перечисления.СпособыУстановкиЦен.Вручную;
КонецЕсли;
Прежде чем приступать к изменению кода, проверим настройки самого модуля интеграции "Битрикс", установленного в 1С. В современных версиях модуля (особенно 7.x и выше) предусмотрены механизмы, предотвращающие пересчет цен силами 1С.
Проанализируем вкладку настроек "Заказы" в узле обмена:
Найдем параметр "Цены заказа всегда брать с сайта". Если эта опция отключена, 1С при загрузке документа пытается найти актуальную цену в своих регистрах сведений (согласно виду цен, указанному в соглашении). Включив этот флаг, мы заставляем систему игнорировать внутренние прайс-листы и записывать в документ ровно те цифры, которые были зафиксированы в корзине на стороне 1С-Битрикс.
Выясним, как 1С должна реагировать на подарки, которые по сути являются стопроцентной скидкой. В настройках обмена есть важный пункт — "Способ отображения скидок".
Существует три основных режима:
Попробуем установить значение "В каждой строке". Это наиболее "чистый" способ с точки зрения учета, так как в 1С сохраняется информация и о номинальной стоимости товара, и о примененной акции.
Иногда причина кроется не в модуле обмена, а в настройках безопасности 1С:УТ 11.3. В программе может быть включен контроль минимальных цен продажи. Если для товара установлена минимальная цена (например, 100 рублей), то система просто не позволит записать в документ цену 0 рублей, автоматически заменяя её на минимально допустимую.
Для решения этой ситуации проанализируем следующие моменты:
Посмотрим на версию модуля обмена, который используется в вашей базе. Разработчики Битрикс регулярно выпускают обновления, исправляющие ошибки взаимодействия с новыми релизами 1С:УТ 11.3. Если вы используете встроенный в конфигурацию функционал обмена (от 1С), он может работать менее корректно с подарками, чем специализированный модуль от Битрикс.
Рекомендуется скачать актуальный дистрибутив модуля с сайта 1С-Битрикс и установить его как расширение. В новых версиях логика работы с BasketItems (элементами корзины) была пересмотрена, что позволяет корректно разделять обычные товары и подарки, помеченные в XML специальными флагами.
Для исправления ситуации с подарками мы рекомендуем придерживаться следующего алгоритма: сначала активируем опцию "Цены заказа всегда брать с сайта" и проверяем режим передачи скидок "В каждой строке". Если это не помогает, проводим сеанс отладки в модуле Б_ОбменССайтомСерверЗагрузкиДанных, чтобы убедиться, что нулевые значения не отсекаются на этапе парсинга XML. И, наконец, проверяем права пользователя обмена на предмет разрешения продаж ниже минимальной цены.