Сохранение 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
Прикрепленные файлы есть справочник. Чтобы велосипед не изобретать
да, тоже вариант, меньше возни с интерфейсом, но больше кода по прикреплению файла.
потому что при загрузке объект заказа может быть еще не записан, т.е. ссылки нет.