Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Произвольный обмен с 1С

00 голосов
8
Задача выгрузки произвольного справочника в 1С в инфоблок Битрикса

1. В 1С создали обработку, которая выгружает содержимое справочника в XML файл и отправляет его на сервер (например в каталог "/import/"
2. Если вручную через форму в админке "Импорт XML" загрузить этот файл, то все прекрасно работает, т.е. файл "правильный" и загружается так как нужно.

Вопрос
Где и что лучше написать, чтобы "загрузка" проходила автоматически?
Вот код (и соответственно функция), который советует техподдержка
Код
CModule::IncludeModule('iblock');
ImportXMLFile("/import/courses.xml", $iblock_type="courses", $site_id=false, $section_action="D", $element_action="D", $use_crc=false, $preview=false);

Где лучше разместить этот код?
Как его вызвать на исполнение (желательно из 1С)?

Наверно это очень просто, но для меня пока очень смутно...
Буду признателен за помощь.
спросил 04 Июль, 13 от Jerok (120 баллов)

8 Ответы

00 голосов
Про вариант от ТП ничего сказать не могу. Есть свой.
Если вы используете и стандартный обмен с сайтом, то логичнее дописать вызов на стандартной странице обмена /bitrix/modules/sale/admin/1c_exchange.php.

Она выглядит так:

Код
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
?>
<?
if($type=="sale")
{
   $APPLICATION->IncludeComponent("bitrix:sale.export.1c", "", Array(
      "SITE_LIST" => COption::GetOptionString("sale", "1C_SALE_SITE_LIST", ""),
      "EXPORT_PAYED_ORDERS" => COption::GetOptionString("sale", "1C_1C_EXPORT_PAYED_ORDERS", ""),
      "EXPORT_ALLOW_DELIVERY_ORDERS" => COption::GetOptionString("sale", "1C_EXPORT_ALLOW_DELIVERY_ORDERS", ""),
      "EXPORT_FINAL_ORDERS" => COption::GetOptionString("sale", "1C_EXPORT_FINAL_ORDERS", ""),
      "FINAL_STATUS_ON_DELIVERY" => COption::GetOptionString("sale", "1C_FINAL_STATUS_ON_DELIVERY", "F"),
      "REPLACE_CURRENCY" => COption::GetOptionString("sale", "1C_REPLACE_CURRENCY", ""),
      "GROUP_PERMISSIONS" => explode(",", COption::GetOptionString("sale", "1C_SALE_GROUP_PERMISSIONS", "")),
      "USE_ZIP" => COption::GetOptionString("sale", "1C_SALE_USE_ZIP", "Y"),
      )
   );
}
elseif($type=="catalog")
{

   $APPLICATION->IncludeComponent("bitrix:catalog.import.1c", "", Array(
      "IBLOCK_TYPE" => COption::GetOptionString("catalog", "1C_IBLOCK_TYPE", "-"),
      "SITE_LIST" => array(COption::GetOptionString("catalog", "1C_SITE_LIST", "-")),
      "INTERVAL" => COption::GetOptionString("catalog", "1C_INTERVAL", "-"),
      "GROUP_PERMISSIONS" => explode(",", COption::GetOptionString("catalog", "1C_GROUP_PERMISSIONS", "")),
      "GENERATE_PREVIEW" => COption::GetOptionString("catalog", "1C_GENERATE_PREVIEW", "Y"),
      "PREVIEW_WIDTH" => COption::GetOptionString("catalog", "1C_PREVIEW_WIDTH", "100"),
      "PREVIEW_HEIGHT" => COption::GetOptionString("catalog", "1C_PREVIEW_HEIGHT", "100"),
      "DETAIL_RESIZE" => COption::GetOptionString("catalog", "1C_DETAIL_RESIZE", "Y"),
      "DETAIL_WIDTH" => COption::GetOptionString("catalog", "1C_DETAIL_WIDTH", "300"),
      "DETAIL_HEIGHT" => COption::GetOptionString("catalog", "1C_DETAIL_HEIGHT", "300"),
      "ELEMENT_ACTION" => COption::GetOptionString("catalog", "1C_ELEMENT_ACTION", "D"),
      "SECTION_ACTION" => COption::GetOptionString("catalog", "1C_SECTION_ACTION", "D"),
      "FILE_SIZE_LIMIT" => COption::GetOptionString("catalog", "1C_FILE_SIZE_LIMIT", 200*1024),
      "USE_CRC" => COption::GetOptionString("catalog", "1C_USE_CRC", "Y"),
      "USE_ZIP" => COption::GetOptionString("catalog", "1C_USE_ZIP", "Y"),
      "USE_OFFERS" => COption::GetOptionString("catalog", "1C_USE_OFFERS", "N"),
      "USE_IBLOCK_TYPE_ID" => COption::GetOptionString("catalog", "1C_USE_IBLOCK_TYPE_ID", "N"),
      )
   );
}
else
{
   $APPLICATION->RestartBuffer();
   echo "failure\n";
   echo "Unknown command type.";
}
?>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
код должен стать похож на что-то типа
Код
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
?>
<?
if($type=="sale")
{
   $APPLICATION->IncludeComponent("bitrix:sale.export.1c", "", Array(
      "SITE_LIST" => COption::GetOptionString("sale", "1C_SALE_SITE_LIST", ""),
      "EXPORT_PAYED_ORDERS" => COption::GetOptionString("sale", "1C_1C_EXPORT_PAYED_ORDERS", ""),
      "EXPORT_ALLOW_DELIVERY_ORDERS" => COption::GetOptionString("sale", "1C_EXPORT_ALLOW_DELIVERY_ORDERS", ""),
      "EXPORT_FINAL_ORDERS" => COption::GetOptionString("sale", "1C_EXPORT_FINAL_ORDERS", ""),
      "FINAL_STATUS_ON_DELIVERY" => COption::GetOptionString("sale", "1C_FINAL_STATUS_ON_DELIVERY", "F"),
      "REPLACE_CURRENCY" => COption::GetOptionString("sale", "1C_REPLACE_CURRENCY", ""),
      "GROUP_PERMISSIONS" => explode(",", COption::GetOptionString("sale", "1C_SALE_GROUP_PERMISSIONS", "")),
      "USE_ZIP" => COption::GetOptionString("sale", "1C_SALE_USE_ZIP", "Y"),
      )
   );
}
elseif($type=="catalog")
{

   $APPLICATION->IncludeComponent("bitrix:catalog.import.1c", "", Array(
      "IBLOCK_TYPE" => COption::GetOptionString("catalog", "1C_IBLOCK_TYPE", "-"),
      "SITE_LIST" => array(COption::GetOptionString("catalog", "1C_SITE_LIST", "-")),
      "INTERVAL" => COption::GetOptionString("catalog", "1C_INTERVAL", "-"),
      "GROUP_PERMISSIONS" => explode(",", COption::GetOptionString("catalog", "1C_GROUP_PERMISSIONS", "")),
     &n
ответил 04 Июль, 13 от Biks (460 баллов)
00 голосов
Про вариант ТП не знаю, не пробовал.
но за него спасибо :)
по сути вам остается данный вариант выделить в отдельный скрипт или компонент
(если отд. скрипт, не забудьте обернуть все в ядро Битрикс)
затем из 1С по окончании выгрузки файлов вызвать через HTTP соединение данный скрипт
(первоначально только попробуйте проверить вызов скрипта вручную, есть подозрения, что работа может быть пошаговой, в таком случае в 1С делаете вызов с контролем возвращаемого ответа)
ответил 14 Авг, 13 от jenia (1,500 баллов)
00 голосов
Я может выше написал не все по полочкам.
Есть специальный компонент, уже готовый - catalog.import.1c, нужно лишь правильно его вызвать.
Процесс выгрузки иблоков - только пошаговый.
Не нужно изобретать велосипед, и тем более лезть в ядро битрикс.
ответил 13 Ноя, 13 от Biks (460 баллов)
00 голосов
поравьте меня если не прав
Цитата
Иван пишет:
Не нужно изобретать велосипед, и тем более лезть в ядро битрикс.

в ядро никто не лезет :)
имелось в виду header и footer
или prolog_before и epilog_after

что касается
Цитата
Иван пишет:
Не нужно изобретать велосипед, и тем более лезть в ядро битрикс.

зачем же тогда делать это? :)
Цитата
Иван пишет:
то логичнее дописать вызов на стандартной странице обмена /bitrix/modules/sale/admin/1c_exchange.php.

противоречие какое то в ваших советах :)

на самом деле все проще. Если вам нужен свой импорт или модифицированный код такой страницы, никто не мешает сделать ее в публичной части, создав свою точку доступа к импорту. Причем точек доступа для импорта с использованием типового компонента catalog.import.1c вы можете делать сколько угодно и настраивать при этом каждую на свой вариант импорта.

далее еще момент:
а работает ли catalog.import.1c с форматом XML импорта инфоблоков (как я понял именно он и используется)?
Просто я лично не пробовал, поэтому поправьте
к сожалению не смог найти описание функции, предложенной ТП

Ваш вариант, Иван, - это пример когда формат соответсвует CML2

теперь уточняю принципы реализации импорта
1. Отправляем файлы импорта на сервер
2. запускаем скрипт обработки данных файлов, если требуется передаем необходимые параметры (и отслеживаем ответ сервера). В случае многошагоовсти контролируем шаги.
так вот.
как я понял файл в 1С уже подготовлен и на сервер отправлен.
остается шаг 2
В типовом импорте все идет через один компонент (и отправка файлов и последующая инициация обработки)

не важно каким образом это будет реализовано в данном случае. В любом случае это будет какая то точка доступа на сайте (свой скрипт или страница с типовым компонентом). Но к этой точке надо стукнуться из 1С через HTTP соединение и инициализировать обработку данных

