Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

Модуль Модуль обмена для opencart v2.3 по стандарту CommerceML [Поддержка]


 Поделиться

Рекомендованные сообщения

В 30.11.2021 в 23:40, Gmp сказал:

@stelstima А какая версия УТ 11? Раньше действительно в выгрузке не было кода, но вот недавно в import.xml я увидел такое:


				<ЗначенияРеквизитов>
					<ЗначениеРеквизита>
						<Наименование>Код</Наименование>
						<Значение>00-00000281</Значение>
					</ЗначениеРеквизита>
					<ЗначениеРеквизита>
						<Наименование>ТипНоменклатуры</Наименование>
						<Значение>Товар</Значение>
					</ЗначениеРеквизита>
					<ЗначениеРеквизита>
						<Наименование>Полное наименование</Наименование>
						<Значение>...</Значение>
					</ЗначениеРеквизита>
				</ЗначенияРеквизитов>

 

Не знаю это 1С наконец-то услышала молитвы, или всё-таки кто-то базу доработал. Версия УТ 11.4.13.281, версия схемы 2.07


https://github.com/Tseka85/opencart3-exchange1c

Ссылка на комментарий
Поделиться на других сайтах

  • Ответы 5,1k
  • Создано
  • Последний ответ

Лучшие авторы в этой теме

Если НЕ ПараметрыПодключения.ЗащищенноеСоединение Тогда
	ssl = Неопределено;
Иначе
      
	ssl = Новый ЗащищенноеСоединениеOpenSSL(
               Новый СертификатКлиентаWindows(),
               Новый СертификатыУдостоверяющихЦентровWindows());   

КонецЕсли;

Соединение = Новый HTTPСоединение(ПараметрыПодключения.Сервер, ПараметрыПодключения.Порт, ПараметрыПодключения.Пользователь, ПараметрыПодключения.Пароль, ПараметрыПодключения.Прокси, ,ssl);

Подскажите, пожалуйста, а в УТ 10.3 где это править?

Ссылка на комментарий
Поделиться на других сайтах


40 минут назад, nash сказал:

Если НЕ ПараметрыПодключения.ЗащищенноеСоединение Тогда
	ssl = Неопределено;
Иначе
      
	ssl = Новый ЗащищенноеСоединениеOpenSSL(
               Новый СертификатКлиентаWindows(),
               Новый СертификатыУдостоверяющихЦентровWindows());   

КонецЕсли;

Соединение = Новый HTTPСоединение(ПараметрыПодключения.Сервер, ПараметрыПодключения.Порт, ПараметрыПодключения.Пользователь, ПараметрыПодключения.Пароль, ПараметрыПодключения.Прокси, ,ssl);

Подскажите, пожалуйста, а в УТ 10.3 где это править?

В последних версиях УТ 10.3 защищенное соединение определяется из заданного URL подключения. 

Н-р, код из ОбщийМодуль.ПроцедурыОбменаССайтом 

