Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
25 ноя 2024, 16:41

Сохранить в памяти открытый xml документ

Автор Leo, 23 авг 2022, 10:37

0 Пользователей и 3 гостей просматривают эту тему.

Leo

LexaK, к сожалению у меня есть событие при нажатие на строчку таблицы и там нужен прочитанный файл и событие необходимо так как получаю данные строки. 

LexaK

Leo, что бы что-то советовать, нам полная картина нужна (иначе можно гадать до бесконечности),
что за файл вы обрабатываете, структура, данные, получаете какой-то объект через ХДТО, что за объект.
какие обработки планируете выполнять над данными файла (объекта ХДТО)
какие действия над каждой строкой таблицы (что за таблица) какие при этом нужны действия с данными файла?
и т.д. и т.п.

(то что из временного хранилища получаете - Неопределено, возможно неправильно используете,
возможно дело в версии платформы)
если помогло нажмите: Спасибо!

Leo

&НаСервере
Процедура ПриОткрытииНаСервере()

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(Путь);
ФайлXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
//Пока ЧтениеXML.Прочитать() Цикл
// Если ЧтениеXML.Имя = "СведТов" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
//
//КонецЦикла;
ЧтениеXML.Закрыть();

//Объект.Хранилище = Новый ХранилищеЗначения(ФайлXDTO);

Соответствие = Новый Соответствие;
Соответствие["ФайлXDTO"] = ФайлXDTO;
Объект.Адрес = ПоместитьВоВременноеХранилище(Соответствие, ЭтаФорма.УникальныйИдентификатор);
Сообщить(""+ФайлXDTO+" сохранен в хранилище");

Для Каждого Элемент Из ФайлXDTO.Документ.ТаблСчФакт.СведТов Цикл
ВыводТаблицы = ТаблицаТоваров.Добавить();
ВыводТаблицы.Товар = Элемент.НаимТов;
    ВыводТаблицы.Количество = Элемент.КолТов;
ВыводТаблицы.Цена = Элемент.ЦенаТов;
ВыводТаблицы.Сумма = Элемент.СтТовУчНал;
ВыводТаблицы.Id =  Элемент.НомСтр;
КонецЦикла;

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПриОткрытииНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаТоваровВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

Объект.Id = Элемент.ТекущиеДанные.Id;

СтрутураПараметров = Новый Структура;
СтрутураПараметров.Вставить("Адрес", ТаблицаМаркиПолучить(Объект.Id));
//СтрутураПараметров.Вставить("АдресФайлXDTO", Объект.Адрес);

ОткрытьФорму("ВнешняяОбработка.ВнешняяОбработка1.Форма.ФормаМаркировки", СтрутураПараметров, ЭтаФорма,);

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


&НаСервере
Функция ТаблицаМаркиПолучить(Id)

Соответствие = ПолучитьИзВременногоХранилища(Объект.Адрес);
ФайлXDTO = Соответствие["ФайлXDTO"];
Сообщить(""+ФайлXDTO+" восстановлен из хранилища");

//ФайлXDTO = Объект.Хранилище.Получить();
//Если ФайлXDTO = Неопределено Тогда   
//    Сообщить("Ошибка получения значения из хранилища");
//КонецЕсли;

Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Товар");
Таблица.Колонки.Добавить("Марки");

Для Каждого Элемент Из ФайлXDTO Цикл
Если Id = Элемент.НомСтр Тогда
ВыводТаблицы = Таблица.Добавить();
ВыводТаблицы.Товар = Элемент.НаимТов;
Для Каждого Эл Из Элемент.ДопСведТов.НомСредИдентТов.НомУпак Цикл
ВыводТаблицы = Таблица.Добавить();
            ВыводТаблицы.Марки = Эл;
КонецЦикла;
Прервать;
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
Адрес = ПоместитьВоВременноеХранилище(Таблица, ЭтаФорма.УникальныйИдентификатор);
Возврат Адрес;
КонецФункции

Я читаю файл и данные о товаре вывожу в таблицу значений на форме, так же при нажатие на строку этой таблицы нужно получать маркировки товара, таблицу с маркировками передаю на другую форму и все работает. Но мне надо правильно сохранять и передавать прочитаный файл xml.

LexaK

Leo, вот в этой команде
ФайлXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
ФайлXDTO - что за данные? какой тип?

(поместить во временное хранилище можно только сериализуемые данные)
если помогло нажмите: Спасибо!

Leo


LexaK

странно, по СП ОбъектXDTO доступен везде.

попробуйте в форме сделать реквизит с именем ФайлXDTO, Тип - Произвольный
а потом в Процедуре ТаблицаТоваровВыбор (например) просмотрите что в этом реквизите?
если помогло нажмите: Спасибо!

Leo

изображение_viber_2022-08-24_12-44-41-866.jpg
Я уже пытался пишет ошибку почему не знаю.

LexaK

Leo, тогда немного меняем алгоритм,
1.файл с ХМЛ данными это просто текстовый файл, читаем его и запоминаем именно его содержимое как текст, строку ХМЛ
просто строка неограниченной длины, ее и будем хранить в реквизите
2.из этой строки будет получать ОбъектХДТО там где он нужен,
вот примерный код вставил в ваши процедуры, пройдитесь отладчиком, вместо закоментареного

На форму добавьте реквизит СтрокаХМЛ, тип строка неограниченная
&НаСервере
Процедура ПриОткрытииНаСервере()
   
//ЧтениеXML = Новый ЧтениеXML;
//ЧтениеXML.ОткрытьФайл(Путь);
//ФайлXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
//ЧтениеXML.Закрыть();

//получаем текстовое значение файла
лкТекст = Новый ТекстовыйДокумент;
лкТекст.Прочитать(Путь);
СтрокаХМЛ = лкТекст.ПолучитьТекст();//СтрокаХМЛ - реквизит формы
....

&НаСервере
Функция ТаблицаМаркиПолучить(Id)
   
//Соответствие = ПолучитьИзВременногоХранилища(Объект.Адрес);
//ФайлXDTO = Соответствие["ФайлXDTO"];
//Сообщить(""+ФайлXDTO+" восстановлен из хранилища");

//так получаем ОбъектХДТО из СтрокаХМЛ
    ЧтениеXMLДанных = Новый ЧтениеXML;
    ЧтениеXMLДанных.УстановитьСтроку(СтрокаХМЛ); //из реквизита формы
    ФайлXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXMLДанных);
    ЧтениеXMLДанных.Закрыть();
...


если СтрокаХМЛ очень большая, вот ее как раз получится поместить во временноехранилище, и доставать ее только на сервере
если помогло нажмите: Спасибо!

Leo

изображение_viber_2022-08-24_14-34-44-468.jpg

Мне кажется я нашел причину. Возможно в документе, неправильно свойства заполнено и поэтому я в него пытаюсь записать пустую строку и выходит, а после серилизовать объектxdto, но он все равно ругается на это свойство, думал в принципе его удалить, но не знаю как.

LexaK

Leo, как то совсем не те команды, что я предложил... (у меня, на тестовом примере все сработало)

да, позже я заменил
СериализаторXDTO.ПрочитатьXML
на
ФабрикаXDTO.ПрочитатьXML
(как у вас было)
если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск