Таблица значений в XML файл и обратно (Управляемые формы)

1. bocharovki 7 17.03.19 08:04 Сейчас в теме
Вообщем появилась задача сохранить таблицу значений, которая является реквизитом формы в файл, а затем при необходимости вернуть назад. В интернете поиск дал либо очень старые примеры, либо примеры без сути и с кучей воды про 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Сервер(ТекстовыйДокумент.ПолучитьТекст());
		
	КонецЕсли;
	
КонецПроцедуры
Показать


Есть более оптимальные варианты?
DoctorRoot; smartcoder; konsta2006; selena; Darkoder; sandr13; Zlohobbit; Darlok; Sottoz; user717534; dehro; userMKA; icherdancev; Патриот; bbbsss; alx7304; Andy_NTG; Астиг; AndrewVik; +19 Ответить
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user-z99999 67 18.03.19 13:44 Сейчас в теме
Например,
https://start1c.blogspot.com/2013/03/blog-post_29.html
&НаСервере
Функция ПолучитьДанныеТЗ()

 ДанныеТЗ = Новый ХранилищеЗначения(ТЗ.Выгрузить());
 Возврат XMLСтрока(ДанныеТЗ);

КонецФункции// ПолучитьДанныеТЗ()

&НаСервере
Процедура ЗагрузитьДанныеТЗ(Данные)

 ДанныеТЗ = XMLЗначение(Тип("ХранилищеЗначения"), Данные).Получить();
 Если ТипЗнч(ДанныеТЗ) = Тип("ТаблицаЗначений") Тогда
  ТЗ.Загрузить(ДанныеТЗ);
 КонецЕсли;

КонецПроцедуры // ЗагрузитьДанныеТЗ()

&НаКлиенте
Процедура СохранитьТЗ(Команда)
 
 ИмяФайла = ПолучитьИмяФайла(РежимДиалогаВыбораФайла.Сохранение);
 Если ПустаяСтрока(ИмяФайла) Тогда
  Возврат;
 КонецЕсли;
 
 ФайлТЗ = Новый ТекстовыйДокумент;
 ФайлТЗ.УстановитьТекст(ПолучитьДанныеТЗ());
 ФайлТЗ.Записать(ИмяФайла);
 
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьТЗ(Команда)
 
 ИмяФайла = ПолучитьИмяФайла(РежимДиалогаВыбораФайла.Открытие);
 Если ПустаяСтрока(ИмяФайла) Тогда
  Возврат;
 КонецЕсли;
 
 ФайлТЗ = Новый ТекстовыйДокумент;
 ФайлТЗ.Прочитать(ИмяФайла);
 ЗагрузитьДанныеТЗ(ФайлТЗ.ПолучитьТекст());
 
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТЗСервер()
 
 Запрос = Новый Запрос;
 Запрос.Текст = 
  "ВЫБРАТЬ
  | ПоступлениеТоваровУслуг.Ссылка КАК Документ,
  | ПоступлениеТоваровУслуг.Контрагент,
  | ПоступлениеТоваровУслуг.Дата
  |ИЗ
  | Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг";

 ТЗ.Загрузить(Запрос.Выполнить().Выгрузить());

КонецПроцедуры // ЗаполнитьТЗСервер()

&НаКлиенте
Процедура ЗаполнитьТЗ(Команда)
 
 ЗаполнитьТЗСервер();
 
КонецПроцедуры

&НаКлиенте
Функция ПолучитьИмяФайла(Режим)
 
 ВыборФайла = Новый ДиалогВыбораФайла(Режим);
 ВыборФайла.ПолноеИмяФайла = "";
 Фильтр = "Таблица значений 1С(*.1ct)|*.1ct";
 ВыборФайла.Фильтр = Фильтр;
 ВыборФайла.МножественныйВыбор = Ложь;
 ВыборФайла.Выбрать();
 
 Возврат ВыборФайла.ПолноеИмяФайла;
 
КонецФункции
Показать
3. fixin 4253 24.05.21 13:59 Сейчас в теме
Облагородил ваш код:
#Область Сериализация

