Обмен с сайтом Bitrix Событие окончания выгрузки xml пакетов OnCompleteCatalogImport1C

07.12.20

Интеграция - Сайты и интернет-магазины

Активация недокументированного события Bitrix - завершения обмена xml пакетами для штатной выгрузки (Обмен с сайтом). 1С 8.3 УТ 11.4.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
1С Обмен с сайтом Bitrix Событие окончания выгрузки xml пакетов OnCompleteCatalogImport1C:
.cfe 7,88Kb
7
7 Скачать (1 SM) Купить за 1 850 руб.

Всем привет ))

Задача

  • Выгрузить из 1С на сайт Битрикс Каталог товаров торговых предложений цены и т.д.
  • После выгрузки, по событию на сайте, запустить свой обработчик для модификации полученных данных

(нам удобнее обработать весь каталог сразу а не ловить каждое изменение данных как рекомендуют специалисты )

Инструменты

  1. Штатная выгрузка 1С (обмен с сайтом) – *используем по умолчанию
  2. Обработка от Битрикс – Обмен с интернет магазином

Проблема

Обмен и там и там идет xml пакетами, 1С отправляет, Bitrix принимает

по документации, для обмена, у Bitrix существует два события

  • OnBeforeCatalogImport1C - перед началом обработки xml пакета
  • OnSuccessCatalogImport1C - по окончанию обработки xml пакета

Если для запуска своего скрипта использовать событие OnSuccessCatalogImport1C – оно за выгрузку сработает несколько раз (например)

  1. Для штатной выгрузки 1С – 2 раза (товары+торговые предложения)
  2. Для выгрузки Bitrix ~ 6 раз (товары+торговые предложения+цены+остатки и т.д.)

Как отловить окончание всей выгрузки – непонятно

Поиск…

Которое вызывается get запросом вида

https://example.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=complete&sessid=ID_Сессии

  • в конфигураторе по поиску кода оказалось что строка mode=complete ПРИСУТСТВУЕТ в модуле Битрикса
  • при выгрузке на сайт через модуль Битрикса – выяснилось что данное событие СРАБАТЫВАЕТ на сайте

Решение (да простит меня Битрикс)

  1. Делаем расширение конфигурации типа адаптация
  2. Из основной конфигурации добавляем в расширение ОбщийМодуль/ОбменССайтом
  3. Используем запуск по окончании основной функции
  4. Формируем в модуле расширения GET запрос к сайту для активации  OnCompleteCatalogImport1C

 

 
Со стороны 1С 
&После("ДобавитьПараметрыПротоколаОбменаВСтруктуру")
// Процедура - добавляет в структуру параметры http запросов
Процедура CatalogImport1C_ДобавитьПараметрыПротоколаОбменаВСтруктуру(СтруктураПараметров)
	СтруктураПараметров.Вставить("ПараметрЗапросаHTTP_ДеактивацияДанныхПоДате"	, "&mode=deactivate");
	СтруктураПараметров.Вставить("ПараметрЗапросаHTTP_ОкончаниеВыгрузкиТоваров"	, "&mode=complete");
//	Сообщить("обновлена СтруктураПараметров");
КонецПроцедуры	

&После("ВыполнитьОбменССайтом")
// Процедура - Выполняет запуск обмена с сайтом.
//
// Параметры:
//  Параметры - Структура - настройки и данные для обмена.
//  РезультатОбмена - Структура - результат обмена товарами и заказами.
//  ТаблицаИнформации - ТаблицаЗначений - таблица, хранящая лог обмена.
//
Процедура CatalogImport1C_ВыполнитьОбменССайтом(Параметры, РезультатОбмена, ТаблицаИнформации) Экспорт
	Если Параметры.ВыгружатьНаСайт Тогда  //проверка на выгрузку на сайт или в локальный каталог
		ТипСоединения = "catalog";
		ОтветСервера = "";
		Соединение = Неопределено;
		ОписаниеОшибки = "";

		НастройкиПодключения = Параметры.НастройкиПодключения;

		АдресДляРаботы = НастройкиПодключения.АдресСкрипта + "?type=" + ТипСоединения; 
		Успешно = ВыполнитьАвторизациюДляСоединения(Соединение, НастройкиПодключения, 
												ОтветСервера, ОписаниеОшибки,
												ТипСоединения);
		Если НЕ Успешно Тогда