Функция РазобратьАдресСайта(Знач АдресСайта) Экспорт
	
	АдресСайта = СокрЛП(АдресСайта); 
	
	HTTPСервер		 			= ""; 
	HTTPПорт					= 0;
	HTTPАдресСкрипта 			= "";
	HTTPЗащищенноеСоединение 	= Ложь;
	
	Если ЗначениеЗаполнено(АдресСайта) Тогда
		
		АдресСайта = СтрЗаменить(АдресСайта, "\", "/");
		АдресСайта = СтрЗаменить(АдресСайта, " ", "");
		
		Если ВРег(Лев(АдресСайта, 7)) = "HTTP://" Тогда
			АдресСайта = Сред(АдресСайта, 8);
		ИначеЕсли ВРег(Лев(АдресСайта, 8)) = "HTTPS://" Тогда
			АдресСайта = Сред(АдресСайта, 9);
			HTTPЗащищенноеСоединение = Истина;
		КонецЕсли;
		
		ПозицияСлэша = Найти(АдресСайта, "/");
		
		Если ПозицияСлэша > 0 Тогда
			HTTPСервер 		 = Лев(АдресСайта, ПозицияСлэша - 1);
			HTTPАдресСкрипта = Прав(АдресСайта, СтрДлина(АдресСайта) - ПозицияСлэша);
		Иначе	
			HTTPСервер 		 = АдресСайта;
			HTTPАдресСкрипта = "";
		КонецЕсли;	
		ПозицияДвоеточия = Найти(HTTPСервер, ":");
		Если ПозицияДвоеточия > 0 Тогда
			HTTPСерверСПортом = HTTPСервер;
			HTTPСервер		  = Лев(HTTPСерверСПортом, ПозицияДвоеточия - 1);
			HTTPПортСтрока 	  = Прав(HTTPСерверСПортом, СтрДлина(HTTPСерверСПортом) - ПозицияДвоеточия);
		Иначе
			HTTPПортСтрока = "0";
		КонецЕсли;
		
		HTTPПорт = ОбщегоНазначения.ПривестиСтрокуКЧислу(HTTPПортСтрока);
		
	КонецЕсли;
	
	СтруктураРезультата = Новый Структура;
	СтруктураРезультата.Вставить("HTTPСервер"	  			, HTTPСервер); 
	СтруктураРезультата.Вставить("HTTPПорт"		   			, HTTPПорт);
	СтруктураРезультата.Вставить("HTTPАдресСкрипта"			, HTTPАдресСкрипта);
	СтруктураРезультата.Вставить("HTTPЗащищенноеСоединение"	, HTTPЗащищенноеСоединение);
	
	Возврат СтруктураРезультата;
	
КонецФункции

 

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах


@searchingman Спасибо!

ммм как все сложно.. Нашел, но что тут нужно поправить? Можете помочь?

Ссылка на комментарий
Поделиться на других сайтах


Подскажите, пожалуйста, при выгрузке заказа в 1с, дублируется в комментарии "Доставка", как это можно пофиксить?

image.png.c7e52706e1b9b0af0a3a1eaf15665d73.png

Ссылка на комментарий
Поделиться на других сайтах


43 минуты назад, nash сказал:

Подскажите, пожалуйста, при выгрузке заказа в 1с, дублируется в комментарии "Доставка", как это можно пофиксить?

image.png.c7e52706e1b9b0af0a3a1eaf15665d73.png

Вот здесь есть решение для 1.6.4.8

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах


3 часа назад, searchingman сказал:

поправил, а все равно идут дубли...

image.thumb.png.8026587659d856dd6de2c3732fd3de31.png

 

image.png.6f8e85941cf830f72717f06b74af917e.png

 

 

решено, спасибо. Заменил весь кусок кода. Но не совсем понимаю как остальной код влияет на эту проблему...

Изменено пользователем nash
Ссылка на комментарий
Поделиться на других сайтах


В 03.02.2022 в 14:38, nash сказал:

поправил, а все равно идут дубли...

image.thumb.png.8026587659d856dd6de2c3732fd3de31.png

 

image.png.6f8e85941cf830f72717f06b74af917e.png

 

 

решено, спасибо. Заменил весь кусок кода. Но не совсем понимаю как остальной код влияет на эту проблему...

держи, не должны дублироваться

	public function queryOrders() {

		$this->log("~ЭКСПОРТ ЗАКАЗОВ В УЧЕТНУЮ СИСТЕМУ",2);

		$orders_export = $this->queryOrdersExport();

		// Валюта документа
		$currency = $this->config->get('exchange1c_order_currency') ? $this->config->get('exchange1c_order_currency') : 'руб.';

		$document = array();

		if (count($orders_export)) {

			$document_counter = 0;

			$this->load->model('customer/customer_group');
			$this->load->model('sale/order');

			foreach ($orders_export as $order_id => $order_status_id) {

				$order = $this->model_sale_order->getOrder($order_id);
				$this->log("Заказ #" . $order['order_id']);
				$this->log($order, 2);


				// Если при оформлении заказа покупатель зарегистрировался
				if ($order['customer_id']) {
					$this->getCustomerInfo($order);
				}

				$order['date'] = date('Y-m-d', strtotime($order['date_added']));
				$order['time'] = date('H:i:s', strtotime($order['date_added']));
				$customer_group = $this->model_customer_customer_group->getCustomerGroup($order['customer_group_id']);

				if( !empty($order['comment']) ) {
				$comment = " | Комментарии покупателя: " . $order['comment'];
				} else {
					$comment = " | Комментарии покупателя: не указал";
				}
					// Шапка документа
				$document['Документ' . $document_counter] = array(
					 'Ид'          => $order['order_id']
					,'Номер'       => $order['order_id']
					,'Дата'        => $order['date']
					,'Время'       => $order['time']
					,'Валюта'      => $currency
					,'Курс'        => 1
					,'ХозОперация' => 'Заказ товара'
					,'Роль'        => 'Продавец'
					,'Сумма'       => $order['total']
					,'Комментарий' => " | Доставка: " . $order['shipping_method'] . " | Оплата: " . $order['payment_method'] . $comment
					//,'Соглашение'  => $customer_group['name'] // the agreement
				);

				if ($this->config->get('exchange1c_order_customer_default')) {
					$order['username'] = htmlspecialchars(trim($this->config->get('exchange1c_order_customer_default')));
					$order['firstname'] = $order['username'];
					$order['lastname'] = "";
				} else {
					// Первая буква должна быть заглавной и убираем лишние пробелы сдева и справа
					// ТОЛЬКО ДЛЯ САЙТА РАБОТАЮЩЕГО НА КОДИРОВКЕ UTF-8
					$order['lastname'] = mb_convert_case(trim($order['lastname']), MB_CASE_TITLE, "UTF-8");
					$order['firstname'] = mb_convert_case(trim($order['firstname']), MB_CASE_TITLE, "UTF-8");
					if (isset($order['middlename']))
						$order['middlename'] = mb_convert_case(trim($order['middlename']), MB_CASE_TITLE, "UTF-8");
					else
						$order['middlename'] = '';

					// Собираем полное наименование покупателя, ФИО
					$order['username'] =  $order['lastname'] . ' ' . $order['firstname'] . ($order['middlename'] ? ' ' . $order['middlename'] : '');
				}

				// ПОКУПАТЕЛЬ (КОНТРАГЕНТ)
				$document['Документ' . $document_counter]['Контрагенты']['Контрагент'] = $this->setCustomer($order);
				if ($this->ERROR) return false;

				// РЕКВИЗИТЫ ДОКУМЕНТА
				$document['Документ' . $document_counter]['ЗначенияРеквизитов'] = $this->setDocumentRequisites($order, $document);
				if ($this->ERROR) return false;

				// ТОВАРЫ ДОКУМЕНТА
				$products = $this->model_sale_order->getOrderProducts($order_id);

				$product_counter = 0;
				foreach ($products as $product) {
					$product_guid = $this->getGuidByProductId($product['product_id']);
					$document['Документ' . $document_counter]['Товары']['Товар' . $product_counter] = array(
						 'Ид'             => $product_guid
						,'Наименование'   => $product['name']
						,'ЦенаЗаЕдиницу'  => $product['price']
						,'Количество'     => $product['quantity']
						,'Сумма'          => $product['total']
						,'Скидки'         => array('Скидка' => array(
							'УчтеноВСумме' => 'false'
							,'Сумма' => 0
							)
						)
						,'ЗначенияРеквизитов' => array(
							'ЗначениеРеквизита' => array(
								'Наименование' => 'ТипНоменклатуры'
								,'Значение' => 'Товар'
							)
						)
					);
					$current_product = &$document['Документ' . $document_counter]['Товары']['Товар' . $product_counter];
					// Резервирование товаров
					if ($this->config->get('exchange1c_order_reserve_product') == 1) {
						$current_product['Резерв'] = $product['quantity'];
					}

					// Если не заданы единицы измерений товара, выгружаем базовую
					if ($this->config->get('exchange1c_export_system') == '1c_ut11') {
						$current_product['БазоваяЕдиница'] = array(
							'Код' 					=> '796',
							'НаименованиеПолное' 	=> 'Штука'
						);
					}

					// Характеристики
					$feature_guid = $this->getFeatureGuid($product['order_product_id'], $order_id);
					if ($feature_guid) {
						$current_product['Ид'] .= "#" . $feature_guid;
					}

					$product_counter++;
				}

				$document_counter++;

			} // foreach ($query->rows as $orders_data)

		} // if (count($orders_export))
		//$this->log($document, 2);

		// Формируем заголовок
		$root = '<?xml version="1.0" encoding="utf-8"?><КоммерческаяИнформация ВерсияСхемы="2.07" ДатаФормирования="' . date('Y-m-d', time()) . '" />';

		$root_xml = new SimpleXMLElement($root);
		$xml = $this->array_to_xml($document, $root_xml);

		// Проверка на запись файлов в кэш
		$cache = DIR_CACHE . 'exchange1c/';
		if (@is_writable($cache)) {
			// запись заказа в файл
			$f_order = @fopen($cache . 'orders.xml', 'w');
			if (!$f_order) {
				$this->log("Нет доступа для записи в папку: " . $cache);
			} else {
				fwrite($f_order, $xml->asXML());
				fclose($f_order);
			}
		} else {
			$this->log("Папка " . $cache . " не доступна для записи, файл заказов не может быть сохранен!",1);
		}

		return $xml->asXML();

	} // queryOrders()


	/**
	 * Возвращает курс валюты
	 */

 

Ссылка на комментарий
Поделиться на других сайтах


Ребят всем привет!!! Совсем новенький в opencart!, прошу кто-нибудь поделитесь последней версией, данного модуля, все ссылки устарели на глухо. Будем изучать просторы opencart)). Всем респект! Я так понял, тут целая команда, дружно все правила. Автору, отдельное спасибо.

 

