Выгрузка каталога из 1С в интернет-магазин

Процесс обмена

  1. 1С инициализирует запуск файла ваш_домен/app/addons/rus_exim_1c/exim_1c.php.

  2. 1С формирует и передает файлы с данными о товарах в папку ваш_домен/var/files/код_компании/exim/1C_ТекущаяДата вашего интернет-магазина.

    Например:

    www.site.ru/var/files/код_компании/exim/1С_06062014

    1С выгружает в интернет-магазин файлы:

    Тип данных Название файла Расположение файла
    Данные товаров import.xml /var/files/код_компании/exim/1C_ТекущаяДата/import.xml
    Цены товаров offers.xml /var/files/код_компании/exim/1C_ТекущаяДата/offers.xml
    Изображения номенклатуры *.jpg, *.jpеg , *.PNG /var/files/код_компании/exim/1C_ТекущаяДата/import_files/
  3. 1С отправляет запрос на обработку import.xml.

    • Обрабатывается и сохраняется в базу данных основная информация о товарах.
    • Изображения прикрепляются к товарам и копируются в папку /images.
  4. 1С запускает обработку offers.xml.

    На данном шаге обновляются:

    • Цены
    • Остатки
    • Характеристики
  5. Финиш!

Идентификация (соответствие) данных между 1С и CS-Cart производится:

  1. С помощью тега <Ид> (в файле 1С) и external_id (в базе данных CS-Cart).

    Примечание

    Ид == external_id

  2. По наименованию (при поиске категорий и характеристик в базе данных Multi-Vendor).

Обработка на стороне интернет-магазина

Обработку данных на стороне интернет-магазина выполняют файлы модуля “Обмен данными с 1С”.

ваш_домен/app/addons/rus_exim_1c/exim_1c.php обрабатывает запросы от 1С и подключает функции для обработки
ваш_домен/app/addons/rus_exim_1c/func.php содержит функции обработки и загрузки данных.

Авторизация и загрузка файлов

Загрузка файлов import.xml и offers.xml начинается с того, что система “1С:Предприятие” отправляет запрос:

ваш_домен/app/addons/rus_exim_1c/exim_1c.php?type=catalog&mode=checkauth

Параметры type и mode определяют какой код будет выполнен.

Выполняется авторизация и интернет-магазин передает системе “1С:Предприятие”:

  • success - означающая успешность соединения.
  • Имя Cookie.
  • Значение Cookie.

Примечание

Дальнейшие запросы к интернет-магазину со стороны “1С:Предприятия” будут содержать имя и значение Cookie. Обработка файлов происходит последовательно.

Обработка import.xml

1C отправляет в интернет-магазин запрос, для начала обработки import.xml:

ваш_домен/app/addons/rus_exim_1c/exim_1c.php?type=catalog&mode=import&filename=import.xml

Выполняется пошаговая загрузка данных:

  • Категорий - функция fn_exim_1c_import_categories
  • Свойства товара - функция fn_exim_1c_collect_features
  • Товары - функция fn_exim_1c_import_products

Обработка offers.xml

После обработки файла import.xml, осуществляется обработка файла offers.xml, по запросу со стороны 1С:

ваш_домен/app/addons/rus_exim_1c/exim_1c.php?type=catalog&mode=import&filename=offers.xml

Обработка данных из файла offers.xml производится с помощью функции fn_exim_1c_import_offers файла func.php.

Результат

В случае успешной загрузки данных 1С передает строку со словом success. Если что то пошло не так, то 1С передаст failure.

Если возникла ошибка

  • Проверьте правильность ввода логина и пароля.

  • Проверьте содержит ли папка ваш_домен/var/files/код_компании/exim/1С_ТекущаяДата файлы import.xml и offers.xml.

  • Проверьте имя папки 1С_ТекущаяДата.

    ТекущаяДата должна соответствовать текущей дате.

  • Попробуйте очистить файлы cookie.

Описание ошибки передается в журнал выгрузки 1С.

После обмена сформированные файлы с данными из 1С сохранятся в папке: ваш_домен/var/files/код_компании/exim/1С_ТекущаяДата

Примечание

Примеры файлов можно скачать по ссылкам:

import.xml

offers.xml

Пример модификации

Если в процессе работы с модулем необходимо внести какие-либо изменения или добавить новые функции, то все изменения вносятся в файлы папки /app/addons/rus_exim_1c/.

Задача

Добавить настройку, которая позволит выбрать параметр из файла import.xml. Параметр будет добавлен в поле товара “Название страницы”.

Варианты настройки:

  • Не импортировать - означает, что при загрузке файлов в поле “Название страницы” данные записываться не будут.
  • Наименование - означает, что при загрузке файлов в поле “Название страницы” будет записываться данные файла import.xml тега <Наименование>.
  • Полное наименование - означает, что при загрузке файлов в поле “Название страницы” будет записываться данные файла import.xml тега <Описание>.

Решение

  1. Откройте файл /app/addons/rus_exim_1c/addon.xml.

  2. В открывшийся файл добавьте код настройки, позволяющая выбрать значение записываемое в поле товара “Название страницы”.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <item id="exim_1c_page_title">
    	<type>radiogroup</type>
    	<name>Использовать в названии страницы</name>
    	<translations>
    		<item lang="en">Use in the page name</item>
    	</translations>
    	<default_value>not_import</default_value>
    	<variants>
    		<item id="not_import">
    			<name>Не импортировать</name>
    			<translations>
    				<item lang="en">Do not import</item>
    			</translations>
    		</item>
    		<item id="name">
    			<name>Наименование</name>
    			<translations>
    				<item lang="en">Name</item>
    			</translations>
    		</item>
    		<item id="full_name">
    			<name>Полное наименование</name>
    			<translations>
    				<item lang="en">Full name</item>
    			</translations>
    		</item>
    	</variants>
    </item>
    
  3. Для записи значения в поле товара “Название страницы” откройте файл /app/addons/rus_exim_1c/func.php.

  4. Найдите функцию fn_exim_1c_import_products в файле func.php (функция вызывается из файла exim_1c.php).

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?php
    if ($fileinfo['filename'] == 'import') {
    	if (Registry::get('addons.rus_exim_1c.exim_1c_export_check_prices') != 'Y') {
    		if (isset($xml->Классификатор)) {
    			fn_exim_1c_import_categories($xml->Классификатор, 0, $user_data['user_type']);
    			fn_exim_1c_collect_features($xml->Классификатор);
    		}
    		if (isset($xml->Каталог)) {
    			fn_exim_1c_import_products($xml->Каталог, $user_data);
    		}
    	}
    }
    
  5. Найдите цикл перебора товаров и добавьте код для записи значения в поле товара “Название страницы”, в зависимости от выбранной настройки “Использовать в названии страницы” модуля “Экспорт, импорт 1С”.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php
    function fn_exim_1c_import_products($xml, $user_data)
    {
        if (isset($xml->Товары->Товар)) {
            if (Registry::isExist('rus_exim_1c.options_1c')) {
                Registry::set('rus_exim_1c.options_1c', array());
            }
            $_cat = Registry::get('rus_exim_1c.categories_1c');
            $products_1C = array();
            $lang_code = CART_LANGUAGE;
            foreach ($xml->Товары->Товар as $_product) {
                if (empty($_product->Наименование) || empty($_product->Группы->Ид)) {
                    continue;
                }
                $product = array();
                $ids = fn_explode('#', $_product->Ид);
                $guid_product = array_shift($ids);
                $guid_variant = (!empty($ids)) ? array_shift($ids) : '';
    			
    			if (Registry::get('addons.rus_exim_1c.exim_1c_page_title') == 'name') {
    			    $product['page_title'] = trim($_product->Наименование, " -");
    			}
                if (Registry::get('addons.rus_exim_1c.exim_1c_page_title') == 'full_name') {
    			    $product['page_title'] = trim($_product->Наименование, " -");
                    foreach ($_product->ЗначенияРеквизитов->ЗначениеРеквизита as $reckvizit) {
                        if (strval($reckvizit->Наименование) == 'Полное наименование') {
                            $product['page_title'] = trim(strval($reckvizit->Значение), " -");
                        }
                    }
    			}
    		}
        }
    }
    
  6. Для просмотра значений переменных и массивов используйте функцию fn_print_r($array). Функция выведет в браузер значения переменных и массивов в удобном виде. В функцию можно передавать несколько переменных и массивов через запятую.

    Примечание

    Обращение к тегам осуществляется через переменную $xml->ИмяТега. Например, $xml->Товары->Товар - обращение к тегу Товар.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <Товары>
    	<Товар>
    		<Ид>bd72d910-55bc-11d9-848a-00112f43529a</Ид>
    		<Артикул>Б-130001</Артикул>
    		<Наименование>Женские ботфорты</Наименование>
    		<БазоваяЕдиница Код="715" НаименованиеПолное="Пара (2 шт.)" МеждународноеСокращение="NPR">пар</БазоваяЕдиница>
    		<ПолноеНаименование>Женские ботфорты Б-130001 Фабрика обуви</ПолноеНаименование>
    		<Группы>
    			<Ид>bd72d90e-55bc-11d9-848a-00112f43529a</Ид>
    		</Группы>
    	</Товар>
    </Товары>
    

Тестирование и разработка без 1С

Запуск обработки файлов import.xml, offers.xml можно осуществлять через браузер с помощью запроса в адресной строке.

Тем самым Вы можете выполнять модификации и разработку без использования 1С.

Загрузите файлы import.xml и offers.xml в папку интернет-магазина:

/var/files/код_компании/exim/1С_ТекущаяДата

ТекущаяДата - формате ДДММГГГГ.

Примечание

Примеры файлов можно скачать по ссылкам:

import.xml

offers.xml

Тестирование файла import.xml

Для тестирование файла import.xml в адресной строке браузера введите: ваш_домен/app/addons/rus_exim_1c/exim_1c.php?type=catalog&mode=import&filename=import.xml

Появиться окно авторизации в котором необходимо ввести имя пользователя интернет-магазина с правами администратора и его пароль.

После загрузки всех данных в окне браузера отобразиться слово означающее окончание обработки файла:

  • success - означает успешное окончание обработки файла.
  • failure - означает, что в процессе загрузки файла произошла ошибка.

Для просмотра значения какой-либо переменной используйте функцию fn_print_r().

Например, добавьте fn_print_r($_product) в функцию fn_exim_1c_import_products.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
function fn_exim_1c_import_products($xml, $user_data)
{
    if (isset($xml->Товары->Товар)) {
        if (Registry::isExist('rus_exim_1c.options_1c')) {
            Registry::set('rus_exim_1c.options_1c', array());
        }
        $_cat = Registry::get('rus_exim_1c.categories_1c');
        $products_1C = array();
        $lang_code = CART_LANGUAGE;
        foreach ($xml->Товары->Товар as $_product) {
		
		    fn_print_r($_product);
            
		}
    }
}

Зайдите в браузер и наберите: ваш_домен/app/addons/rus_exim_1c/exim_1c.php?type=catalog&mode=import&filename=import.xml

В окне браузера должно появиться значения переменной $_product.

Тестирование файла offers.xml

Для загрузки и обработки файла offers.xml введите в браузере: ваш_домен/app/addons/rus_exim_1c/exim_1c.php?type=catalog&mode=import&filename=offers.xml

После загрузки всех данных в окне браузера отобразиться слово означающее окончание обработки файла:

  • success - успех.
  • failure - ошибка.

Результат тестирования

После обмена данными, можно посмотреть данные загруженные в интернет магазин:

  • Данные категорий - “Меню Товары - Категории”.
  • Данные о товарах и их ценах - “Меню Товары - Товары”.

Примечание

Загрузка файлов должна производиться последовательно. Запустите import.xml, после окончания обработки, запустите offers.xml.