Прочитать текстовый файл из временного хранилища
Здравствуйте. На Клиенте с помощью предназначенного для этого метода происходит интерактивный выбор файла XML пользователем (по сути это текстовый файл), файл записывается во временное хранилище.
Затем на сервере значение из временного хранилища необходимо получить в виде строки-содержимого.
В данный момент использую следующий код:
1) Является ли этот код оптимальным и правильным для поставленной задачи на современных платформах?
2) Есть ли способ решить подобную задачу на платформах до 8.3.9, в которых объект ЧтениеДанных отсутствовал?
Затем на сервере значение из временного хранилища необходимо получить в виде строки-содержимого.
В данный момент использую следующий код:
ДвоичныеДанныеКонтейнера = ПолучитьИзВременногоХранилища(ПараметрыАдресФайла);
Если ДвоичныеДанныеКонтейнера = Неопределено Тогда
ТекстОшибки = "Не удалось прочитать файл с контейнером.";
Иначе
Попытка
ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанныеКонтейнера);
ЧтениеДанных.КодировкаТекста = КодировкаТекста.UTF8;
ЧтениеТекста = Новый ЧтениеТекста(ЧтениеДанных.ИсходныйПоток(), КодировкаТекста.UTF8);
СтрокаXML = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
ЧтениеДанных.Закрыть();
Исключение
ТекстОшибки = "Не удалось получить строку XML из файла.";
КонецПопытки;
КонецЕсли;
Показать1) Является ли этот код оптимальным и правильным для поставленной задачи на современных платформах?
2) Есть ли способ решить подобную задачу на платформах до 8.3.9, в которых объект ЧтениеДанных отсутствовал?
По теме из базы знаний
- Файловые базы *.1CD. Физическая структура. Восстановление.
- Синхронизация хранилища 1С и git-репозитория с применением OneScript и Gitsync. Методика и пошаговая инструкция для создания скрипта и его регулярного запуска
- Поиск строки XML-файла, содержащей значение, не соответствующее типу свойства XDTO пакета
- Работа с файлами (обычная и управляемая форма)
- Отдай корень! Библиотека OneScript для получения информации о захваченных объектах в хранилище
Найденные решения
(1)
1. Правильным - да, оптимальным - нет, т.к. происходит чтение всего файла XML в ОЗУ.
2. Как-то так:
1. Правильным - да, оптимальным - нет, т.к. происходит чтение всего файла XML в ОЗУ.
2. Как-то так:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ДвоичныеДанныеКонтейнера = ПолучитьИзВременногоХранилища(ПараметрыАдресФайла);
ДвоичныеДанныеКонтейнера.Записать(ИмяВременногоФайла);
Поток = Новый ЧтениеXML;
Поток.Открыть(ИмяФайла);
Пока Поток.Прочитать() Цикл
Пока Поток.ТипУзла = ТипУзлаXML.НачалоЭлемента И Поток.Имя = "НужноеИмяТэгаОбъекта" Цикл
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Поток);
..............
КонецЦикла;
КонецЦикла;
Поток.Закрыть();
УдалитьФайлы(ИмяВременногоФайла);
Показать
(14) через ДиалогВыбораФайла можно получить имя файла и прочитать
Но да, на веб клиенте не доступно, но и в (1) про него не упоминалось.
Тогда для веб клиента можно на сервере читать через ЧтениеТекста вместо ЧтениеДанных.
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
Фильтр = "Файл xml|*.xml";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.Заголовок = "Выберите файл";
Если ДиалогОткрытияФайла.Выбрать() Тогда
ИмяФайла = ДиалогОткрытияФайла.ПолноеИмяФайла;
Чтение = Новый ЧтениеТекста(ИмяФайла);
Текст = Чтение.Прочитать();
НужнаяПроцедураНаСервере(Текст);
Иначе
Предупреждение("Файл не выбран!");
КонецЕсли;
ПоказатьНо да, на веб клиенте не доступно, но и в (1) про него не упоминалось.
Тогда для веб клиента можно на сервере читать через ЧтениеТекста вместо ЧтениеДанных.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
1. Правильным - да, оптимальным - нет, т.к. происходит чтение всего файла XML в ОЗУ.
2. Как-то так:
1. Правильным - да, оптимальным - нет, т.к. происходит чтение всего файла XML в ОЗУ.
2. Как-то так:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ДвоичныеДанныеКонтейнера = ПолучитьИзВременногоХранилища(ПараметрыАдресФайла);
ДвоичныеДанныеКонтейнера.Записать(ИмяВременногоФайла);
Поток = Новый ЧтениеXML;
Поток.Открыть(ИмяФайла);
Пока Поток.Прочитать() Цикл
Пока Поток.ТипУзла = ТипУзлаXML.НачалоЭлемента И Поток.Имя = "НужноеИмяТэгаОбъекта" Цикл
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Поток);
..............
КонецЦикла;
КонецЦикла;
Поток.Закрыть();
УдалитьФайлы(ИмяВременногоФайла);
Показать
(2) Этот вариант тоже читает файл в память - метод получения двочиных данных.
Вообще, если делать быстро, то надо вообще вот так делать (при файлах не очень большого размера):
Ну все слова в синтаксис-помощнике подглядеть труда не составит...
Вообще, если делать быстро, то надо вообще вот так делать (при файлах не очень большого размера):
Код |
---|
&НаКлаенте
Процедура ОбработатьКлиент(ИмяФайла)
ОбработатьСервер( Новый ДвоичныеДанные( ИмяФайла ) );
КонецПроцедуры
Процедура ОбработатьСервер( ДД )
Поток = Новый ПотокВПамяти ( ДД );
ЧтениеХМЛ = Новый ЧтениеХМЛ( Поток );
// какое-то шаманство
ЧтениеХМЛ.Закрыть();
КонецПроцедуры
Показать полностью |
(5) А это:
Это не чтение файла целиком в ОЗУ? Двоичные данные контейнера что содержат?
Фактически, кеш - это память, которая через 20 минут выгрузится на диск. При варианте с двоичными данными, передаваемыми на сервер, память экономится только на клиенте.
ДвоичныеДанныеКонтейнера = ПолучитьИзВременногоХранилища(ПараметрыАдресФайла);
ДвоичныеДанныеКонтейнера.Записать(ИмяВременногоФайла);
Это не чтение файла целиком в ОЗУ? Двоичные данные контейнера что содержат?
При получении на сервере значения из временного хранилища следует учитывать то, что оно получается по ссылке. В действительности, ссылка эта указывает на значение, которое хранится в кеше. В течение 20 минут, с момента помещения в хранилище или же с момента последнего обращения, значение сохранится в кеше, а затем записывается на диск и из кеша удаляется. При следующем обращении значение загружается с диска и снова помещается в кеш.
Фактически, кеш - это память, которая через 20 минут выгрузится на диск. При варианте с двоичными данными, передаваемыми на сервер, память экономится только на клиенте.
(10)
Если файло большое, то совсем правильно читать его и скармливать фоновым заданиям прочитанное (по сотне единиц, например).
ОбъектXDTO прямо на клиенте
В принципе даже работает, но не все. Объект XDTO - это тоже все в памяти, поэтому лучше последовательно читать, особенно если файл большой. По крайней мере результат вебсервиса - объект тот самый - не ездит между сервером и клиентом, ну и веб-сервисы на клиенте не работают.
Если файло большое, то совсем правильно читать его и скармливать фоновым заданиям прочитанное (по сотне единиц, например).
(1)
(1)
Можно на клиенте читать не двоичные данные, а сразу текст (ЧтениеТекста) и его передавать.
На Клиенте с помощью предназначенного для этого метода происходит интерактивный выбор файла XML пользователем (по сути это текстовый файл), файл записывается во временное хранилище.
(1)
Есть ли способ решить подобную задачу на платформах до 8.3.9, в которых объект ЧтениеДанных отсутствовал?
Можно на клиенте читать не двоичные данные, а сразу текст (ЧтениеТекста) и его передавать.
(6) Я понял идею, но не понял реализацию, уточните пожалуйста. ЧтениеТекста получает файл по пути в системе, а не выбирает его интерактивно, кроме того, оно недоступно на веб-клиенте. Методы для работы с файловой системой (такие как НачатьПомещениеФайлаНаСервер) все и во всех платформах помещают файл в виде двоичных данных во временное хранилище.
(14) через ДиалогВыбораФайла можно получить имя файла и прочитать
Но да, на веб клиенте не доступно, но и в (1) про него не упоминалось.
Тогда для веб клиента можно на сервере читать через ЧтениеТекста вместо ЧтениеДанных.
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
Фильтр = "Файл xml|*.xml";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.Заголовок = "Выберите файл";
Если ДиалогОткрытияФайла.Выбрать() Тогда
ИмяФайла = ДиалогОткрытияФайла.ПолноеИмяФайла;
Чтение = Новый ЧтениеТекста(ИмяФайла);
Текст = Чтение.Прочитать();
НужнаяПроцедураНаСервере(Текст);
Иначе
Предупреждение("Файл не выбран!");
КонецЕсли;
ПоказатьНо да, на веб клиенте не доступно, но и в (1) про него не упоминалось.
Тогда для веб клиента можно на сервере читать через ЧтениеТекста вместо ЧтениеДанных.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот