Форум
При экспорте в csv не выгружается ссылка на товар.
Как выгрузить?
Заглянувший
Сообщений: 1 Регистрация: 09.09.2021
24.10.2022 16:54:09
Не могу поверить что эта проблема не актуальна!
+1 к просьбе выше, как это сделать
Сообщений: 788 Баллов: 168 Регистрация: 10.08.2007
25.10.2022 21:01:45
Здравствуйте! В csv не выгрузить url, только если он будет в свойстве товара. В csv выгружаются поля, свойства, цены и секции.
Страницы: 1
Центр поддержки
Продукты
Управление сайтом
Битрикс24
Интернет-магазин + CRM
Решения
Для интернет-магазинов
Каталог готовых решений
Внедрение
Выбрать партнера
Проверить партнера
Стать партнером
1С-Битрикс http://www.1c-bitrix.ru Общие вопросы info@1c-bitrix.ru Приобретение и лицензирование продуктов : sales@1c-bitrix.ru Маркетинг/мероприятия/PR marketing@1c-bitrix.ru Партнерская программа partners@1c-bitrix.ru Мы работаем с 10:00 до 19:00 по московскому времени. Офис в Москве 127287 Россия Московская область Москва 2-я Хуторская улица дом 38А строение 9 Офис в Калининграде +7 (4012) 51-05-64 Офис в Калининграде 236001 Россия Калининградская область Калининград Московский проспект 261 Офис в Киеве ukraine@1c-bitrix.ru Телефон в Киеве +3 (8044)221-55-33 Офис в Киеве 01033 Украина Калининградская область Киев улица Шота Руставели 39/41 офис 1507
© 2001-2023 «Битрикс», «1С-Битрикс». Работает на 1С-Битрикс: Управление сайтом. Политика конфиденциальности
Процесс обмена Битрикса и 1С

