Сохранение XML заказа с сайта. УТ 11, Розница 2.3

Решение уже понадобилось нескольким клиентам, поэтому решил о нем, наконец, рассказать.

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

Поэтому я обычно в заказе в расширении делаю страницу-закладку «Сайт» с идентификатором дор_ГруппаСайт. Выглядит так:

А на ней уже программно вывожу добавленное в основную конфигурацию строковое поле неограниченной длины дор_XMLССайта (установив обязательно галочку «Многострочный режим»):

&НаСервере
Процедура дор_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
	...
	
	//Осипов 2022-08-09
	//xml
	Элемент = ЭтаФорма.Элементы.Добавить("дор_XMLССайта", Тип("ПолеФормы"), Элементы.дор_ГруппаСайт);
	Элемент.Вид = ВидПоляФормы.ПолеВвода;
	Элемент.ПутьКДанным = "Объект.дор_XMLССайта";
	Элемент.АвтоМаксимальнаяШирина = ложь;
	Элемент.РастягиватьПоГоризонтали = истина;

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

Далее нужно отловить место, где документ приходит в систему и заполнить это поле.

В Рознице это довольно просто, расширением модуля ОбменССайтом:

&Вместо("СоздатьОбновитьЗаказы")
Функция дор_СоздатьОбновитьЗаказы(ДокументыXDTO, РанееЗагруженныеЗаказы, Параметры, ОписаниеОшибки)
...
		//xml заказа сохраняем
		Попытка
			дор_XMLССайта = ОбъектXDTOВстроку(ДокументXDTO);
			дор_Сервер.ПрисвоитьБезопасно(ДокументОбъект.дор_XMLССайта, дор_XMLССайта);
		Исключение
		КонецПопытки;
...		
КонецФункции

В УТ при интеграции с битрикс это расширение модуля Б_ОбменССайтомСерверЗагрузкиДанных:


&Вместо("СоздатьОбновитьДокумент")
Процедура дор_СоздатьОбновитьДокумент(ПараметрыОбмена, НазваниеДокумента, ДокументXML, НовыйДокумент, СсылкаНаДокумент)
	Если ТипЗнч(ДокументXML) = Тип("СтрокаТаблицыЗначений") И ДокументXML.Владелец().Колонки.Найти("дор_XMLССайта") <> неопределено Тогда
		ПараметрыОбмена.Вставить("дор_XMLССайта", ДокументXML.дор_XMLССайта);
	Иначе
		ПараметрыОбмена.Вставить("дор_XMLССайта", "");
	КонецЕсли;

	
	ПродолжитьВызов(ПараметрыОбмена, НазваниеДокумента, ДокументXML, НовыйДокумент, СсылкаНаДокумент);
	

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

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

&Вместо("ЗагрузитьДокументы")
Процедура дор_ЗагрузитьДокументы(ПараметрыОбмена, ТзнДокументов, ДокументXDTO)
	
	БылоСтрок = ТзнДокументов.Количество();
	ПродолжитьВызов(ПараметрыОбмена, ТзнДокументов, ДокументXDTO);
	СталоСтрок = ТзнДокументов.Количество();
	
	Если СталоСтрок = БылоСтрок + 1 Тогда
		Если ТзнДокументов.Колонки.Найти("дор_XMLССайта") = неопределено Тогда
			ТзнДокументов.Колонки.Добавить("дор_XMLССайта");
		КонецЕсли;
		ТзнДокументов[СталоСтрок - 1].дор_XMLССайта = ОбъектXDTOВстроку(ДокументXDTO);
	КонецЕсли;
	
КонецПроцедуры

Здесь, чтобы не менять код модулей, используется несколько обходных маневров, добавляется колонка в ТзнДокументов, в нее заполняется исходный XML объекта и уже потом, при заполнении документа, подставляется из этой таблице. При этом код передается через структуру Параметры. В общем, хитрое жонглирование, но работает.

Функция преобразования объекта XDTO в строку:

Функция ОбъектXDTOВстроку(ОбъектXDTO) Экспорт
	// Создание объекта ЗаписьXML
	ЗаписьXML = Новый ЗаписьXML;
	// Указываем, что запись производится в строку, а не в файл
	ЗаписьXML.УстановитьСтроку();
	// При помощи объекта ФабрикаXDTO записываем данные пакета XDTO в запись XML
	ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
	// Получаем текст записи XML
	ТекстОбъектаXDTO = ЗаписьXML.Закрыть();	
	Возврат ТекстОбъектаXDTO;
КонецФункции

Объем: 1 час. Среда: 11.4.13.46, Розница 2.3

fixin

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

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

комментария 2

  1. rzd:

    Прикрепленные файлы есть справочник. Чтобы велосипед не изобретать

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

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

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