//Функциии сериализации взяты отсюда: 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);
	Возврат ТЗ;
    
КонецФункции
#КонецОбласти

Показать
konsta2006; sandr13; Sothale; user1281325; +4 Ответить
4. aairt 30.01.23 15:33 Сейчас в теме
(3) Облагородил благородное:
&НаСервере
Функция ПроизвестиЗаписьТаблицыВXMLСервер(ТЗ)
 
   Возврат ОбщегоНазначения.ЗначениеВСтрокуXML(ТЗ);
    
КонецФункции

&НаСервере
Функция ПроизвестиЧтениеТаблицыИзXMLСервер(СтрокаXML)
    
    Возврат ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаXML);
    
КонецФункции
Показать
konsta2006; SagittariusA; user712426; +3 Ответить
5. fixin 4253 30.01.23 20:26 Сейчас в теме
(4) не люблю БСП, какое же это благородное?
Darkoder; sandr13; +2 Ответить
6. markers 274 27.02.23 10:31 Сейчас в теме
(5)
Хотел написать более лучший вариант, но 1С в БСП уже написали так-же:
Функция ЗначениеВСтрокуXML(Значение) Экспорт
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку();
	СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение, НазначениеТипаXML.Явное);
	
	Возврат ЗаписьXML.Закрыть();
КонецФункции

Функция ЗначениеИзСтрокиXML(СтрокаXML) Экспорт
	
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(СтрокаXML);
	
	Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
КонецФункции
Показать
DoctorRoot; user1210458; konsta2006; sandr13; +4 Ответить
7. bad_wag 48 28.02.23 14:18 Сейчас в теме
ЗначениеВФайл или ЗначениеВСтрокуВнутр уже не модно?
sandr13; Maikl_kar_ga; +2 Ответить
8. Maikl_kar_ga 06.10.23 08:42 Сейчас в теме
(7) Полностью поддерживаю. Есть же функционал буквально в одну команду - ЗначениеВСтрокуВнутр ... еще со времен 7.7 если не ошибаюсь. Но почему то все упорно пытаются это сериализовать в XML, csv и тому подобное. Может я чего-то не знаю про эту команду? Вдруг она работает в 2 раза медленее чем сереализация в XML или еще какие-то проблемы есть?
9. bad_wag 48 06.10.23 12:16 Сейчас в теме
(8) В xml выгружают, наверно, для того, что бы потом где-то прочитать другими приложениями. Замеров не проводил, но хорошая идея, даже интересно что быстрее, особенно на больших таблицах
10. Jokemas 192 02.02.24 13:05 Сейчас в теме
(8) это всё потому, что сами 1С не рекомендуют использовать этот метод. В СП читай примечание:
"Примечание:
Используется для сохранения функциональной совместимости с 1С:Предприятием 7.7. Использовать для других целей не рекомендуется."

Кроме того, работать с XML, JSON и т.д., действительно удобнее, потому что это общепринятые форматы. Да и вообще полезно, учитывая то, что эти форматы могут быть полезны при всяких интеграциях, то привыкнув работать с ними, продолжаешь их использовать там. где раньше использовал бы архаичное "ЗначениеВСтрокуВнутр" и "ЗначениеИзСтрокиВнутр".
11. Maikl_kar_ga 02.02.24 15:32 Сейчас в теме
(10) Мне удобней использовать одну команду, без необходимости дополнительной обвязки и конвертации во что-то "общепринятое". По структуре, результат близок к формату json. Не вижу тут ничего архаичного. Тем более когда результат используется исключительно внутри твоей же бизнес-логики.
Уверяю вас, я совершенно спокойно пользуюсь любыми другими форматами (и XML и JSON) когда это имеет смысл. Вобщем пока это выглядит как дело привычки, вкуса... ну или привитых стереотипов.
12. Jokemas 192 14.02.24 10:45 Сейчас в теме
(11) Каждый художник пишет так, как хочет =)). Я лишь привёл пример из СП, что думают об этом самые главные 1Сники.
Всё зависит от решаемой задачи.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот