Формирование исходника чтения 1с по XML файлу Ключевые слова: XML, генерация кода, 1с
Часто бывает надо прочитать файл XML, но это требует большого количества кода вида
Если XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="СчетаПК" тогда
Тут прилагаю обработку формирующую на основе XML файла следующий код,
дальнейшая обработка напильником на вашей совести
сама обработка
&НаКлиенте
Процедура Команда1(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл с данными";
Диалог.ПолноеИмяФайла = "";
Если Диалог.Выбрать() Тогда
Ткт=новый ТекстовыйДокумент;
Ткт.Прочитать(Диалог.ПолноеИмяФайла);
ФормированиеТекста= ЗагрузкаXML(Ткт.ПолучитьТекст())
КонецЕсли
КонецПроцедуры
&НаСервере
Функция ЗагрузкаXML(Текст);
XML= новый ЧтениеXML();
XML.УстановитьСтроку(Текст);
Дерево= новый ДеревоЗначений;
Дерево.Колонки.Добавить("Имя");
Ветвь=Дерево;
Пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
поискСтроки=Ветвь.Строки.Найти(XML.Имя);
Если поискСтроки=неопределено тогда
ст=Ветвь.Строки.Добавить();
ст.Имя=XML.Имя;
Ветвь=ст;
иначе
Ветвь=поискСтроки;
КонецЕсли;
иначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Ветвь=Ветвь.Родитель;
иначеЕсли XML.ТипУзла = ТипУзлаXML.Текст Тогда
Если Ветвь.Строки.Найти("#text")=неопределено тогда
ст=Ветвь.Строки.Добавить();
ст.Имя="#text";
КонецЕсли;
КонецЕсли;
КонецЦикла;
возврат ОбходДерева(Дерево, "");
КонецФункции
&НаСервере
Функция ОбходДерева(ветвь, таб)
Рез=Таб+"пока XML.Прочитать() цикл"+Символы.ПС;
ПервыйШаг=" Если";
для каждого ст из ветвь.Строки цикл
Если ст.Имя="#text" тогда
рез= рез + Таб+ПервыйШаг+" XML.ТипУзла = ТипУзлаXML.Текст тогда " +Символы.ПС;
рез= рез + Таб+" // "+ветвь.Имя +"=XML.Значение;" +Символы.ПС;
иначе
рез= рез + Таб+ПервыйШаг+" XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="""+ст.Имя+""" тогда " +Символы.ПС;
рез= рез + ОбходДерева(ст, Таб+ " ")+Символы.ПС;
КонецЕсли;
ПервыйШаг=" ИначеЕсли";
КонецЦикла;
Рез=рез +
Таб+ПервыйШаг+" XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда" +Символы.ПС+
// Таб+" XML.Прочитать();" +Символы.ПС+
Таб+" Прервать;" +Символы.ПС+
Таб+" Иначе " +Символы.ПС+
Таб+" ВызватьИсключение ""Не верно прочитан файл""" +Символы.ПС+
Таб+" КонецЕсли;" +Символы.ПС+
Таб+"КонецЦикла;" +Символы.ПС;
возврат рез;
КонецФункции
Мог бы доработать, но меня результат вполне устроил, а работы пока дофига.
пример получающегося кода
пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="СчетаПК" тогда
пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="ЗачислениеЗарплаты" тогда
пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="Сотрудник" тогда
пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="Фамилия" тогда
пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.Текст тогда
// Фамилия=XML.Значение;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
Прервать;
Иначе
ВызватьИсключение "Не верно прочитан файл"
КонецЕсли;
КонецЦикла;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="Имя" тогда
пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.Текст тогда
// Имя=XML.Значение;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
Прервать;
Иначе
ВызватьИсключение "Не верно прочитан файл"
КонецЕсли;
КонецЦикла;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="Отчество" тогда
пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.Текст тогда
// Отчество=XML.Значение;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
Прервать;
Иначе
ВызватьИсключение "Не верно прочитан файл"
КонецЕсли;
КонецЦикла;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="ОтделениеБанка" тогда
пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.Текст тогда
// ОтделениеБанка=XML.Значение;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
Прервать;
Иначе
ВызватьИсключение "Не верно прочитан файл"
КонецЕсли;
КонецЦикла;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="ФилиалОтделенияБанка" тогда
пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.Текст тогда
// ФилиалОтделенияБанка=XML.Значение;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
Прервать;
Иначе
ВызватьИсключение "Не верно прочитан файл"
КонецЕсли;
КонецЦикла;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="ЛицевойСчет" тогда
пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.Текст тогда
// ЛицевойСчет=XML.Значение;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
Прервать;
Иначе
ВызватьИсключение "Не верно прочитан файл"
КонецЕсли;
КонецЦикла;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="Сумма" тогда
пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.Текст тогда
// Сумма=XML.Значение;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
Прервать;
Иначе
ВызватьИсключение "Не верно прочитан файл"
КонецЕсли;
КонецЦикла;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="КодВалюты" тогда
пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.Текст тогда
// КодВалюты=XML.Значение;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
Прервать;
Иначе
ВызватьИсключение "Не верно прочитан файл"
КонецЕсли;
КонецЦикла;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
Прервать;
Иначе
ВызватьИсключение "Не верно прочитан файл"
КонецЕсли;
КонецЦикла;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
Прервать;
Иначе
ВызватьИсключение "Не верно прочитан файл"
КонецЕсли;
КонецЦикла;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="КонтрольныеСуммы" тогда
пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="КоличествоЗаписей" тогда
пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.Текст тогда
// КоличествоЗаписей=XML.Значение;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
Прервать;
Иначе
ВызватьИсключение "Не верно прочитан файл"
КонецЕсли;
КонецЦикла;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.НачалоЭлемента и XML.Имя="СуммаИтого" тогда
пока XML.Прочитать() цикл
Если XML.ТипУзла = ТипУзлаXML.Текст тогда
// СуммаИтого=XML.Значение;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
Прервать;
Иначе
ВызватьИсключение "Не верно прочитан файл"
КонецЕсли;
КонецЦикла;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
Прервать;
Иначе
ВызватьИсключение "Не верно прочитан файл"
КонецЕсли;
КонецЦикла;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
Прервать;
Иначе
ВызватьИсключение "Не верно прочитан файл"
КонецЕсли;
КонецЦикла;
ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента тогда
Прервать;
Иначе
ВызватьИсключение "Не верно прочитан файл"
КонецЕсли;
КонецЦикла;
|