Ссылка на комментарий
Поделиться на других сайтах


1 час назад, RuslanAkh сказал:

Ребят всем привет!!! Совсем новенький в opencart!, прошу кто-нибудь поделитесь последней версией, данного модуля, все ссылки устарели на глухо. Будем изучать просторы opencart)). Всем респект! Я так понял, тут целая команда, дружно все правила. Автору, отдельное спасибо.

 

1.6.4.8  для 2.3.x и для 3.x

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах


Добрый день.

Есть рабочий магазин на ocStore 2.3.0.2.2

Установил этот модуль, настроил.

Загружать товары не нужно, хочу только получать заказы с сайта.

Поставил фильтр на дату заказов (за 2 дня) и на статус. Запускаю ручную выгрузку - модуль зависает и через какое то время выпадает в 504 ошибку.

Если установить фильтр по которому точно нет заказов - получаю файл только с заголовком, нормально.

Включил лог, но при зависании в него ничего не попадает.

Как бы отследить на каком этапе он зависает?

Может не заполнены каике то служебные таблицы модуля?

И возможен ли такой вариант работы - только выгрузка заказов?

 

Ссылка на комментарий
Поделиться на других сайтах


подскажите, пожалуйста, где можно автоматически проставить остаток? либо отключить "вычитать со склада"?

