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

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

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

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

Leo

Доброго времени суток, подскажите пожалуйста, я открываю документ и сохраняю его в глобальной переменой, но он не виден в другой процедуре того же модуля.
Перем гФайлXDTO;
&НаСервере
Процедура ПриОткрытииНаСервере()
    ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(Путь);

гФайлXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
КонецПроцедуры

&НаСервере
Процедура ТаблицаТоваровВыборНаСервере(Товар)

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

Сообщить(Текст);

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


LexaK

Leo, при переходе через НаКлиенте, серверные переменные сбрасываются,
1.можно поместить во временноехранилище
2.можно хранить в каком реквизите
3.можно прямо перед обработкой вызвать, формирующую процедуру, примерно так

&НаСервере
Процедура ТаблицаТоваровВыборНаСервере(Товар)
   
    ПриОткрытииНаСервере(); //формируем гФайлXDTO
    Текст = "";
    Для Каждого Элемент Из гФайлXDTO.Документ.ТаблСчФакт.СведТов Цикл
        Если Товар = Элемент.НаимТов Тогда
...
4.да и еще куча методов
если помогло нажмите: Спасибо!

Leo

Я пытался хранить в реквизите, но не могу понять какой тип у объектаxdto?

LexaK

Leo, используйте другие способы
ХранилищеЗначения, или
ПоместитьВоВременноеХранилище,
если помогло нажмите: Спасибо!

Leo

LexaK, в ошибке пишет: {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(49,13)}: Переменная не определена (Хранилище)
    ФайлXDTO = <<?>>Хранилище.Получить(); (Проверка: Сервер)

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

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

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

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


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


LexaK

Leo, дааа,
сделайте Хранилище, реквизитом формы, тип Произвольный
если помогло нажмите: Спасибо!

Leo

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

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

Но мне сказали, что есть другой способ и сделать иначе, пытался использовать хранилищеЗначений использовал реквизит хранилище произвольный и поменял конфигурацию на версию 8.2.13, чтобы избавится от ошибки при передачи файла в хранилище, но при распаковки я получаю неопределенно. Так же пытался использовать сохранения файла в реквизит с типом произвольный, но выдает ошибку. Подскажите пожалуйста еще способы!

LexaK

Leo, почему используете версию платформы 8,2,13 ???
а почему не 8.0? (ну так, риторика)
скачайте и перейдите на более новую версию более 8,3,20

и вопрос по задаче, а зачем вам надо запоминать содержимое файла в каких-то переменных/реквизитах?
надо просто открыть и обработать его - вот и все!
если помогло нажмите: Спасибо!

Leo

LexaK, я использовал версию 8.2.13, так как на одном форуме нашел, что может решить проблему при передачи файла в хранилищезначения и это и вправду помогло, но при получении из хранилища у меня значение неопределенно.
Цитироватьи вопрос по задаче, а зачем вам надо запоминать содержимое файла в каких-то переменных/реквизитах?
надо просто открыть и обработать его - вот и все!
Да я написал функцию которая открывает файл и обрабатывает его и я вызывал функцию в разных процедурах, мне сказали что это плохой код так как каждый раз перечитываю файл, куда правильнее прочитать один раз и сохранить его, потому что файл может быть на миллионы строк кода и так каждый раз его перечитывать уничтожит оптимизацию.   

LexaK

Leo,
Цитироватьвызывал функцию в разных процедурах
так сведите все процедуры в одну, сделайте примерно такую схему
//НаСервере
Процедура ОбщаяОбработка(...)
    ДанныеФайла = ПолучитьДанныеФайла(...);
    ОбработкаДанных_1(ДанныеФайла);
    ОбработкаДанных_2(ДанныеФайла);
    ОбработкаДанных_3(ДанныеФайла);
...


если помогло нажмите: Спасибо!

Теги:

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

Рейтинг@Mail.ru

Поиск