//			ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Выгрузка на сайт не выполнена.'"));
			Сообщить("авторизация на сайте не выполнена");
		КонецЕсли;
	
		КукиИмя				= СтрПолучитьСтроку(ОтветСервера, 2);
		КукиЗначение		= СтрПолучитьСтроку(ОтветСервера, 3);
		ЗаголовкиЗапросов	= Новый Соответствие;
		ЗаголовкиЗапросов.Вставить("Cookie", КукиИмя + "=" + КукиЗначение);
		
		ПараметрыЗапроса = АдресДляРаботы + НастройкиПодключения.ПараметрЗапросаHTTP_ОкончаниеВыгрузкиТоваров;
		Если Параметры.ИспользоватьИдентификаторСессии Тогда
			ПараметрыЗапроса = ПараметрыЗапроса + "&sessid=" + НастройкиПодключения.ИдентификаторСессии;
		КонецЕсли;
	
		Сообщить("Запрос сайту Bitrix:" + Символы.ПС + ПараметрыЗапроса);
		ОтветСервера = ПолучитьДанныеССервера(
			Соединение,
			ОписаниеОшибки,
			ПараметрыЗапроса,
			ЗаголовкиЗапросов);
	
		Если ОтветСервера = Неопределено Тогда 
//			ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Выгрузка на сайт не выполнена.'"));
			Сообщить("Bitrix не ответил на запрос");
		Иначе
			Сообщить("Ответ сайта Bitrix:" + Символы.ПС + ОтветСервера);   
		КонецЕсли;
	
		Сообщить(Формат(ТекущаяДата(), "ггггММддЧЧммсс")+ " Обмен xml пакетами с сайтом завершен");
	КонецЕсли;

КонецПроцедуры

 

 
 Со стороны Битрикса

 В файле sftp://хххххх/хххххх.ru/bitrix/php_interface/init.php или в инклюде к этому файлу ловим события и запускаем свой скрипт

/***********************************************************************************
	записать в лог файл на диске
	$var - переменная
	$filename - имя файла
	$path - путь относительно корня *по умолчанию
		/_logs/bx/					- каталог для системных ошибок 
		/_logs/log_debug/ 			- просто каталог для отладки скриптов
		/_logs/log_import_from_1C/ 	- каталог для отладки скриптов мипорта
***********************************************************************************/
function cl_print_w ($var, $filename="", $path = "/_logs/log_import_from_1C/")
{
//	$pr = date("Y-m-d H:i:s");
	$pr = date("H:i:s");
	 	 
    if ($filename=="" or empty($filename)){
      \Bitrix\Main\Diag\Debug::writeToFile($pr.$var,
      "",
      $path.date("Y-m-d H_00")." cadmarket.log");
    }
    else {
      \Bitrix\Main\Diag\Debug::writeToFile($pr.$var,
      "",
      $path.date("Y-m-d H_00")." cadmarket ".$filename.".log");
    }	
}


//СОБЫТИЯ при импорте из 1С

// регистрируем обработчик
AddEventHandler("catalog", "OnBeforeCatalogImport1C",   Array("EventClass", "ric_OnBeforeCatalogImport1C"));
AddEventHandler("catalog", "OnSuccessCatalogImport1C",  Array("EventClass", "ric_OnSuccessCatalogImport1C"));
AddEventHandler("catalog", "OnCompleteCatalogImport1C", Array("EventClass", "ric_OnCompleteCatalogImport1C"));

class EventClass{
  function ric_OnBeforeCatalogImport1C($arPropertyValues, $ABS_FILE_NAME){
    $msg = "Перед загрузкой пакета XML";
    cl_print_w("-On- BeforeCatalogImport1C : ".$msg. 
               "\n".$ABS_FILE_NAME.	 
               "\n----------------------------------------------------------------------------------------------------------------------",
               "ImportFrom1C"			
              );
    return "";}					   
		
  function ric_OnSuccessCatalogImport1C($arPropertyValues, $ABS_FILE_NAME){
    $msg = "После загрузки пакета XML"; 
    cl_print_w("-On- SuccessCatalogImport1C : ".$msg.
               "\n".$ABS_FILE_NAME.	 
               "\n----------------------------------------------------------------------------------------------------------------------",
               "ImportFrom1C"			
               );
    return "";}