Ссылка на комментарий
Поделиться на других сайтах


2 часа назад, nash сказал:

подскажите, пожалуйста, где можно автоматически проставить остаток? либо отключить "вычитать со склада"?

Что значит автоматически проставить остаток? Если остатки для всех товаров одинаковы, то можно запросом в БД.

Ссылка на комментарий
Поделиться на других сайтах


22 минуты назад, searchingman сказал:

Что значит автоматически проставить остаток? Если остатки для всех товаров одинаковы, то можно запросом в БД.

чтобы при обмене с 1с, например, при добавлении нового товара отключалась возможность "Вычитать со склада"

Ссылка на комментарий
Поделиться на других сайтах


Подскажите, пожалуйста, как передать в 1с произвольное поле аккаунта?

Ссылка на комментарий
Поделиться на других сайтах


15.02.2022 в 18:03, nash сказал:

чтобы при обмене с 1с, например, при добавлении нового товара отключалась возможность "Вычитать со склада"

Здравствуйте, в опциях раздел "Товары -> Характеристики" есть переключатель "Вычитать со склада" но работает он только для характеристик.

Чтобы это заработало необходимо добавить код в функцию setProduct():

 

2022-02-27_11-56-59.png.cada0ff20ad02a22bd5011777cb0f8ab.png

 