Неопытным разработчикам кажется, что это процесс обмена Битрикса и 1С это очень сложный процесс, но с опытом понимаешь, что это не просто сложно: это вообще полная жесть. Попробую описать словами этот процесс. Добро пожаловать в ад описание обмена с 1с.
Инициатором любого обмена является 1С, сайт не загружает ничего в 1С, сайт только принимает запросы и отдаёт результат. По умолчанию, 1С обращается к скрипту /bitrix/admin/1c_exchange.php. Этот путь указывается в настройках обмена в самой 1С. Из коробки в этом файле включается файл /bitrix/modules/sale/admin/1c_exchange.php. Если открыть файл, то видим там подключение нескольких компонентов в зависимости от $_GET[«type»]. В общем случае интересуют два из них:
bitrix:catalog.import.1c – импорт каталога.
bitrix:sale.export.1c – экспорт заказов.
Импорт товаров из 1С
Импорт начинается с авторизации, посылается запрос на /bitrix/admin/1c_exchange.php?type=catalog&mode=checkauth с передачей логина и пароля пользователя сайта, которые указали в настройках обмена. После авторизации сайт выдает ID сессии.
Далее идёт инициализация обмена, URL /bitrix/admin/1c_exchange.php?type=catalog&mode=init&sessid=ID_Сессии . На этом этапе в сессии инициализируется массив данных обмена $_SESSION[«BX_CML2_IMPORT»] и сайт отдаёт параметры обмена: возможность использования zip, лимит размера файла и т.д. Также на этом этапе очищается папка для файлов выгрузки. Скорее всего, это будет папка /upload/1c_catalog/. Для отладки можно включить сохранение старых файлов обмена, тогда при новом обмене старые данные будут перемещаться в отдельные папки: 1c_catalog0, 1c_catalog1 и т.д.. Для сохранения данных нужно объявить константу в dbconn.php:
// Не забудьте убрать эту строку после отладки во избежание переполнения сервера define("BX_CATALOG_IMPORT_1C_PRESERVE", true);
После этого 1С начинает подготовку данных и далее посылает их POST-запросом на сайт частями, URL: /bitrix/admin/1c_exchange.php?type=catalog&mode=file&filename=ИМЯ_ФАЙЛА.zip&sessid=ID_Сессии . Запрос продолжается, пока файлы не будут переданы полностью.
1С передает на сайт xml-файлы с данными товаров и предложений, а также картинки. В случае если сайт разрешил использовать zip, то 1С передает все файлы одним архивом. Тогда следующий шаг начинается с его распаковки.
В выгрузке могут участвовать xml-файлы:
- import.xml — товары, разделы, типы цен, склады, свойства товаров и единицы измерения;
- offers.xml — торговые предложения товаров и их свойства;
- prices.xml — цены торговых предложений(в новых версиях);
- rests.xml — остатки торговых предложений(в новых версиях);
- references.xml — пользовательские справочники (highload-инфоблоки, в новых версиях).
Картинки загружаются в папку /upload/1c_catalog/import_files/.
Далее начинаются обработка файла и сам импорт данных, 1С раз за разом обращается к URL /bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=ИМЯ_ФАЙЛА_ВЫГРУЗКИ.xml , где ИМЯ_ФАЙЛА_ВЫГРУЗКИ — import.xml, offers.xml и т.д. Импорт завершается, когда сайт отдаёт слово «success». За обработку файла выгрузки отвечают классы CIBlockXMLFile (/bitrix/modules/iblock/classes/mysql/cml2.php) и CIBlockCMLImport (/bitrix/modules/iblock/classes/general/cml2.php).
Импорт состоит из нескольких шагов:
- Очистка временной таблицы (таблица b_xml_tree) Метод CIBlockXMLFile::DropTemporaryTables(). Обычный drop таблицы b_xml_tree.
- Создание временной таблицы Метод CIBlockXMLFile::CreateTemporaryTables(). Здесь создается таблица b_xml_tree. Можно, кстати, задать storage engine этой таблицы, равно как и всех создаваемые битриксом, с помощью определения константы MYSQL_TABLE_TYPE.
- Чтение файла во временную таблицу Метод CIBlockXMLFile::ReadXMLToDatabase().
- Индексация временной таблицы Метод CIBlockXMLFile::IndexTemporaryTables().
- Импорт метаданных Метод CIBlockCMLImport::ImportMetaData.
- Импорт разделов Метод CIBlockCMLImport::ImportSections.
- Деактивация разделов и пересчёт левой и правой границ для разделов Методы CIBlockCMLImport::DeactivateSections и CIBlockCMLImport::SectionsResort.
- Импорт элементов Самый длительный процесс, на этом этапе добавляются и обновляются новые товары (если загружается import.xml) или обновляются цены и остатки (если загружаетс offers.xml). Здесь задействован метод CIBlockCMLImport::ImportElements, который вызывает CIBlockCMLImport::ImportElement для товаров или CIBlockCMLImport::ImportElementPrices для остатков/цен.
- Деактивация элементов Методы CIBlockCMLImport::DeactivateSections и CIBlockCMLImport::SectionsResort.
- success Импорт файла завершен, сайт отвечат словом «success», 1С считает обмен успешным. При необходимости начинается импорт следующего файла.
Некоторые шаги могут выполняться за несколько запросов, порциями по несколько секунд (это время настраивается параметров «Интервал одного шага в секундах» в настройках интеграции с 1С в админке Битрикса).
Модификация
На шаге 9, т.е. по окончании обработки файла выгрузки (NB: одного файла, например, товаров или предложений) вызывается событие OnSuccessCatalogImport1C модуля catalog. Аргументы обработчика — параметры компонента обмена и путь к файлу выгрузки.
Также для изменения процесса обмена можно использовать обычные события, например, OnBeforeIBlockElementUpdate или OnBeforeProductAdd. В обработчике, чтобы определить, что событие вызвано именно во время обмена с 1С, я использую такое костыльное условие:
if (isset($_GET['type'], $_GET['mode']) && $_GET['type'] === 'catalog' && $_GET['mode'] === 'import') < // . >
Ну и, если ничего нельзя решить событиями, всегда можно полностью изменить процесс обмена, скопировав и изменив файл /bitrix/admin/1c_exchange.php , компонент bitrix:catalog.import.1c и класс CIBlockCMLImport .
Отключение проверки источника запроса
Как и в случае с выгрузкой товаров, при импорте товаров есть проверка источника запроса. Можно отключить её следующим кодом:
// old school: COption::SetOptionString("catalog", "DEFAULT_SKIP_SOURCE_CHECK", "Y"); // d7 style: \Bitrix\Main\Config\Option::set("catalog", "DEFAULT_SKIP_SOURCE_CHECK", "Y");
Экспорт заказов в 1С
Обмен заказами начинается с авторизации с помощью логина и пароля, который указали в настройках обмена. После авторизации сайт выдает ID сессии, URL: /bitrix/admin/1c_exchange.php?type=sale&mode=checkauth .
После получения ID сессии идёт инициализация обмена, URL: /bitrix/admin/1c_exchange.php?type=sale&mode=init&sessid=ID_Сессии . На этом этапе сайт отдаёт настройки обмена со стороны сайта.
Для получения списка заказов запрашивается URL /bitrix/admin/1c_exchange.php?type=sale&mode=query&sessid=ID_Сессии . Выгружаются заказы с полями EXTERNAL_ORDER = «N», UPDATED_1C = «N» и обновившиеся после последней успешной выгрузки в 1С (это проверяется по времени из свойства «last_export_time_committed_/bitrix/admin/1c_excha» модуля sale).
Флаг EXTERNAL_ORDER указывает, что заказ создан в 1С и его выгрузка в 1С не требуется.
Флаг UPDATED_1C после успешного импорта из 1С на сайте устанавливается в «Y» и такие заказы не участвуют в дальнейших экспортах до их обновления на сайте. Во время обновлений заказов на сайте UPDATED_1C устанавливается в «N».
После обработки заказов 1С для завершения обмена запрашивает URL /bitrix/admin/1c_exchange.php?type=sale&mode=success&sessid=ID_Сессии . При этом в свойство «last_export_time_committed_/bitrix/admin/1c_excha» модуля sale записывается время запроса списка заказов (НЕ текущее время, т.к. с момента запроса заказов до их обработки могли добавиться заказы и они попадут в следующую выгрузку с сайта).
Модификация
В экспорте заказов участвуют файл /bitrix/admin/1c_exchange.php , компонент bitrix:sale.export.1c и класс CSaleExport . Какие-либо события здесь отсутствуют, поэтому для модификации этого процесса нужно заменить компонент на свой, создать класс-наследник CSaleExport и заменить вызовы в компоненте на него. В последних версиях Битрикс этот класс стал относительно читабельным, в старых там была просто простыня из php и «xml».
Отключение проверки источника запроса
С версии 15.5 добавлена дополнительная проверка и если вызвать просто /bitrix/admin/1c_exchange.php?type=sale&mode=query , то получим ошибку «failure Ошибка проверки источника запроса. Обновите модуль обмена». Если нет желания возиться с sessid, то можно отключить проверку источника запроса, для этого нужно выполнить:
// old school: COption::SetOptionString("sale", "secure_1c_exchange", "N"); // d7 style: \Bitrix\Main\Config\Option::set("sale", "secure_1c_exchange", "N");
Статья будет дополняться по мере появления новой информации и вдохновения.
Также полезно почитать:
- Алгоритм выгрузки данных на сайт
- Протокол обмена между системой «1С:Предприятие» и сайтом
- Подробнейшая документация класса CIBlockCMLImport
Класс выгрузки каталога товаров в xml
Для выгрузки каталога товаров в различные площадки, в разных форматах на Marketplace можно подобрать подходящий модуль, и для непрограммиста это будет отличное решение!
Но для себя понял главное — все эти модули очень сложно кастомизировать, если нужно! Если вы программист — лучше сделайте себе свою заготовку, которую в дальнейшем можно расширять, или убедитесь, что вам достаточно того функционала, который предоставляет покупаемый вами модуль.
В данном посте я выложу свою заготовку создания xml-файла с актуальной версией небольшого каталога товаров.
Существует 2 варианта представления каталога товаров на сайте: простой — когда товар и все его торговые предложения имеют один и тот же url-адрес (и частный случай — каталог без торговых предложений) и более сложный — когда торговые предложения имеют собственные url-адреса, отличающиеся от основного товара какой-то дополнительной солью.
Для первого варианта, нужно обрабатывать именно каталог, а цены и остатки искать в торговых предложениях. Для второго — обрабатывать нужно торговые предложения, а недостающие данные брать из товара.
В данном посте рассмотрю простой вариант, т.к. он встречается чаще (в моей работе), хотя с точки зрения сео — вариант отдельных адресов может быть и не совсем верно.
В любом случае, принимать решение о том, какой вариант лучше — вам, причем, в каждой конкретной ситуации.
Для начала кладем где-то файл с классом, например сюда: /bitrix/php_interface/classes/ccatalogexport.php следующего содержания:
namespace Pai\Tools; use \Bitrix\Main\Data\Cache; use Bitrix\Main\IO, Bitrix\Main\Application; use Bitrix\Main\Loader; class CCatalogExport < var $CATALOG_IBLOCK; var $OFFER_IBLOCK; var $EXCLUDE_SECTIONS = [83, 88, 89]; // тут указываем разделы, которые выгружать не нужно var $FirmName = 'ТМ Торговая Марка'; var $url = "https://site.ua"; var $Scheme; var $result; function __construct($CATALOG_IBLOCK, $OFFER_IBLOCK) < $this->CATALOG_IBLOCK = $CATALOG_IBLOCK; $this->OFFER_IBLOCK = $OFFER_IBLOCK; > private function GetSectionsList() < $result = false; $needNavChain = false; $cache_params = array('function' =>__FUNCTION__, 'IBLOCK_ID' => $this->CATALOG_IBLOCK, 'EXCLUDE' => $this->EXCLUDE_SECTIONS, $needNavChain); $cache_id = md5(serialize($cache_params)); $cache_dir = __CLASS__; $cache = Cache::createInstance(); $life_time = 60 * 60 * 24 * 30; if ($life_time < 0) < $cache->clean($cache_id, $cache_dir); > if ($cache->initCache($life_time, $cache_id, $cache_dir)) < $result = $cache->getVars(); > elseif ($cache->startDataCache() && \Bitrix\Main\Loader::includeModule('iblock')) < $Sect_list = \CIBlockSection::GetList(array("DEPTH_LEVEL" =>"ASC", "ID" => "ASC"), array('IBLOCK_ID' => $this->CATALOG_IBLOCK, 'GLOBAL_ACTIVE' => 'Y', '!ID' => $this->EXCLUDE_SECTIONS), false, array('ID', 'IBLOCK_ID', 'NAME', 'SECTION_PAGE_URL', 'IBLOCK_SECTION_ID')); while ($Section = $Sect_list->GetNext()) < if ($needNavChain) < $nav = \CIBlockSection::GetNavChain(false, $Section['ID']); while ($arSectionPath = $nav->GetNext()) < $Section['SECTIONS_PATH'][$arSectionPath['DEPTH_LEVEL']] = $arSectionPath; >> $result[$Section['ID']] = $Section; > $cache->endDataCache($result); > $this->result['SECTIONS'] = $result; > private function GetIblockElements() < $result = false; $cache_params = array('function' =>__FUNCTION__, 'IBLOCK_ID' => $this->CATALOG_IBLOCK, 'EXCLUDE' => $this->EXCLUDE_SECTIONS); $cache_id = md5(serialize($cache_params)); $cache_dir = __CLASS__; $cache = Cache::createInstance(); $life_time = 60 * 60 * 24; if ($life_time < 0) < $cache->clean($cache_id, $cache_dir); > if ($cache->initCache($life_time, $cache_id, $cache_dir)) < $result = $cache->getVars(); > elseif ($cache->startDataCache() && \Bitrix\Main\Loader::includeModule('iblock')) < $arSelect = Array("ID", "NAME", "IBLOCK_ID", "CATALOG_TYPE", "IBLOCK_SECTION_ID", "DETAIL_PAGE_URL", "DETAIL_PICTURE", "PREVIEW_PICTURE", "DETAIL_TEXT"); $arFilter = Array("IBLOCK_ID" =>$this->CATALOG_IBLOCK, "ACTIVE_DATE" => "Y", "ACTIVE" => "Y", '!IBLOCK_SECTION_ID' => $this->EXCLUDE_SECTIONS, "CATALOG_TYPE" => array(1, 3)); $res = \CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); while ($ob = $res->GetNextElement()) < $arFields = $ob->GetFields(); /*Loader::includeModule('pai.tools'); CDebug::pre($arFields,true);*/ $arFields['CATALOG_QUANTITY'] = intval($arFields['CATALOG_QUANTITY']); $price = 0; if (intval($arFields['DETAIL_PICTURE']) 0) < $arFields['DETAIL_PICTURE'] = $arFields['PREVIEW_PICTURE']; >if ($arFields['CATALOG_TYPE'] == 3) < // у товара есть торговые предложения - их нужно найти :( $arOfferSelect = Array("ID", "NAME", "IBLOCK_ID", "CATALOG_QUANTITY"); if (intval($arFields['DETAIL_PICTURE']) $arOfferFilter = Array("IBLOCK_ID" => $this->OFFER_IBLOCK, "PROPERTY_CML2_LINK" => $arFields['ID'], "ACTIVE_DATE" => "Y", "ACTIVE" => "Y"); $resOffer = \CIBlockElement::GetList(Array(), $arOfferFilter, false, false, $arOfferSelect); while ($arOfferFields = $resOffer->GetNext()) < $dbProductPrice = \CPrice::GetListEx( array(), array("PRODUCT_ID" =>$arOfferFields['ID'], "CATALOG_GROUP_ID" => 1), // берем товары с базовой ценой, с "CATALOG_GROUP_ID", "PRICE", "CURRENCY") ); while ($arPrice = $dbProductPrice->Fetch()) < if (!isset($arFields['PRICE']) || floatval($arFields['PRICE']) >floatval($arPrice['PRICE'])) < $arFields['PRICE'] = floatval($arPrice['PRICE']); $arFields['CURRENCY'] = $arPrice['CURRENCY']; >> $arFields['CATALOG_QUANTITY'] += intval($arOfferFields['CATALOG_QUANTITY']); if (intval($arFields['DETAIL_PICTURE']) 0 || intval($arOfferFields['PREVIEW_PICTURE']) > 0)) < $arFields['DETAIL_PICTURE'] = (intval($arOfferFields['DETAIL_PICTURE']) >0) ? $arOfferFields['DETAIL_PICTURE'] : $arOfferFields['PREVIEW_PICTURE']; > > > else < // простой товар $dbProductPrice = \CPrice::GetListEx( array(), array("PRODUCT_ID" =>$arFields['ID'], "CATALOG_GROUP_ID" => 1), // берем товары с базовой ценой, с "CATALOG_GROUP_ID", "PRICE", "CURRENCY") ); while ($arPrice = $dbProductPrice->Fetch()) < if (!isset($arFields['PRICE']) || floatval($arFields['PRICE']) >floatval($arPrice['PRICE'])) < $arFields['PRICE'] = floatval($arPrice['PRICE']); $arFields['CURRENCY'] = $arPrice['CURRENCY']; >> > if (floatval($arFields['PRICE']) GetProperties(); $arDisplay_properties = []; $MorePictures = []; foreach ($arProperties as $arProperty) < if($arProperty['CODE']=='MORE_PHOTO' && !empty($arProperty['VALUE']))< foreach ($arProperty['VALUE'] as $fid)< $MorePictures[] = \CFile::GetPath($fid); >> if (in_array($arProperty['CODE'], array( 'MINIMUM_PRICE', 'MAXIMUM_PRICE', 'HIT', 'POPUP_VIDEO', 'PODBORKI', 'PRODUCTION', 'COLOR', 'SPECIAL_OFFERS', 'META_DESCRIPTION', 'META_KEYWORDS', 'MORE_PHOTO', // . 'COLOR_REF2', 'SALE_TEXT', 'vote_count', 'vote_sum', 'rating', 'FORUM_TOPIC_ID', 'FORUM_MESSAGE_CNT', 'COLOR_VARIANTS', 'PRODUCT_TYPE', 'VIDEO_YOUTUBE', 'EXPANDABLES', 'ASSOCIATED', ))) continue; $arDisplay_properties[$arProperty['CODE']] = \CIBlockFormatProperties::GetDisplayValue( array('ID' => $arFields['ID'], 'NAME' => $arFields['NAME']), $arProperty, ''); > $row = array( 'id' => $arFields['ID'], 'available' => (intval($arFields['CATALOG_QUANTITY']) > 0) ? "true" : "false", 'categoryId' => $arFields['IBLOCK_SECTION_ID'], 'vendor' => 'Brand name', 'name' => $arFields['NAME'], 'url' => $arFields['DETAIL_PAGE_URL'], 'price' => $arFields['PRICE'], 'stock' => (intval($arFields['CATALOG_QUANTITY']) > 0) ? 'На складе' : "Нет на складе", 'params' => [], 'picture' => \CFile::GetPath($arFields['DETAIL_PICTURE']), 'more_pictures' => $MorePictures, 'description' => ((strlen($arFields['DETAIL_TEXT']) > 0) ? '0) < $row['params'][$arProperty['NAME']] = $arProperty['DISPLAY_VALUE']; >> $result[$arFields['ID']] = $row; > $cache->endDataCache($result); > $this->result['PRODUCTS'] = $result; > function GetFileSheme() < $Scheme = "" . PHP_EOL; $Scheme .= "" . PHP_EOL; $Scheme .= "\t" . date(str_replace("_", " ", '"Y-m-dTh:i:s±h:i"')) . " " . PHP_EOL; $Scheme .= "\t" . $this->FirmName . " " . PHP_EOL; $Scheme .= "\t1 " . PHP_EOL; $Scheme .= "\t" . $this->url . " " . PHP_EOL; $Scheme .= "\t" . $this->url . " " . PHP_EOL; $Scheme .= "\t" . PHP_EOL; $Scheme .= "#CATEGORIES#" . PHP_EOL; $Scheme .= "\t " . PHP_EOL; $Scheme .= "\t" . PHP_EOL; $Scheme .= "#PRODUCTS#" . PHP_EOL; $Scheme .= "\t " . PHP_EOL; $Scheme .= " "; $this->Scheme = $Scheme; > function putSectionsToScheme() < $categories = ''; foreach ($this->result['SECTIONS'] as $arSection) < $categories .= "\t\t0) ? "parentId=\"" . $arSection['IBLOCK_SECTION_ID'] . "\" " : "") . "portal_url=\"" . $arSection['SECTION_PAGE_URL'] . "\">" . $arSection["NAME"] . " " . PHP_EOL; > $this->Scheme = str_replace('#CATEGORIES#', TrimEx($categories, PHP_EOL, 'right'), $this->Scheme); > function putProductsToScheme() < $productsLine = ''; foreach ($this->result['PRODUCTS'] as $arProduct) < $productsLine .= "\t\t" . PHP_EOL; $productsLine .= "\t\t\t" . $arProduct['categoryId'] . " " . PHP_EOL; $productsLine .= "\t\t\t" . $arProduct['vendor'] . " " . PHP_EOL; $productsLine .= "\t\t\t" . $arProduct['name'] . " " . PHP_EOL; $productsLine .= "\t\t\t" . $this->url . $arProduct['url'] . " " . PHP_EOL; $productsLine .= "\t\t\t" . $arProduct['price'] . " " . PHP_EOL; $productsLine .= "\t\t\t" . $arProduct['stock'] . " " . PHP_EOL; $productsLine .= "\t\t\t" . $this->url . $arProduct['picture'] . " " . PHP_EOL; $productsLine .= "\t\t\t" . $arProduct['description'] . PHP_EOL . " " . PHP_EOL; foreach ($arProduct['params'] as $param => $paramValue) < $productsLine .= "\t\t\t" . $paramValue . "" . PHP_EOL; > $productsLine .= "\t\t " . PHP_EOL; > $this->Scheme = str_replace('#PRODUCTS#', TrimEx($productsLine, PHP_EOL, 'right'), $this->Scheme); > function putSchemeToFile() < $file = new IO\File(Application::getDocumentRoot() . "/upload/export/tmp.xml"); $file->putContents($this->Scheme); $file->rename(Application::getDocumentRoot() . "/upload/export/siteCatalog.xml"); echo 'Ok'; > function process() < $this->GetFileSheme(); $this->GetSectionsList(); $this->putSectionsToScheme(); $this->GetIblockElements(); $this->putProductsToScheme(); $this->putSchemeToFile(); > static function Agent($IBLOCK_ID, $OFFERS_ID) < $processor = new CCatalogExport($IBLOCK_ID, $OFFERS_ID); $processor->process(); return "\Pai\Tools\CCatalogExport::Agent($IBLOCK_ID,$OFFERS_ID);"; > >
Дальше, подключаем данный класс к автозагрузке:
Bitrix\Main\Loader::registerAutoLoadClasses(null, array( 'Pai\Tools\CCatalogExport' => '/bitrix/php_interface/classes/ccatalogexport.php', ));
Проверяем работу класса запустив скрипт:
$processor = new Pai\Tools\CCatalogExport(,); $processor->process();
И последним шагом — создаем периодический агент с выполнением функции:
\Pai\Tools\CCatalogExport::Agent($IBLOCK_ID,$OFFERS_ID);
Имейте ввиду, что данный вариант скрипта не подходит для больших каталогов, которые нельзя обработать за один хит. Если у вас большой каталог — стоит разбить его на части с помощью пагинации и информацию о товарах записывать в файл пошагово.
2018-12-27. Создание дополнительной выгрузки на базе основной.
Предположим, вы создали и настроили основную выгрузку, но вам нужна еще одна (а в реальной ситуации — не одна) с незначительными изменениями структуры. Для этого, нужно создать еще один класс с наследованинем от текущего.
Итак, создаем рядом с файлом с основным классом ее один, например, класс CYmlCatalogExport в файле cymlcatalogexport. В init.php добавляем автозагрузку нового класса:
Bitrix\Main\Loader::registerAutoLoadClasses(null, array( 'Pai\Tools\CCatalogExport' => '/bitrix/php_interface/classes/ccatalogexport.php', 'Pai\Tools\CYmlCatalogExport' => '/bitrix/php_interface/classes/cymlcatalogexport.php', ));
Сам класс примет такой вид:
namespace Pai\Tools; use \Bitrix\Main\Data\Cache; use Bitrix\Main\IO, Bitrix\Main\Application; use Bitrix\Main\Loader; class CYmlCatalogExport extends CCatalogExport < function GetFileSheme() < $Scheme = "" . PHP_EOL; $Scheme .= "".PHP_EOL; $Scheme .= "" . PHP_EOL; $Scheme .= " "; $this->Scheme = $Scheme; > function putSectionsToScheme() < $categories = ''; foreach ($this->result['SECTIONS'] as $arSection) < $categories .= "\t\t".PHP_EOL; $Scheme .= "\t ".PHP_EOL; $Scheme .= "" . $this->FirmName . " " . PHP_EOL; $Scheme .= "\t" . $this->FirmName . " " . PHP_EOL; $Scheme .= "\t" . $this->url . " " . PHP_EOL; $Scheme .= "\t" . "1С-Битрикс" . " " . PHP_EOL; $Scheme .= "\t".PHP_EOL; $Scheme .= "\t\t".PHP_EOL; $Scheme .= "\t ".PHP_EOL; $Scheme .= "\t" . PHP_EOL; $Scheme .= "#CATEGORIES#" . PHP_EOL; $Scheme .= "\t " . PHP_EOL; $Scheme .= "\t" . PHP_EOL; $Scheme .= "#PRODUCTS#" . PHP_EOL; $Scheme .= "\t " . PHP_EOL; $Scheme .= "0) ? "parentId=\"" . $arSection['IBLOCK_SECTION_ID'] . "\" " : "") . "portal_url=\"" . $arSection['SECTION_PAGE_URL'] . "\">" . $arSection["NAME"] . " " . PHP_EOL; > $this->Scheme = str_replace('#CATEGORIES#', TrimEx($categories, PHP_EOL, 'right'), $this->Scheme); > function putProductsToScheme() < $productsLine = ''; foreach ($this->result['PRODUCTS'] as $arProduct) < $productsLine .= "\t\t" . PHP_EOL; $productsLine .= "\t\t\t " . PHP_EOL; > $this->Scheme = str_replace('#PRODUCTS#', TrimEx($productsLine, PHP_EOL, 'right'), $this->Scheme); > function putSchemeToFile() < $file = new IO\File(Application::getDocumentRoot() . "/upload/export/tmp.xml"); $file->putContents($this->Scheme); $file->rename(Application::getDocumentRoot() . "/upload/export/ymlCatalog.xml"); echo 'Ok'; > static function Agent($IBLOCK_ID, $OFFERS_ID) < $processor = new CYmlCatalogExport($IBLOCK_ID, $OFFERS_ID); $processor->process(); return "\Pai\Tools\CYmlCatalogExport::Agent($IBLOCK_ID,$OFFERS_ID);"; > >" . $arProduct['categoryId'] . " " . PHP_EOL; $productsLine .= "\t\t\t" . $arProduct['currencyId'] . " " . PHP_EOL; $productsLine .= "\t\t\t" . htmlspecialchars($arProduct['name']) . " " . PHP_EOL; $productsLine .= "\t\t\t" . $this->url . $arProduct['url'] . " " . PHP_EOL; $productsLine .= "\t\t\t" . $arProduct['price'] . " " . PHP_EOL; $productsLine .= "\t\t\t" . $this->url . $arProduct['picture'] . " " . PHP_EOL; if(!empty($arProduct['more_pictures']))< $productsLine .= "\t\t\t<add_picture>" . implode(',',$arProduct['more_pictures'])."</add_picture>".PHP_EOL; > $productsLine .= "\t\t\t" . $arProduct['description'] . PHP_EOL . " " . PHP_EOL; $productsLine .= "\t\t\tfalse ".PHP_EOL; $productsLine .= "\t\t\ttrue ".PHP_EOL; $productsLine .= "\t\t\ttrue ".PHP_EOL; foreach ($arProduct['params'] as $param => $paramValue) < $productsLine .= "\t\t\t" . $paramValue . "" . PHP_EOL; > $productsLine .= "\t\t
Вот так получаем вторую выгрузку на базе первой.
Сложно и интересно! Как получить URL товара в справочнике 1С
У меня давно настроена полная интеграция каталога 1С и Битрикса. В 1С все — свойства, описания, картинки, видео и т.д.Для полного счастья не хватает битриксовской ссылки на этот товар.
Помогите, как получить ссылку на товар в 1С?
Можно ссылку как-то выгрузить?
Или получить методом веб-сервиса?
Или как угодно ее выгрести из Битрикса сторонним приложением?
Может кто-то знает как сделать список [XML_ID, URL]?
ну и т.д.
В 1С загрузим. получить бы ее.
Интернет магазины + интеграция с 1С:Предприятие. Только крутые проекты.
+38(091)945-80-07
Заглянувший
Сообщений: 30 Баллов: 1 Регистрация: 06.12.2011
06.02.2012 14:38:16
Ссылка нужна на фронтенд или на редактирование в админке?
Заглянувший
Сообщений: 26 Баллов: 1 Регистрация: 17.06.2011
Буду рад, если смогу Вам помочь 🙂
06.02.2012 22:01:21
На фронтенд, но можно и туда и туда, мало ли что потом.
Интернет магазины + интеграция с 1С:Предприятие. Только крутые проекты.
+38(091)945-80-07
Заглянувший
Сообщений: 26 Баллов: 1 Регистрация: 17.06.2011
Буду рад, если смогу Вам помочь 🙂
08.02.2012 21:41:53
Ну неужели никто не знает как выдрать ссылки из Битрикса?
Интернет магазины + интеграция с 1С:Предприятие. Только крутые проекты.
+38(091)945-80-07
Сообщений: 762 Баллов: 70 Регистрация: 14.11.2007
09.02.2012 05:58:41
путь к сайту + путь к странице с компонентом + настройки инфоблока (URL страницы детального просмотра) или настройки компонента ЧПУ
Администратор
Сообщений: 712 Баллов: 99 Регистрация: 10.04.2007
09.02.2012 13:02:32
Сделайте простенький скрипт в битриксе, который по айдишнику (GUID) товара в 1С возвращает URL к карточке товара.
в 1С делайте ссылку: www.site.ru/get_url.php?xml_id=[— GUID —].
в get_url.php сделайте CIBlockElement::GetList с фильтром по XML_ID или EXTERNAL_ID
типа такого с ходу:
"DESC"), Array("XML_ID"=>$HTTP_GET_VARS['ID']), false, Array(), Array("IBLOCK_ID","DETAIL_PAGE_URL") ); $arItem = $res->GetNext(); if(strlen($arItem['DETAIL_PAGE_URL'])) < LocalRedirect($arItem['DETAIL_PAGE_URL']); >else echo 'Ошибка! Товара с указанным артикулом нет на сайте.'; ?>
Заглянувший
Сообщений: 26 Баллов: 1 Регистрация: 17.06.2011
Буду рад, если смогу Вам помочь 🙂
09.02.2012 20:14:56
Круто! Спасибо огромное! Все работает.Нужна будет помощь с 1С — обращайтесь
Интернет магазины + интеграция с 1С:Предприятие. Только крутые проекты.
+38(091)945-80-07
Администратор
Сообщений: 712 Баллов: 99 Регистрация: 10.04.2007
10.02.2012 12:22:21
Наздоровье
Заглянувший
Сообщений: 1 Регистрация: 18.11.2016
10.12.2016 00:23:31
| Цитата |
|---|
| fmzone написал: Круто! Спасибо огромное! Все работает.Нужна будет помощь с 1С — обращайтесь |
Здравствуйте! вы могли бы подробно описать как это вы реализовали мне нужно подобное выгружать из 1С 8.3 в битрикс
Вопрос: у товара есть дополнительные устройства типа комплектующих. выгрузка идёт из 1с 8.3
торговля и склад. Здесь в карточке товаров реализован переход по ссылкам
которые являются артикулами механизмов которые можно укомплектовать эту накладку.
Покупатель нашел накладку и что б не думать какой механизм нужен для неё просто переходит по ссылке комплектует и покупает.
http://www.jung.de/ru/online-catalogue/152260668/
И засунуть это все в описание товара.
С уважением
Заглянувший
Сообщений: 8 Регистрация: 03.11.2014
09.02.2017 15:31:31
Может кто подскажет
В 1с есть товар который называется — «ААА».
Товар выгрузили на сайт, все ок.
Через некоторое время в 1С изменили название товар на — «ААБ»
Сделали выгрузку на сайт, все ок, название товара на сайте также изменилось. Но, вместе с ним изменилась и ссылка.
Где и как можно указать, чтобы при изменении товара ссылка на сайте не изменялась?
Сообщений: 650 Баллов: 116 Регистрация: 10.02.2012
09.02.2017 15:55:50
Roman Oleynik,Мне кажется или ссылка меняться не должна, если товар был найден по Ид (внешнему коду) и обновлен данными из 1с? есть ощущение, что клон создался на сайте, но с другим именем. или имеется ввиду ЧПУ?
Всем несогласным — мыло и веревка!
Заглянувший
Сообщений: 8 Регистрация: 03.11.2014
09.02.2017 16:03:28
| Цитата |
|---|
| Алексей Сипаев написал: Roman Oleynik ,Мне кажется или ссылка меняться не должна, если товар был найден по Ид (внешнему коду) и обновлен данными из 1с? есть ощущение, что клон создался на сайте, но с другим именем. или имеется ввиду ЧПУ? |
Алексей, я тоже так думаю, но по факту ссылка новая!
где в коде посмотреть эту проверку? не могу найти
Сообщений: 650 Баллов: 116 Регистрация: 10.02.2012
09.02.2017 16:48:26
а в списке товаров — он (товар) один или задублировался?
Всем несогласным — мыло и веревка!
Сообщений: 1581 Баллов: 254 Регистрация: 12.12.2008
09.02.2017 16:50:32
в товарах их скорее всего два, деактивированный ААА и активный ААБ
Сообщений: 650 Баллов: 116 Регистрация: 10.02.2012
09.02.2017 17:26:56
Тогда в таком случае не понятно, как произошла идентификация товара на сайте? Видимо не произошла. Но посмотрим, что автор напишет
Всем несогласным — мыло и веревка!
Заглянувший
Сообщений: 8 Регистрация: 03.11.2014
09.02.2017 17:46:46
| Цитата |
|---|
| Алексей Сипаев написал: а в списке товаров — он (товар) один или задублировался? |
нет, дублей нету в 1С и на сайте
Сообщений: 650 Баллов: 116 Регистрация: 10.02.2012
10.02.2017 00:14:34
Roman Oleynik, покажите ссылки, а то может мы о разных вещах говорим?
Всем несогласным — мыло и веревка!
Заглянувший
Сообщений: 8 Регистрация: 03.11.2014
13.02.2017 12:06:07
| Цитата |
|---|
| Алексей Сипаев написал: Roman Oleynik , покажите ссылки, а то может мы о разных вещах говорим? |
Сообщений: 1581 Баллов: 254 Регистрация: 12.12.2008
15.02.2017 13:51:24
ну и покажите сейчас настройки ЧПУ
Сообщений: 650 Баллов: 116 Регистрация: 10.02.2012
15.02.2017 14:20:17
Roman Oleynik,Ну товар скорее всего один и тот же. Т.е. ссылка (без ЧПУ) на товар одна и та же.
Всем несогласным — мыло и веревка!
Заглянувший
Сообщений: 8 Регистрация: 03.11.2014
15.02.2017 17:56:28

Вы про это? http://picua.org/?v=2017-02-15_gyp9zjq50d4rhvjo4zg2a9h8o.png
Сообщений: 1581 Баллов: 254 Регистрация: 12.12.2008
15.02.2017 22:56:53
да, она у вас строится скорее всего транслитерацией из названия товара, поменяли товар, поменялось поле, поменялся урл, по старому 404
Заглянувший
Сообщений: 8 Регистрация: 03.11.2014
16.02.2017 10:47:13
| Цитата |
|---|
| Александр Кислицын написал: да, она у вас строится скорее всего транслитерацией из названия товара, поменяли товар, поменялось поле, поменялся урл, по старому 404 |
и? как быть?
Сообщений: 1581 Баллов: 254 Регистрация: 12.12.2008
20.02.2017 14:15:00
использовать такое поле, которое не зависит от ваших изменений
Постоянный посетитель
Сообщений: 195 Баллов: 15 Регистрация: 13.04.2016
20.02.2017 17:33:58
Или в 1с завести свойство товара «Название для сайта», писать название товара туда. При создании товара сделать автозаполнение этого свойства из наименования, а на сайте или переписать шаблоны на использование этого свойства (сам шаблон или result_modifier.php). Автозаполнение только при создании нового товара, в остальном — все как обычное свойство.
Страницы: 1 2 След.
Продукты
Управление сайтом
Битрикс24
Интернет-магазин + CRM
Внедрение
Выбрать партнера
Проверить партнера
Стать партнером
1С-Битрикс http://www.1c-bitrix.ru Общие вопросы info@1c-bitrix.ru Приобретение и лицензирование продуктов : sales@1c-bitrix.ru Маркетинг/мероприятия/PR marketing@1c-bitrix.ru Партнерская программа partners@1c-bitrix.ru Мы работаем с 10:00 до 19:00 по московскому времени. Офис в Москве +7 (495) 229-14-41 Офис в Москве 127287 Россия Московская область Москва 2-я Хуторская улица дом 38А строение 9 Офис в Калининграде +7 (4012) 51-05-64 Офис в Калининграде 236001 Россия Калининградская область Калининград Московский проспект 261 Офис в Киеве ukraine@1c-bitrix.ru Телефон в Киеве +3 (8044)221-55-33 Офис в Киеве 01033 Украина Калининградская область Киев улица Шота Руставели 39/41 офис 1507

© 2001-2023 «Битрикс», «1С-Битрикс». Работает на 1С-Битрикс: Управление сайтом. Соглашение об использовании сайта