исключение будет представлять только случай, если обработкой занимается какой то планировщик (ибо если скрипт не токнуть, он сам по себе не запустится)

и все же точный ответ я дать не могу, так как не проверял совместимость catalog.import.1c с форматом импорт XML инфоблоков
если совместим, то вообще не вижу проблем в реализации задачи (залить файлы под нужными именами и инициировать робработку в данном случае не составляет проблем)
если нет, то скорее всего надо воспользоваться советом ТП, сделать свой скрипт обработки данных и запускать его из 1С по окончании загрузки
Цитата
ErnestD пишет:
Где лучше разместить этот код?

тогда надо будет сделать так
сделать свой скрипт обработки данных и разместить его где нравится в публичной части (не забывайте про учет прав доступа), а также подумать над ответами, которые он будет давать для 1С
Цитата
ErnestD пишет:
Как его вызвать на исполнение (желательно из 1С)?

раз желательно из 1С, значит методом HTTPсоединение обращаемся к нашему скрипту и дожидаемся от него ответа (в момент, когда мы уверены, что файл импорта уже лежит на сервере)
ответил 21 Фев, 14 от jenia (1,500 баллов)
00 голосов
Цитата
Алексей Коваленко пишет:
противоречие какое то в ваших советах smile:)

Это точно подметили :) Думаю эту страницу можно модифицировать, только потом не забыть при обновлении :)
На мой взгляд логичнее использовать именно эту страницу, так как в 1С-ке не нужно будет добавлять еще параметры для обмена. Можно конечно делать и произвольные точки доступа.

Работа компонента catalog.import.1c практически не отличается от работы скрипта на странице XML импорта в админке, формат файлов используется один и тот же.

Цитата
Алексей Коваленко пишет:
и все же точный ответ я дать не могу, так как не проверял совместимость catalog.import.1c с форматом импорт XML инфоблоков если совместим, то вообще не вижу проблем в реализации задачи (залить файлы под нужными именами и инициировать робработку в данном случае не составляет проблем) если нет, то скорее всего надо воспользоваться советом ТП, сделать свой скрипт обработки данных и запускать его из 1С по окончании загрузки Цитата ErnestD пишет: Где лучше разместить этот код?

тогда надо будет сделать так сделать свой скрипт обработки данных и разместить его где нравится в публичной части (не забывайте про учет прав доступа), а также подумать над ответами, которые он будет давать для 1С

Вот про это и пишу, не надо изобретать велосипед.

Стандартная процедуры выгрузки каталога товаров из 1С / загрузки на сайте - достаточно универсально подготовлены и могут быть продублированы для создания обмена: любой справочник 1С => иблок. Практически все решается заменой параметров у вызываемой процедуры обмена в 1С и у компонента catalog.import.1c.

Сам протокол и шаги описаны здесь http://dev.1c-bitrix.ru/api_help/sale/catalog_protocol.php
ответил 13 Июнь, 14 от Biks (460 баллов)
00 голосов
Цитата
Иван пишет:
Это точно подметили Думаю эту страницу можно модифицировать, только потом не забыть при обновлении
На мой взгляд логичнее использовать именно эту страницу, так как в 1С-ке не нужно будет добавлять еще параметры для обмена. Можно конечно делать и произвольные точки доступа.

немного не поняли меня
Дело в том, что есть некие страницы с типовыми компонентами импорта и ничего не мешает сделать аналогичные страницы в публичке и делать с ними все что угодно, не боясь при этом обновлений.
Самый банальный способ - копирование данной страницы
Я же обычно делаю проще: создаю страничку, бросаю на нее компонент catalog.import.1c и настраиваю.
После этого в 1С в настройках обмена указываем путь к нашей странице
P.S. не забываем при этом про установку прав доступа

кроме того, таких страниц можно сделать сколько угодно и на каждой из них можно сделать свою настройку компонент.
Таким образом можно легко опрерировать потоками обмена (настраивая их на свои базы или инфоблоки)
ответил 11 Окт, 14 от jenia (1,500 баллов)
00 голосов
Цитата
Алексей Коваленко пишет:
Дело в том, что есть некие страницы с типовыми компонентами импорта и ничего не мешает сделать аналогичные страницы в публичке и делать с ними все что угодно, не боясь при этом обновлений.

Да, в этом с вами согласен.
Я о том, что если использовать одну точку входа со стороны сайта, то со стороны 1С сохраниться "целостность" информации о сайте. Когда используется несколько адресов для обмена это нужно помнить всем, и разработчика и админам сети, да всем кто причастен к настройке инфраструктуры, на порядок проще использовать один адрес, если это возможно.
ответил 12 Фев, 15 от Biks (460 баллов)
00 голосов
Цитата
Иван пишет:
на порядок проще использовать один адрес, если это возможно.

согласен, но это не должно быть стереотипом.
Все зависит от конкретного проекта. Для большинства среднестатистических проектов больше одной точки доступа действительно не требуется и достаточно даже типовой точки доступа.
ИМХО: Надо делать оптимально. Требуется одна точка доступа - будет одна. Оптимальнее использовать несколько (например, для разделения импорта по разным инфоблокам) - значит надо несколько.

Ведь в 1С тоже можно завести лишь пару обменов (полный и изменения), а иногда оптимальнее сделать несколько планов обмена на определенные номенклатурные группы и с определенными задачами. Все еще и ресурсами определяется и бизнес-процессами предприятия.
ответил 23 Май, 15 от jenia (1,500 баллов)

Похожие вопросы

0 голосов
2 ответов
0 голосов
2 ответов
спросил 20 Апр, 14 от vjick (100 баллов)
0 голосов
4 ответов
спросил 02 Янв, 14 от Oggi (520 баллов)
0 голосов
5 ответов
спросил 09 Май, 13 от Grimmi (2,560 баллов)
+1 голос
1 ответ