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

07.12.20

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

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

Файлы

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

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

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

Задача

  • Выгрузить из 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) Россия Платные (руб)

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

24000 руб.

19.12.2023    10705    59    14    

54

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

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

36000 руб.

03.08.2020    22042    32    24    

26

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

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

54000 руб.

10.09.2024    3056    4    6    

3

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

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

9600 руб.

27.04.2022    12609    22    3    

13

Файловый обмен (TXT, XML, DBF), FTP Сайты и интернет-магазины 1С v8.3 1С:Управление торговлей 11 Россия Платные (руб)

Загрузка файла YML (формат Yandex Market Language(YML) — собственный стандарт Яндекса, основанный на XML) в УТ11.5 Создание дерева номенклатуры, создание карточек номенклатуры и доп реквизитов, загрузка картинок в карточку. Оптимизировано для выгрузки в Битрикс. Возможна загрузка нескольких Фид - предусмотрено разделение по площадкам

7000 руб.

01.11.2024    1397    1    1    

2

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

Легкая обработка для мониторинга цен практически любого сайта (парсинга), не требует специальных знаний при настройке.

6960 руб.

17.04.2017    33620    30    28    

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