$data['subtract'] = $this->config->get('exchange1c_product_options_subtract');

 

Код я не проверял, но добавил в свой модуль 1.6.4.8  который работает на моем сайте.

И теперь при добавлении и обновлении будет меняться значение поля subtract в таблице product

image.thumb.png.1747d089a3c0a908e204dfc9e5df5f01.png

Изменено пользователем Kirillove
номер версии модуля исправил, дубль картинки
  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

11.02.2022 в 18:12, Builder2k сказал:

Загружать товары не нужно, хочу только получать заказы с сайта.

Поставил фильтр на дату заказов (за 2 дня) и на статус. Запускаю ручную выгрузку - модуль зависает и через какое то время выпадает в 504 ошибку.

Если установить фильтр по которому точно нет заказов - получаю файл только с заголовком, нормально.

Включил лог, но при зависании в него ничего не попадает.

Как бы отследить на каком этапе он зависает?

Может не заполнены каике то служебные таблицы модуля?

И возможен ли такой вариант работы - только выгрузка заказов?

Здравствуйте, такой вариант работы не тестировался, но я сейчас просматриваю код модуля обработки товаров в заказе в функции queryOrders().

Там если ранее товар не был загружен на сайт, то таблица product_to_1c будет пустая и функция getGuidByProductId() вернет пустую строку.

Товары в итоге выгрузятся в 1С.

Если у Вас ошибки при вызове функции получения заказов queryOrders(), значит надо смотреть еще лог ошибок сервера error.log, в котором фиксируются фатальные ошибки при выполнении php кода или SQL запроса. При ошибках в SQL запросе в логе opencart последняя запись будет строка запроса и далее завершение обмена, а в логе веб сервера будет подробно расписано в каком файле, стек вызова функций, номер строки и описание ошибки. 

Если лог веб сервера Вы не нашли обратитесь в поддержку Вашего хостинга.

Лучше всего включите лог в режиме отладка+запросы (в настройках модуля обмена в админке), обнулите лог через FTP в папке /system/storage/logs, и запустите обмен, сохраните лог и покажите последние строчки

Изменено пользователем Kirillove
орфографические ошибки, добавлен текст
Ссылка на комментарий
Поделиться на других сайтах

21.02.2022 в 23:09, nash сказал:

Подскажите, пожалуйста, как передать в 1с произвольное поле аккаунта?

@Kirillove спасибо за информацию! А вот по этому пункту не можете помочь? Еще есть проблема, перестал передаваться в комментариях способ доставки...

Ссылка на комментарий
Поделиться на других сайтах


Возможно ли сделать 2 статуса для выгрузки заказа в 1с?

Ссылка на комментарий
Поделиться на других сайтах


