Сохранение 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:

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

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

Добавить комментарий для rzd Отменить ответ

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