Расширяем функционал обмена заказами между 1С-Битрикс и 1С Предприятие УТ 11

в 9:35, , рубрики: 1С-Битрикс, Программирование, метки: ,

Обмен заказами между 1С Предприятие 8.3 Управление Торговлей 11.1 (далее по тексту 1С УТ) и интернет-магазином на базе 1С-Битрикс 14.0 (далее по тексту Битрикс) — это часть стандартного «коробочного» механизма обмена между указанными системами. Пользователь формирует заказ на сайте, а затем по расписанию и, начиная с определенного статуса заказа, заказы выгружаются в 1С УТ. Описание данного механизма в его стандартном виде можно найти по ссылкам, указанным в конце данной статьи, статья же о том, как расширить указанный функционал и подогнать его под документооборот конкретного торгового предприятия.

В стандартном варианте данный механизм обмена не полностью автоматизирует работу менеджера на стороне 1С УТ: дело в том, что реквизиты заказа, такие как метод оплаты, способ доставки — передаются на сторону 1С УТ и записываются в доп. сведения о заказе.

Расширяем функционал обмена заказами между 1С Битрикс и 1С Предприятие УТ 11

Но поля доставки заказа, а так же грузоперевозчик (при доставке грузоперевозчиком), метод оплаты, склад — остаются незаполненными.

Расширяем функционал обмена заказами между 1С Битрикс и 1С Предприятие УТ 11

И для того, чтобы пустить заказ в дальнейший документооборот, пользователю требуется посмотреть на дополнительные сведения и вручную заполнить в заказе все перечисленные поля (автоматическое заполнение склада — это, конечно спорный вопрос, но, как правило, удобно, чтобы по умолчанию при создании заказа выбирался основной склад).

Расширяем функционал обмена заказами между 1С Битрикс и 1С Предприятие УТ 11

Казалось бы, это всего 8 щелчков мышью, однако при большом количестве заказов в день, эти рутинные операции очень утомляют пользователя. Поэтому и встала задача доработки экспорта заказов из Битрикс в 1С УТ таким образом, чтобы поля доставки, грузоперевозчик, поле метода оплаты и поле склад заполнялись автоматически в ходе выполнения обмена.

Кроме этого, важным условием задачи так же являлось не нарушить целостность конфигурации 1С УТ, чтобы не снимать ее с поддержки, поэтому было решено выделить часть модуля обмена, отвечающего за обмен заказами, вынести его во внешнюю обработку, а затем уже доработать функционал этой внешней обработки.

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

Функция СведенияОВнешнейОбработке() Экспорт

                РегистрационныеДанные = Новый Структура;
                РегистрационныеДанные.Вставить("Наименование", "Расширенный обмен заказами с сайтом");
                РегистрационныеДанные.Вставить("БезопасныйРежим", Ложь);
                РегистрационныеДанные.Вставить("Версия", "1.0");
                РегистрационныеДанные.Вставить("Вид", "ДополнительнаяОбработка");
                РегистрационныеДанные.Вставить("Информация", "Обработка для обмена с сайтами, с дополнительными настройками");            

                тзКоманд = Новый ТаблицаЗначений;
                тзКоманд.Колонки.Добавить("Идентификатор");
                тзКоманд.Колонки.Добавить("Представление");
                тзКоманд.Колонки.Добавить("Модификатор");
                тзКоманд.Колонки.Добавить("ПоказыватьОповещение");
                тзКоманд.Колонки.Добавить("Использование");
               
                строкаКоманды = тзКоманд.Добавить();
                строкаКоманды.Идентификатор = "1";
                строкаКоманды.Представление = "Ввод настроек (ОткрытиеФормы)";
                строкаКоманды.ПоказыватьОповещение = Истина;
                строкаКоманды.Использование = "ОткрытиеФормы";
		строкаКоманды.Модификатор = "";
		
                строкаКоманды = тзКоманд.Добавить();
                строкаКоманды.Идентификатор = "2";
                строкаКоманды.Представление = "Запуск обмена (ВызовСерверногоМетода)";
                строкаКоманды.ПоказыватьОповещение = Истина;
                строкаКоманды.Использование = "ВызовСерверногоМетода";
		строкаКоманды.Модификатор = "";
                РегистрационныеДанные.Вставить("Команды", тзКоманд);
                Возврат РегистрационныеДанные;
КонецФункции

Там же в основном модуле обработки необходимо описать процедуру, которую мы будем вешать на регламентное задание, и которая будет непосредственно запускать обмен:

Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт 	
	ЗагрузитьРеквизиты();
	ВыполнитьОбмен(ЭтотОбъект.УзелОбмена, НСтр("ru = 'Фоновый обмен'"));	
КонецПроцедуры

В процедуре выше мы использовали вызов функции ЗагрузитьРеквизиты. В этой фукнции мы выбираем ранее заданные реквизиты дополнительных настроек обмена из хранилища:

Процедура ЗагрузитьРеквизиты() Экспорт
	КлючОбъекта  = "РасширенныйОбмен";
	КлючНастроек = "ОбменССайтомРасширенныйОбмен ";
	ИмяПользователя = "SHARE";
	СтруктураНастроек    = Новый Структура();
	РеквизитыОбработки = ЭтотОбъект.Метаданные().Реквизиты;
	
	Попытка
           СтруктураНастроек = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта,КлючНастроек,,ИмяПользователя);
        Исключение
           Сообщить("Нет прав на восстановление реквизитов.");
        КонецПопытки;
        Если СтруктураНастроек = Неопределено Тогда
            Сообщить("Не вышло восстановить реквизиты!");
	Иначе
		Для каждого Реквизит из РеквизитыОбработки Цикл
			ЭтотОбъект[Реквизит.Имя] = СтруктураНастроек[Реквизит.Имя];
			Сообщить(ЭтотОбъект[Реквизит.Имя]);
		КонецЦикла;	
	КонецЕсли;
КонецПроцедуры

А для того, чтобы задавать расширенные параметры обмена, добавляем к внешней обработке форму, на которой пользователь сможет выбрать узел обмена заказами (узел обмена заказами, настроенный предворительно согласно стандартному руководству), а так же сопоставить способы доставки на сайте со способами доставки на стороне 1С УТ, а методы оплаты на сайте с методами оплаты на стороне 1С УТ. Следует уточнить, что грузоперевозчик — на стороне 1С УТ — это контрагент, поэтому при сопоставлении метода доставки, осуществляемой какой-либо экспедиционной службой, нужно будет выбрать и контрагента-грузоперевозка. Это позволит в дальнейшем формировать по заказу транспортную накладную, не выбирая контрагента-перевозчика заново каждый раз.

Расширяем функционал обмена заказами между 1С Битрикс и 1С Предприятие УТ 11

Сохранение дополнительных реквизитов обмена осуществляется процедурой СохранитьРеквизиты из модуля формы (не путать с основным модулем внешней обработки).

Процедура СохранитьРеквизиты() Экспорт
	КлючОбъекта  = "РасширенныйОбмен";
	КлючНастроек = "ОбменСРасширенныйОбмен ";
	ИмяПользователя = "SHARE";
	Настройки    = Новый Структура();
	Хранитель = РеквизитФормыВЗначение("Объект");
	РеквизитыОбработки = Хранитель.Метаданные().Реквизиты;

	Для каждого Реквизит из РеквизитыОбработки Цикл
		ТипЗначения =  ТипЗнч(Объект[Реквизит.Имя]);
		Если ТипЗначения = Тип("ДанныеФормыКоллекция") Тогда
			Настройки.Вставить(Реквизит.Имя, Объект[Реквизит.Имя].Выгрузить());
		Иначе					
			Настройки.Вставить(Реквизит.Имя, Объект[Реквизит.Имя]);
		КонецЕсли			
	КонецЦикла;
	ХранилищеОбщихНастроек.Сохранить(КлючОбъекта,  КлючНастроек, Настройки, , ИмяПользователя);
КонецПроцедуры

