Интеграция с интеграцией. YaCRM СДЭК + Розница 2.3

У клиента доработанное под Розницу расширение YaCRM.

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

Для этого нужно отловить момент, когда изменяются данные по заказу в YaCRM.

Для начала определим, где расширение хранит свои данные. Оказывается, в регистре сведений » ДополнительныеСведения», ссылка: e1cib/list/РегистрСведений.ДополнительныеСведения.

Клиент хочет сохранять данные в реквизиты регистра сведений «Состояния доставки заказа покупателя»:

Эти реквизиты предназначены для сервиса 1С:Доставка, который официально не работает с Розницей, но следы которого есть в коде Розницы. Увы, 1С:Доставка работает только с Деловыми Линиями (вроде бы).

Логика работы будет следующая: при записи дополнительных свойств объекта будет соответствующим образом устанавливать состояние доставки.

Свойство «Номер накладной СДЭК»определяем в кэшируемом модуле по имени (для разработчиков):

Функция СвойствоСДЭКНомерНакладной() Экспорт
	Возврат ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "СДЭКНомерНакладной");
КонецФункции

Расширяем модуль набора записей, процедуру ПередЗаписью регистра сведений «Дополнительные сведения»:

&После("ПередЗаписью")
Процедура дор_ПередЗаписью(Отказ, Замещение)
	
	//Проверяем и записываем сопутствующее состояние в регистр состояние доставки
	Если Отказ Тогда
		Возврат;
	КонецЕсли;
	
	
	//Проверяем, нужный ли у нас тип
	Если НЕ ЭтотОбъект.Отбор.Объект.Использование ИЛИ
		ТипЗнч(ЭтотОбъект.Отбор.Объект.Значение) <> Тип("ДокументСсылка.ЗаказПокупателя") 
		Тогда
		Возврат;
	КонецЕсли;
		
	ТекЗаказ = ЭтотОбъект.Отбор.Объект.Значение;
		
	//Работаем только если есть свойство номера накладной
	СвойствоСДЭКНомерНакладной = дор_СерверПовт.СвойствоСДЭКНомерНакладной();
	Если НЕ ЗначениеЗаполнено(СвойствоСДЭКНомерНакладной) Тогда
		Возврат;
	КонецЕсли;
	
	//Перебираем и ищем свойства заказа
	НомерНакладнойСДЭК = "";
	Для Каждого МЗ ИЗ ЭтотОбъект Цикл
		Если МЗ.Свойство = СвойствоСДЭКНомерНакладной Тогда
			НомерНакладнойСДЭК = СокрЛП(МЗ.Значение);
		КонецЕсли;
	КонецЦикла;
	
	МЗ = Неопределено; //Если менеджер записи будет задействован, запишем его потом
	
	З = Новый Запрос(
	"ВЫБРАТЬ
	|	Т.Период КАК Период,
	|	Т.ЗаказПокупателя КАК ЗаказПокупателя,
	|	Т.Состояние КАК Состояние
	|ИЗ
	|	РегистрСведений.СостояниеДоставкиЗаказаПокупателя.СрезПоследних(&дата, ЗаказПокупателя = &ЗаказПокупателя) КАК Т");
	З.УстановитьПараметр("Дата", ТекущаяДата());
	З.УстановитьПараметр("ЗаказПокупателя", ТекЗаказ);
	Выборка = З.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		ТекСостояние = Выборка.Состояние;
	Иначе
		ТекСостояние = Неопределено;
	КонецЕсли;
	
	Если ТекСостояние = Перечисления.СостоянияДоставкиЗаказаПокупателя.Отгружен Тогда
		
		МЗ = РегистрыСведений.СостояниеДоставкиЗаказаПокупателя.СоздатьМенеджерЗаписи();
		ЗаполнитьЗначенияСвойств(МЗ, Выборка);
		МЗ.Прочитать();
		
	ИначеЕсли ТекСостояние = Перечисления.СостоянияДоставкиЗаказаПокупателя.Отменен ИЛИ
		ТекСостояние = Перечисления.СостоянияДоставкиЗаказаПокупателя.ДоставкаЗавершена Тогда
		//В таких состояниях ничего не меняем
		
	ИначеЕсли НомерНакладнойСДЭК <> "" Тогда
		
		//Создаем новое состояние накладной СДЭК
		МЗ = РегистрыСведений.СостояниеДоставкиЗаказаПокупателя.СоздатьМенеджерЗаписи();
		МЗ.ЗаказПокупателя = ТекЗаказ;
		МЗ.Состояние = Перечисления.СостоянияДоставкиЗаказаПокупателя.Отгружен;
		МЗ.Период = ТекущаяДата();
		
	КонецЕсли;
	
	
	Если МЗ <> Неопределено Тогда
		
		//Устанавливаем номер накладной СДЭК
		МЗ.ТрекНомер = НомерНакладнойСДЭК;
		
		//Устанавливаем/сбрасываем оператора доставки
		Если МЗ.ОператорДоставки = "СДЭК" И НомерНакладнойСДЭК = "" Тогда
			МЗ.ОператорДоставки = "";
		КонецЕсли;
		
		Если НомерНакладнойСДЭК <> "" Тогда
			МЗ.ОператорДоставки = "СДЭК";
		КонецЕсли;
		
		МЗ.Записать(); //Сохраняем в базе
		
	КонецЕсли;
		

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

Проверяем — работает. Трек номер устанавливается и сбрасывается, создается новое состояние «Отгружен» при создании накладной СДЭК:

Таким образом, я впервые повзаимодействовал с расширением, отлавливая результаты его работы в местах, где это расширение изменяет данные конфигурации.

Среда: Розница 2.3.10.61, YaCRM_Cdek 2.5. Объем: 2 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован.