Обмен с сайтом 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-клиент (через интернет-браузер).

22440 руб.

19.12.2023    6362    41    11    

37

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

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

24000 руб.

02.11.2024    884    4    0    

4

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

Склад Вашего магазина онлайн в Telegram. С картинками, ценами, описанием и характеристиками. Используйте Telegram как торговую площадку и увеличивайте продажи.

54000 руб.

10.09.2024    1107    2    4    

3

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

Программа позволяет одним кликом настроить сбор цен ваших конкурентов или дилеров в интернете. Автоматически собирает данные результата поиска Яндекса (вам не придется вручную добавлять каждый сайт, за которым нужно следить). Обновление цен происходит по заданному вами расписанию автоматически. Можете легко отслеживать позиции вашего сайта в Яндексе по ключевым словам и фразам. Этот инструмент даст вам лучшее понимание того, как ваша SEO-стратегия влияет на видимость вашего сайта в поисковой выдаче, и поможет вам улучшить контент и структуру сайта для повышения его позиций. Функция доступна во всех тарифах.

19950 руб.

23.09.2019    31368    8    12    

30

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

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    18712    20    22    

18

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

Расширения для возможности ввода в УТ (ERP КА), УНФ, Рознице 2 множественных свойств и выгрузки значений их на сайт Битрикс.

7500 руб.

29.11.2017    67772    784    108    

212
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 в каком то параметре расширения будет сброшена - и все ок
Оставьте свое сообщение