  function ric_OnCompleteCatalogImport1C(){
    $msg = "После загрузки всех XML пакетов. Старт";
    cl_print_w("-On- CompleteCatalogImport1C : ".$msg. 
               "\n----------------------------------------------------------------------------------------------------------------------",
               "ImportFrom1C"			
               );
	echo nl2br(date("H:i:s")." ".$msg."\n");                    // оставьте эту строчку если хотите увидеть это в ответе для 1С

    $startImportCatalogTimer = microtime(true); 				// начало измерения импорта каталога
//  $ret=fn_SetAfterImport();   //скрипт обработки каталога
    $stopImportCatalogTimer = microtime(true); 					// конец измерения импорта каталога

    $msg = "После загрузки всех XML пакетов. Стоп";
	echo nl2br(date("H:i:s")." ".$msg."\n");                    // оставьте эту строчку если хотите увидеть это в ответе для 1С
    cl_print_w("-On- CompleteCatalogImport1C : ".$msg.
               "\nЗатрачено время: ".($stopImportCatalogTimer - $startImportCatalogTimer)." сек.".					   
               "\n----------------------------------------------------------------------------------------------------------------------",
               "ImportFrom1C"
               );
    return "";}
}	

 

Расширение ОбменССайтом Битрикс Событие Полная выгрузка Адаптация

См. также

Сайты и интернет-магазины Платформа 1С v8.3 1С:Розница 2 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

Готовое интеграционное решение для оплаты покупок Долями в 1C:Розница 2.3. Реализовано в виде расширения. Интеграция сервиса dolyame.ru для приема платежей в рассрочку. Поддерживает работу от разных юридических лиц. Работа: в составе РИБ, отдельно от РИБ, тонкий, толстый клиент, web-клиент (через интернет-браузер).

20400 руб.

19.12.2023    4219    28    9    

27

СБП. Оплата по QR-коду Сайты и интернет-магазины Программист Платформа 1С v8.3 Конфигурации 1cv8 Автомобили, автосервисы Россия Бухгалтерский учет Управленческий учет Платные (руб)

В настоящее время система СБП очень часто стала использоваться в повседневной жизни. Одна из систем интеграции СБП через СБЕР. Данная конфигурация является инструментом интеграции СБП в Альфа Авто. Данная система не просто формирует статический QR, а динамический, а значит, в системе будет привязка и на покупателя, и на документ.

6000 руб.

25.10.2022    6139    31    4    

10

Оптовая торговля Розничная торговля Сайты и интернет-магазины Программист Платформа 1С v8.3 Оперативный учет 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

ВАЖНО: расширения не предназначены для модуля обмена Битрикс 8.х. Полный список ограничений см. ниже в разделе ОГРАНИЧЕНИЯ. Расширение предназначено для выгрузки на сайт Битрикс сопутствующих товаров, аналогов, рекомендованных и прочих связанных товаров.

3600 руб.

25.07.2018    45702    87    77    

95

Сайты и интернет-магазины Программист Пользователь Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Платные (руб)

Данный модуль предоставляет возможность выгружать заказы из 1С: Управление торговлей 11 версии в "MEASOFT" (ранее "Курьерская служба 2008").

9600 руб.

27.04.2022    11275    19    3    

10
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ef1 19 07.12.20 13:55 Сейчас в теме
Спасибо, за оценки ))
но самое смешное оказалось в том что наш хостер обновил версию PHP до 7.2 с копейками
и выгрузка 5к позиций тормознулась с 10 до 30 минут....
думали что виноват параметр php_value mbstring.func_overload 0 из .htaccess
(до этого был в 2 ке, но Битрикс для обновлений требует 0)
короче практически смирившись с неизбежными тормозами
(причем логирование железа сервера 1С и хостера - показывало что машины не нагружены)
выложив сюда публикацию и посмотрев на время из логов
оказалось
что у хостера время выставлено на ЧАС НАЗАД!!!, кто бы мог подумать ))
т.е. сервер 1С посылал все свои запросы в ПРОШЛОЕ ))

помог короче сам себе ))
2. ef1 19 10.12.20 14:31 Сейчас в теме
добавил проверку выгрузки на сайт или локально
Если Параметры.ВыгружатьНаСайт Тогда  //проверка на выгрузку на сайт или в локальный каталог

расширение не менял (код в тексте темы)
3. ef1 19 10.01.22 13:20 Сейчас в теме
при переходе на УТ 11.5 будет сообщение -...расширение - On complete catalog import1C ...не поддерживает язык - RU... (или что то в этом духе)

в конфигураторе встаньте на расширение - нажмите проверить, и в окне сообщений - исправить, при этом ссылка на RU в каком то параметре расширения будет сброшена - и все ок
Оставьте свое сообщение