Параметры будут сохраняться в ХранилищеОбщихНастроек — это очень удобный инструмент платформы 1С Предприятие.

Там же в модуле формы мы описываем процедуру ЗагрузитьРеквизиты() аналогично процедуре ЗагрузитьРеквизиты() из основного модуля внешней обработки.

Еще одна процедура из модуля формы — это процедура ручного запуска обмена.

Процедура Начать()	
	Обработка = РеквизитФормыВЗначение("Объект");
	Обработка.ВыполнитьОбмен(Обработка.УзелОбмена, НСтр("ru = 'Фоновый обмен'"));
КонецПроцедуры

После того, как данные приготовления сделаны, мы копируем из стандартного модуля обмена с сайтом конфигурации 1С УТ все те процедуры, которые необходимы нам для обмена заказами (можно скопировать и весь текст модуля). Далее уже в нашем модуле внешней обработки расширенного обмена заказами мы видоизменяем процедуры обмена так, чтобы при обмене посредством данной обработки учитывались наши дополнительные настройки, а именно:

В процедуре СоздатьОбновитьДокументы находим место, где заполняется (в цикле) дополнительное сведение заказа:

СвойстваЗаказа.Вставить(Реквизит, Значение);

Дописываем после этой строки:

    Если Реквизит = "Способ доставки" Тогда
				 НайденнаяСтрока =  ЭтотОбъект.СоответствиеСпособовДоставки.Найти(Значение, "НаСайте"); 
				 Если НЕ НайденнаяСтрока = Неопределено Тогда
			 	    Док.ДокументОбъект.СпособДоставки = НайденнаяСтрока.НаСервере;
					Док.ДокументОбъект.ПеревозчикПартнер = НайденнаяСтрока.Контрагент;
					Попытка
						Для Каждого СтрДерева Из Док.СтруктураДанныхКонтрагента.ДеревоАдресов.Строки Цикл
							Док.ДокументОбъект.АдресДоставки =  СтрДерева.Представление;
						КонецЦикла; 
					Исключение
						//Действия при ошибке
					КонецПопытки;

				КонецЕсли; 
				 
			ИначеЕсли Реквизит = "Метод оплаты" Тогда
				НайденнаяСтрока =  ЭтотОбъект.СоответствиеМетодовОплаты.Найти(Значение, "НаСайте"); 
				Если НЕ НайденнаяСтрока = Неопределено Тогда
			 	    Док.ДокументОбъект.ФормаОплаты = НайденнаяСтрока.НаСервере;
				КонецЕсли; 
			 КонецЕсли;

В той же процедуре после окончания цикла, в котором записываются доп. сведения вставляем:

Если ЭтотОбъект.ДобавлятьСкладКТоварам Тогда
			Для Каждого Строка из Док.ДокументОбъект.Товары Цикл
				Строка["Склад"] = Док.ДокументОбъект.Склад;
			КонецЦикла;
КонецЕсли;

Это сделано для того, чтобы сразу установить заказу основной склад по умолчанию.

Это все. Остается только зарегистрировать обработку в режиме предприятия (я напомню, что это делается в Администрирование-Настройка параметров системы — Печатные формы отчеты и обработки — Дополнительные отчеты и обработки).

Расширяем функционал обмена заказами между 1С Битрикс и 1С Предприятие УТ 11

Задать соответствия для методов оплаты.

Расширяем функционал обмена заказами между 1С Битрикс и 1С Предприятие УТ 11

Задать соответствия для способов доставки:

Расширяем функционал обмена заказами между 1С Битрикс и 1С Предприятие УТ 11

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

Расширяем функционал обмена заказами между 1С Битрикс и 1С Предприятие УТ 11

Ссылки:
1. Описание протокола обмена заказами между 1С-Битрикс и 1С Предприятием УТ;
2. Описание настройки стандартного обмена на стороне 1С-Битрикс;
3. Описание настройки стандартного обмена на стороне 1С Предприятия УТ;
4. Описание формата CommerceML 2.

Автор: Bedrosova

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js