помогите решить проблемку, может кто сталкивался, может где точку забыл поставить.
1с розница + выгрузка последняя (любая из двух) 2.3, без seo модуля 
3 магазина в 1с, один отключён (при выгрузке склад учитывается, в связь не добавляется), в одном есть товар по 20руб, во втором нет товара (когда-то закончился) по 10 руб. (3 вложенность, т.е. косметика--уход за волосами--шампуни---товар)
При выгрузке, категории "косметика" или "уход за волосами" на сайте упорно ставится цена 10 руб, как наименьшая среди магазинов, несмотря на то что товара нет
И лишь при выгрузке только 3 категории, отдельно, цена встает правильно.
удаление связи цен тоже не помогает.
Подскажите на какой участок кода обратить внимание.(я на уровне тугодума в скриптах, соображаю, но долго((  )

Ссылка на комментарий
Поделиться на других сайтах


27.02.2022 в 17:35, nash сказал:

@Kirillove спасибо за информацию! А вот по этому пункту не можете помочь? Еще есть проблема, перестал передаваться в комментариях способ доставки...

Комментарий передается с заказа, таблица order поле comment

Документы формируются в функции queryOrders()

 

image.thumb.png.77efba8c23cbac75fa1d0caf5a69d0a5.png

 

включите лог в режиме отладки, посмотрите номер строки где выводится у вас в файле /admin/model/extension/exchange1c.php содержимое заказа с сайта

и в логах найдите по поиску, например, у меня строка 6482. Там будет содержимое массива где должен быть comment

 

image.png.4cdf3f29b8c6046b47fbbfc801973530.png

 

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

01.03.2022 в 02:11, doronus сказал:

помогите решить проблемку, может кто сталкивался, может где точку забыл поставить.
1с розница + выгрузка последняя (любая из двух) 2.3, без seo модуля 
3 магазина в 1с, один отключён (при выгрузке склад учитывается, в связь не добавляется), в одном есть товар по 20руб, во втором нет товара (когда-то закончился) по 10 руб. (3 вложенность, т.е. косметика--уход за волосами--шампуни---товар)
При выгрузке, категории "косметика" или "уход за волосами" на сайте упорно ставится цена 10 руб, как наименьшая среди магазинов, несмотря на то что товара нет
И лишь при выгрузке только 3 категории, отдельно, цена встает правильно.
удаление связи цен тоже не помогает.
Подскажите на какой участок кода обратить внимание.(я на уровне тугодума в скриптах, соображаю, но долго((  )

Здравствуйте, если версия модуля 1.6 тогда смотреть нужно parseOffers() читаются предложения, включите лог в режиме отладки и выполните обмен

Выделенным текстом выводится в лог информация массива $data где формируется цена предложения.

Проверьте правильная тут цена?

Далее нужно точно знать в этом товаре есть характеристики в 1С ?

Если есть в 1С характеристики (опции на сайте) то за расчет цен берется функция:

 

image.png.e47413b0239c2922192961e491a129b4.png

 

Далее нужно точно знать в этом товаре есть характеристики в 1С ?

Если есть в 1С характеристики (опции на сайте) то за расчет цен берется функция getProductFeaturesQuantityPrice():

 

image.png.5911668bca80f0caec87fae1075f6ff8.png

 

Непосредственно в сам товар цену и остатки записывает функция updateOffers().

Ссылка на комментарий
Поделиться на других сайтах

28.02.2022 в 16:40, nash сказал:

Возможно ли сделать 2 статуса для выгрузки заказа в 1с?

Чтобы выгружались по нескольким условиям? 

Например так?

image.thumb.png.369134611e79d250988eb7ed68e1cd3c.png

Ссылка на комментарий
Поделиться на других сайтах

28.02.2022 в 23:26, Kirillove сказал:

Чтобы выгружались по нескольким условиям? 

Например так?

image.thumb.png.369134611e79d250988eb7ed68e1cd3c.png

да, именно так)

Ссылка на комментарий
Поделиться на других сайтах


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.