Странно, что описание этой проблемы не встречается нигде, меж тем наличие двойных кавычек в наименовании товара вызывает серьезные сбои в работе менеджеров, например, в 1С УТ.
Так что сделаю свой вклад в сообщество, вдруг кто-то еще столкнется.
Итак вводные: 1С Управление Торговлей на 8.2 (8.2.18.102) редакция редакция 10.3 (10.3.21.2) и на сайте 1С-Битрикс Управление сайтом 12.5.7
В 1С УТ есть два обмена с сайтом. Первый выгружает номенклатуру на сайт, второй обменивается заказами.
Номенклатура в базе УТ появилась путем загрузки таблицы от поставщика. У поставщика есть пара десятков наименований, содержащих двойные кавычки. Например, 3535LR Комплект щёток для российских авто 14" + 14" (350 + 350) 14" + 14" (350 + 350). Как видите двойные кавычки тут обозначают дюймы.
Выгрузка товаров в сторону сайта происходит нормально и битрик съедает кавычки без проблем. Однако при обмене заказами, если в заказе встречается наименование с двойными кавычками, в базе 1С УТ создается новая номенклатура в корне (вне групп). При этом наименование ее стабильно режется: строка идет от начала и до первого вхождения двойных кавычек.
Покопавшись в конфигураторе 1С, я нашел проблему. Вернее место, где на мой взгляд (а я не сильно разбираюсь в десктопных решениях 1С) эта проблема возникает.
В обработке ОбменССайтом функция НайтиНоменклатуруПоНаименованиюИВиду начинается так:
Опять-таки - не силен в этом виде программирования, но очевидно, что когда в запрос приходит строка - он обрывается на первой же двойной кавычке, потому что язык считает, что это и есть конец всему.
Почитав форумы, я выяснил, что экранирование здесь осуществляется удвоением символа. То есть " - это обрыв строки, "" - это один символ двойных кавычек в тексте.
Данные приходят как вы понимаете из XML (CommerceML) файла.
Решение, которое я вижу - просто, однако затрагивает ядро Битрикс, что не хорошо.
В файле модуля Интернет-магазина /bitrix/modules/sale/general/export.php на 720 строке находится точка формирования тэга "<Наименования>" для товара в заказе:
Очевидно, что достаточно просто добавить str_replace и заменить все найденные двойные кавычки в наименовании на двойные двойные кавычки
Примерно так:
Поправил у себя и жду понедельника, чтобы посмотреть результат.
Сталкивался ли кто-нибудь с этой проблемой? И как бы постучать в дверь разработчикам интеграции 1С"Предприятие и Битрикс, чтобы они поправили этот момент?
С уважением к сообществу.
Так что сделаю свой вклад в сообщество, вдруг кто-то еще столкнется.
Итак вводные: 1С Управление Торговлей на 8.2 (8.2.18.102) редакция редакция 10.3 (10.3.21.2) и на сайте 1С-Битрикс Управление сайтом 12.5.7
В 1С УТ есть два обмена с сайтом. Первый выгружает номенклатуру на сайт, второй обменивается заказами.
Номенклатура в базе УТ появилась путем загрузки таблицы от поставщика. У поставщика есть пара десятков наименований, содержащих двойные кавычки. Например, 3535LR Комплект щёток для российских авто 14" + 14" (350 + 350) 14" + 14" (350 + 350). Как видите двойные кавычки тут обозначают дюймы.
Выгрузка товаров в сторону сайта происходит нормально и битрик съедает кавычки без проблем. Однако при обмене заказами, если в заказе встречается наименование с двойными кавычками, в базе 1С УТ создается новая номенклатура в корне (вне групп). При этом наименование ее стабильно режется: строка идет от начала и до первого вхождения двойных кавычек.
Покопавшись в конфигураторе 1С, я нашел проблему. Вернее место, где на мой взгляд (а я не сильно разбираюсь в десктопных решениях 1С) эта проблема возникает.
В обработке ОбменССайтом функция НайтиНоменклатуруПоНаименованиюИВиду начинается так:
Код |
---|
// поиск номенклатуры по наименованию и виду Запрос = Новый Запрос; Запрос.УстановитьПараметр("ВидНоменклатуры", ВидНоменклатуры); Запрос.УстановитьПараметр("Наименование", НаименованиеНоменклатуры); Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | Номенклатура.Ссылка Как Номенклатура |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.ВидНоменклатуры = &ВидНоменклатуры | И Номенклатура.Наименование = &Наименование"; Выборка = Запрос.Выполнить().Выбрать(); |
Почитав форумы, я выяснил, что экранирование здесь осуществляется удвоением символа. То есть " - это обрыв строки, "" - это один символ двойных кавычек в тексте.
Данные приходят как вы понимаете из XML (CommerceML) файла.
Решение, которое я вижу - просто, однако затрагивает ядро Битрикс, что не хорошо.
В файле модуля Интернет-магазина /bitrix/modules/sale/general/export.php на 720 строке находится точка формирования тэга "<Наименования>" для товара в заказе:
Код |
---|
<<?=GetMessage("SALE_EXPORT_ITEM_NAME")?>><?=htmlspecialcharsbx($arBasket["NAME"])?></<?=GetMessage("SALE_EXPORT_ITEM_NAME")?>> |
Примерно так:
Код |
---|
<<?=GetMessage("SALE_EXPORT_ITEM_NAME")?>><?=htmlspecialcharsbx(str_replace('"', '""', $arBasket["NAME"]))?></<?=GetMessage("SALE_EXPORT_ITEM_NAME")?>> |
Поправил у себя и жду понедельника, чтобы посмотреть результат.
Сталкивался ли кто-нибудь с этой проблемой? И как бы постучать в дверь разработчикам интеграции 1С"Предприятие и Битрикс, чтобы они поправили этот момент?
С уважением к сообществу.