Финальные штрихи обмена Розница 2.3 и Мобильной кассы

Это уже третий этап в настройке обмена Розницы 2.3 и Мобильной кассы. Предыдущий этап можно почитать тут.

На этом этапе осталось передавать в МК с обменом не тестовые, а реальные данные, т.е. по сути просто их извлечь из базы.

Добавил в заказ поля времени доставки (скопировал из конфигурации МК):

Вывел их в форму документа заказа покупателя:

Код для формы документа:

&НаСервере
Процедура дор_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

	//Вставляем время с и по 

	ПолеПеред = ЭтаФорма.Элементы.Магазин;
	Элемент = ЭтаФорма.Элементы.Добавить("дор_ПериодДоставкиПо", Тип("ПолеФормы"), Элементы.дор_ДатаДоставки);
	Элемент.Вид = ВидПоляФормы.ПолеВвода;
	Элемент.ПутьКДанным = "Объект.дор_ПериодДоставкиПо";
	Элемент.АвтоМаксимальнаяШирина = ложь;
	Элемент.Ширина = 4;
	Элемент.РастягиватьПоГоризонтали = ложь;
	Элемент.Заголовок = "По";
	Элемент.ФорматРедактирования = "ДФ=HH:mm";
	
КонецПроцедуры

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

&НаСервере
Процедура кмл_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
	//Осипов - тут добавить создание колонок нужных
	
	//Меняем запрос списка
	ВставляемыйТекст = 
	" ВЫРАЗИТЬ(NULL КАК Строка(20)) КАК дор_ИнтервалДоставкиСтрокой," +
	" ДокументЗаказПокупателя.дор_ПериодДоставкиС КАК дор_ПериодДоставкиС," +
	" ДокументЗаказПокупателя.дор_ПериодДоставкиПо КАК дор_ПериодДоставкиПо" +
	" , ";
	Маркер = "ВЫБРАТЬ";
	Если Найти(Список.ТекстЗапроса, ВставляемыйТекст) = 0 Тогда
		Список.ТекстЗапроса = СтрЗаменить(Список.ТекстЗапроса, Маркер, Маркер + ВставляемыйТекст);
	КонецЕсли;
	
	ПолеПеред = ЭтаФорма.Элементы.Магазин;
	Элемент = ЭтаФорма.Элементы.Вставить("дор_ИнтервалДоставкиСтрокой", Тип("ПолеФормы"), ПолеПеред.Родитель, ПолеПеред);
	Элемент.Вид = ВидПоляФормы.ПолеВвода;
	Элемент.ПутьКДанным = "Список.дор_ИнтервалДоставкиСтрокой";
	Элемент.АвтоМаксимальнаяШирина = ложь;
	Элемент.Ширина = 7;
	Элемент.РастягиватьПоГоризонтали = ложь;
	Элемент.Заголовок = "Интервал";
	
КонецПроцедуры


&НаСервереБезКонтекста
Процедура дор_СписокПриПолученииДанныхНаСервереПосле(ИмяЭлемента, Настройки, Строки)
	Для Каждого Строка ИЗ Строки Цикл
		СтрокаДанных = Строка.Значение.Данные;
		//Невидимые поля оптимизатором не тянутся из базы данных, поэтому извлекаю их через Ссылка
		//Для ускорения можно сделать поля с признаком получения данных всегда
		Если ЗначениеЗаполнено(СтрокаДанных.Ссылка.дор_ПериодДоставкиС) ИЛИ ЗначениеЗаполнено(СтрокаДанных.Ссылка.дор_ПериодДоставкиПо) Тогда
			СтрокаДанных.дор_ИнтервалДоставкиСтрокой = Формат(СтрокаДанных.Ссылка.дор_ПериодДоставкиС, "ДФ=HH:mm") + "-" + Формат(СтрокаДанных.Ссылка.дор_ПериодДоставкиПо, "ДФ=HH:mm");
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Выглядит в списке так:

Далее наполнил выгрузку в МК фактическими данными:

&Вместо("ПКО_Документ_ЗаказПокупателя_Отправка_ПриОтправкеДанных")
Процедура дор_ПКО_Документ_ЗаказПокупателя_Отправка_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
	
	//Вызываем старый обработчик
	ПродолжитьВызов(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки);
	
	
	
	//Определяем дополнительные значения для выгрузки
	Статус = ДанныеИБ.Статус;
	СтатусЗаказа = "НеСогласован"; //По умолчанию
	Если Статус = Перечисления.СтатусыЗаказовПокупателей.Согласован Тогда
		СтатусЗаказа = "Согласован";
	ИначеЕсли Статус = Перечисления.СтатусыЗаказовПокупателей.Закрыт Тогда
		СтатусЗаказа = "Закрыт";
	ИначеЕсли ЛОЖЬ Тогда
		СтатусЗаказа = "Отменен"; //Такого статуса нет
	КонецЕсли;
	//ЗаписьЖурналаРегистрации("Отладка.Обмен", ,,,"Объект" + ДанныеИБ.Ссылка + " Статус: " + СтатусЗаказа);
	
	Телефон = ДанныеИБ.КонтрагентТелефон; //"+79090001122";
	//Здесь используется не е-мэйл контрагента, а е-мэйл физлциа - особенность розницы
	АдресЭлектроннойПочты = СокрЛП(УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта(ДанныеИБ.Контрагент.ФизЛицо, Справочники.ВидыКонтактнойИнформации.EmailФизическогоЛица)); //"test@mail.ru";	
	АдресДоставки = ДанныеИБ.АдресДоставки;	
	ДатаДоставки = ДанныеИБ.ЖелаемаяДатаПродажи;
	ПериодДоставкиС = ДанныеИБ.дор_ПериодДоставкиС;
	ПериодДоставкиПо = ДанныеИБ.дор_ПериодДоставкиПо;
	дор_СтатусЗаказаНаСайте = ДанныеИБ.дор_СтатусЗаказаНаСайте;
	
	//Дополнительные реквизиты    
	
	ДопРеквизиты = Новый ТаблицаЗначений;
	ДопРеквизиты.Колонки.Добавить("Свойство");
	ДопРеквизиты.Колонки.Добавить("ЗначениеСвойства");

	СтрокаДопРеквизита = ДопРеквизиты.Добавить();
	СтрокаДопРеквизита.Свойство = Новый Структура("Наименование", "СтатусЗаказа");
	СтрокаДопРеквизита.ЗначениеСвойства = СтатусЗаказа;
	
	СтрокаДопРеквизита = ДопРеквизиты.Добавить();
	СтрокаДопРеквизита.Свойство = Новый Структура("Наименование", "ДоставкаС");
	СтрокаДопРеквизита.ЗначениеСвойства = ПериодДоставкиС;
	
	СтрокаДопРеквизита = ДопРеквизиты.Добавить();
	СтрокаДопРеквизита.Свойство = Новый Структура("Наименование", "ДоставкаПо");
	СтрокаДопРеквизита.ЗначениеСвойства = ПериодДоставкиПо;
	

	//Вставляем комментарий
	ДанныеXDTO.Вставить("Комментарий", ДанныеИБ.Комментарий 
	//+ ?(АдресДоставки = "", "", " " + АдресДоставки)
	+ ?(ЗначениеЗаполнено(дор_СтатусЗаказаНаСайте) = "", "", " " + дор_СтатусЗаказаНаСайте)
	+ ?(ЗначениеЗаполнено(ПериодДоставкиС) ИЛИ ЗначениеЗаполнено(ПериодДоставкиПо),  
	" Интервал: " + Формат(ПериодДоставкиС, "ДФ=HH:mm") + "-" + Формат(ПериодДоставкиПо, "ДФ=HH:mm")
	, "")
	);
	//ЗаписьЖурналаРегистрации("Отладка.Обмен", ,,,"Объект" + ДанныеИБ.Ссылка + " Комментарий: " + ДанныеИБ.Комментарий);

	
	//Дополнительная информация
	
	ДанныеXDTO.Вставить("ДополнительныеРеквизиты", ДопРеквизиты);
	
	ДополнительнаяИнформация = Новый Структура;
	
	ДополнительнаяИнформация.Вставить("Телефон", Телефон);
	ДополнительнаяИнформация.Вставить("АдресЭлектроннойПочты", АдресЭлектроннойПочты);
	
	ДанныеXDTO.Вставить("AdditionalInfo", дор_ЗначениеВJSON(ДополнительнаяИнформация));

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

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

&Вместо("ОбъектXDTOИзДанныхXDTO")
Функция дор_ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, Знач Источник, Знач ТипXDTO, СсылкиИзОбъекта, ПроведеноЗаполнениеСвойств, Знач Расширения)
	
	Результат = ПродолжитьВызов(КомпонентыОбмена, Источник, ТипXDTO, СсылкиИзОбъекта, ПроведеноЗаполнениеСвойств, Расширения);
	
	
	Если ТипЗнч(Источник) = Тип("СтрокаТаблицыЗначений") Тогда
		Попытка
			Если Источник.Свойство.Наименование = "ДоставкаС" ИЛИ Источник.Свойство.Наименование = "ДоставкаПо" Тогда
				ЗначениеСвойства = Источник.ЗначениеСвойства;
				
				//Вставляем дату с временем
				// https://www.w3schools.com/xml/schema_dtypes_date.asp
				ТипДаты = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "dateTime");
				ЗначениеXDTO = ФабрикаXDTO.Создать(ТипДаты, ЗначениеСвойства);

				Результат.ЗначениеСвойства.Дата = ЗначениеXDTO;
			КонецЕсли;
		Исключение
		КонецПопытки;
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

Но увы, не помогло. Время все равно обрезалось.

Тогда я попробовал поменять тип date на dateTime:

В выгрузке появилось время:

Но при загрузке выдает ошибку:

Значение: '0001-01-01T10:00:00' не соответствует простому типу: {http://www.w3.org/2001/XMLSchema}date

Поэтому интервал просто добавил в комментарий.

Адрес доставки загружается на стороне МК целиком в поле «Адрес доставки город», так что разбирать адрес на составляющие не имеет смысла:

Среда: Мобильная касса (для разработчиков) 3.14.7.0, Розница 2.3.10.61
Объем: 2 час.

fixin

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

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *