Таблица значений в XML файл и обратно (Управляемые формы)
Вообщем появилась задача сохранить таблицу значений, которая является реквизитом формы в файл, а затем при необходимости вернуть назад. В интернете поиск дал либо очень старые примеры, либо примеры без сути и с кучей воды про XDTO, либо вообще уже просят по 1 стартмани за код из нескольких строк (https://infostart.ru/public/1000485/) .
Получилось вот так и может кому то пригодиться:
Есть более оптимальные варианты?
Получилось вот так и может кому то пригодиться:
&НаСервере
Функция ПроизвестиЗаписьТаблицыВXMLСервер()
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(ТаблицаСооответсвияУслугНоменклатуре.Выгрузить());
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
Возврат ЗаписьXML.Закрыть();
КонецФункции
&НаСервере
Функция ПроизвестиЧтениеТаблицыИзXMLСервер(СтрокаXML)
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаXML);
ТипОбъектаXDTO = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/core","ValueTable");
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипОбъектаXDTO);
ОбъектXDTO.Проверить();
ЧтениеXML.Закрыть();
ТаблицаСооответсвияУслугНоменклатуре.Загрузить(СериализаторXDTO.ПрочитатьXDTO(ОбъектXDTO));
КонецФункции
&НаКлиенте
Процедура СохранитьНастройкиТаблицыСоответствия(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.МножественныйВыбор = Ложь;
Диалог.Фильтр = "Текст(*.XML)|*.XML";
Если Диалог.Выбрать() Тогда
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.ДобавитьСтроку(ПроизвестиЗаписьТаблицыВXMLСервер());
ТекстовыйДокумент.Записать(Диалог.ПолноеИмяФайла);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьНастройкиТаблицыСоответствия(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.МножественныйВыбор = Ложь;
Диалог.ПроверятьСуществованиеФайла = Истина;
Диалог.Фильтр = "Текст(*.XML)|*.XML";
Если Диалог.Выбрать() Тогда
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(Диалог.ПолноеИмяФайла);
ПроизвестиЧтениеТаблицыИзXMLСервер(ТекстовыйДокумент.ПолучитьТекст());
КонецЕсли;
КонецПроцедуры
ПоказатьЕсть более оптимальные варианты?
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Например,
https://start1c.blogspot.com/2013/03/blog-post_29.html
&НаСервере
Функция ПолучитьДанныеТЗ()
ДанныеТЗ = Новый ХранилищеЗначения(ТЗ.Выгрузить());
Возврат XMLСтрока(ДанныеТЗ);
КонецФункции// ПолучитьДанныеТЗ()
&НаСервере
Процедура ЗагрузитьДанныеТЗ(Данные)
ДанныеТЗ = XMLЗначение(Тип("ХранилищеЗначения"), Данные).Получить();
Если ТипЗнч(ДанныеТЗ) = Тип("ТаблицаЗначений") Тогда
ТЗ.Загрузить(ДанныеТЗ);
КонецЕсли;
КонецПроцедуры // ЗагрузитьДанныеТЗ()
&НаКлиенте
Процедура СохранитьТЗ(Команда)
ИмяФайла = ПолучитьИмяФайла(РежимДиалогаВыбораФайла.Сохранение);
Если ПустаяСтрока(ИмяФайла) Тогда
Возврат;
КонецЕсли;
ФайлТЗ = Новый ТекстовыйДокумент;
ФайлТЗ.УстановитьТекст(ПолучитьДанныеТЗ());
ФайлТЗ.Записать(ИмяФайла);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьТЗ(Команда)
ИмяФайла = ПолучитьИмяФайла(РежимДиалогаВыбораФайла.Открытие);
Если ПустаяСтрока(ИмяФайла) Тогда
Возврат;
КонецЕсли;
ФайлТЗ = Новый ТекстовыйДокумент;
ФайлТЗ.Прочитать(ИмяФайла);
ЗагрузитьДанныеТЗ(ФайлТЗ.ПолучитьТекст());
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьТЗСервер()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеТоваровУслуг.Ссылка КАК Документ,
| ПоступлениеТоваровУслуг.Контрагент,
| ПоступлениеТоваровУслуг.Дата
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг";
ТЗ.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры // ЗаполнитьТЗСервер()
&НаКлиенте
Процедура ЗаполнитьТЗ(Команда)
ЗаполнитьТЗСервер();
КонецПроцедуры
&НаКлиенте
Функция ПолучитьИмяФайла(Режим)
ВыборФайла = Новый ДиалогВыбораФайла(Режим);
ВыборФайла.ПолноеИмяФайла = "";
Фильтр = "Таблица значений 1С(*.1ct)|*.1ct";
ВыборФайла.Фильтр = Фильтр;
ВыборФайла.МножественныйВыбор = Ложь;
ВыборФайла.Выбрать();
Возврат ВыборФайла.ПолноеИмяФайла;
КонецФункции
Показать
Облагородил ваш код:
#Область Сериализация
//Функциии сериализации взяты отсюда: https://forum.infostart.ru/forum9/topic213044/
&НаСервере
Функция ПроизвестиЗаписьТаблицыВXMLСервер(ТЗ)
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(ТЗ.Выгрузить());
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
Возврат ЗаписьXML.Закрыть();
КонецФункции
&НаСервере
Функция ПроизвестиЧтениеТаблицыИзXMLСервер(СтрокаXML)
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаXML);
ТипОбъектаXDTO = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/core","ValueTable");
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипОбъектаXDTO);
ОбъектXDTO.Проверить();
ЧтениеXML.Закрыть();
ТЗ = СериализаторXDTO.ПрочитатьXDTO(ОбъектXDTO);
Возврат ТЗ;
КонецФункции
#КонецОбласти
Показать
(3) Облагородил благородное:
&НаСервере
Функция ПроизвестиЗаписьТаблицыВXMLСервер(ТЗ)
Возврат ОбщегоНазначения.ЗначениеВСтрокуXML(ТЗ);
КонецФункции
&НаСервере
Функция ПроизвестиЧтениеТаблицыИзXMLСервер(СтрокаXML)
Возврат ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаXML);
КонецФункции
Показать
(5)
Хотел написать более лучший вариант, но 1С в БСП уже написали так-же:
Хотел написать более лучший вариант, но 1С в БСП уже написали так-же:
Функция ЗначениеВСтрокуXML(Значение) Экспорт
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение, НазначениеТипаXML.Явное);
Возврат ЗаписьXML.Закрыть();
КонецФункции
Функция ЗначениеИзСтрокиXML(СтрокаXML) Экспорт
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаXML);
Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
КонецФункции
Показать
(7) Полностью поддерживаю. Есть же функционал буквально в одну команду - ЗначениеВСтрокуВнутр ... еще со времен 7.7 если не ошибаюсь. Но почему то все упорно пытаются это сериализовать в XML, csv и тому подобное. Может я чего-то не знаю про эту команду? Вдруг она работает в 2 раза медленее чем сереализация в XML или еще какие-то проблемы есть?
(8) это всё потому, что сами 1С не рекомендуют использовать этот метод. В СП читай примечание:
"Примечание:
Используется для сохранения функциональной совместимости с 1С:Предприятием 7.7. Использовать для других целей не рекомендуется."
Кроме того, работать с XML, JSON и т.д., действительно удобнее, потому что это общепринятые форматы. Да и вообще полезно, учитывая то, что эти форматы могут быть полезны при всяких интеграциях, то привыкнув работать с ними, продолжаешь их использовать там. где раньше использовал бы архаичное "ЗначениеВСтрокуВнутр" и "ЗначениеИзСтрокиВнутр".
"Примечание:
Используется для сохранения функциональной совместимости с 1С:Предприятием 7.7. Использовать для других целей не рекомендуется."
Кроме того, работать с XML, JSON и т.д., действительно удобнее, потому что это общепринятые форматы. Да и вообще полезно, учитывая то, что эти форматы могут быть полезны при всяких интеграциях, то привыкнув работать с ними, продолжаешь их использовать там. где раньше использовал бы архаичное "ЗначениеВСтрокуВнутр" и "ЗначениеИзСтрокиВнутр".
(10) Мне удобней использовать одну команду, без необходимости дополнительной обвязки и конвертации во что-то "общепринятое". По структуре, результат близок к формату json. Не вижу тут ничего архаичного. Тем более когда результат используется исключительно внутри твоей же бизнес-логики.
Уверяю вас, я совершенно спокойно пользуюсь любыми другими форматами (и XML и JSON) когда это имеет смысл. Вобщем пока это выглядит как дело привычки, вкуса... ну или привитых стереотипов.
Уверяю вас, я совершенно спокойно пользуюсь любыми другими форматами (и XML и JSON) когда это имеет смысл. Вобщем пока это выглядит как дело привычки, вкуса... ну или привитых стереотипов.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот