Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по xml
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
mxdroni
необходимо получить в xml
<vtd_number xsi:nil="false" />
подскажите как это сделать стандартами 1С-ки
Vofka
а подробней нельзя?
ЗЫ. Я ничё не понял в вопросе.
ЗЫ2. необходимо зарегистрироваться для просмотра ссылки
mxdroni
При выгрузке из 1С в файл xml необходимо для vtd_number xsi:nil установить значение false

Вот пример xml: необходимо зарегистрироваться для просмотра ссылки
mxdroni
не ужели не кто не знает !?
Batchir
Чтение и запись текстовых файлов XML средствами 1С:Предприятие 7.7
URL: необходимо зарегистрироваться для просмотра ссылки
Чтение файла



//Ограничения на входящие файлы XML:  
//1) В первой строке обязателен заголовок XML вида <?xml version="1.0" encoding="windows-1251"?> .
//2) Каждый тег должен быть записан в отдельной строке. Возможны отступы от начала строки и пустые строки.
//3) Значения атрибутов - строго в двойных кавычках.
//4) Не поддерживаются текстовые значения (любые значения можно передавать только через атрибуты).  
//5) Комментарии и "подобные им" элементы XML не поддерживаются.


перем xml_fso;
перем xml_file;
перем xml_ИмяТега;
перем xml_СписокАтрибутов;
перем xml_сз;  

///////////////////////////////////////////////////////////////////////
//Открывает XML-файл в режиме "только чтение"  
Процедура xml_ОткрытьФайл(прм_ИмяФайла)  
//прм_ИмяФайла - имя файла XML (укажите полный путь и расширение .XML).


  xml_fso=СоздатьОбъект("Scripting.FileSystemObject");

  xml_file=xml_fso.OpenTextFile(прм_ИмяФайла, 1, 0, 0); //Открываем файл в режиме "только чтение"  
  стр=xml_file.ReadLine(); //Читаем заголовок XML вида <?xml version="1.0" encoding="windows-1251"?>.
   
  Если Найти(стр,"<?xml")=0 Тогда
  Сообщить("Неправильный файл XML "+прм_ИмяФайла,"!"); а=10/0;  
  КонецЕсли;
  Если Найти(стр,"windows-1251")=0 Тогда
  Сообщить("Требуется кодировка windows-1251 файла XML "+прм_ИмяФайла,"!"); а=10/0;
  КонецЕсли;
  xml_СписокАтрибутов=СоздатьОбъект("СписокЗначений");
  xml_сз=СоздатьОбъект("СписокЗначений");  
КонецПроцедуры // xml_ОткрытьФайл

///////////////////////////////////////////////////////////////////////  

//Считывает следующий тег XML.
//Возвращает 1, если тег прочитан и 0 - если был достигнут конец файла.  

//Заполняет переменную xml_ИмяТега именем считанного тега в формате "<ИмяТега>".  

Функция xml_Прочитать(прм_ОжидаемыеТеги="")
//Если вы используете параметр прм_ОжидаемыеТеги, то заполните его списком тегов
//через запятую, которые могут быть считаны в данный момент (это позволяет проверять
//структуру файла XML и сделать более ясным считывающий код).

  xml_СписокАтрибутов.УдалитьВсе();
  стр="";
  Пока стр="" Цикл
  Если xml_file.AtEndOfStream=1 Тогда
  Возврат 0; //тег не был прочитан, т.к. достигнут конец файла
  КонецЕсли;
  стр=СокрЛП(xml_file.ReadLine());
  КонецЦикла; //цикл, чтобы пропустить пустые строки

  Если Найти(стр,"=")=0 Тогда //Случай, когда нет атрибутов
  xml_ИмяТега=СокрЛП(стр);
  Иначе
  //Разбиваем тег на структуру, удобную для ИзСтрокиСРазделителями()  

  стр=СтрЗаменить(стр,"""",""",""");
  стр=""""+стр+"""";

  сз=xml_сз;
  сз.УдалитьВсе();
  сз.ИзСтрокиСРазделителями(стр);  
   
  //В первом элементе списка у нас и имя тега, и имя первого атрибута. Разделим их.
  зн=сз.ПолучитьЗначение(1);
  поз=Найти(зн , " ");
  xml_ИмяТега =СокрЛП(Лев(зн, поз)); //Выделим имя тега  

 
  xml_ИмяТега =xml_ИмяТега+">";
   
  //Выделим и обновим имя первого атрибута
 
  зн =СокрЛП(Сред(зн, поз));
  сз.УстановитьЗначение(1,зн);

  //Удаляем завершающий элемент списка /> или >.

  сз.УдалитьЗначение(сз.РазмерСписка());  

  //Переводим наш список значений в более удобный формат  
  i=1; //позиция в списке сз
  рс=сз.РазмерСписка();
  Пока i<=рс Цикл  
  имя=сз.ПолучитьЗначение(i);
  имя=СокрЛП(СтрЗаменить(имя,"=",""));  
  зн=сз.ПолучитьЗначение(i+1);  
  //Заменяем спецсимволы XML
  зн=СтрЗаменить(зн,"&"+"quot"+";","""");  
  зн=СтрЗаменить(зн,"&"+"apos"+";","'");
  зн=СтрЗаменить(зн,"&"+"lt"+";","<");
  зн=СтрЗаменить(зн,"&"+"gt"+";",">");
  зн=СтрЗаменить(зн,"&"+"amp"+";","&");

  xml_СписокАтрибутов.ДобавитьЗначение(зн,имя);
   
  i=i+2;
  КонецЦикла;
  КонецЕсли;

  Если ПустаяСтрока(прм_ОжидаемыеТеги)=0 Тогда  

//Проверяем наличие имени тега в списке ожидаемых тегов (если надо контролировать структуру)
   
  Если Найти(прм_ОжидаемыеТеги,xml_ИмяТега)=0 Тогда
  Сообщить("Неожиданный тег "+xml_ИмяТега+" в строке "+xml_file.line); a=10/0;
  КонецЕсли;
  КонецЕсли;

  Возврат 1; //успешное чтение тега
КонецФункции // xml_Прочитать
   
///////////////////////////////////////////////////////////////////////  
//Получает значение атрибута считанного тега по имени атрибута.  
//Если надо получить атрибут по его номеру, читайте список значений xml_СписокАтрибутов  
   
Функция xml_ПолучитьАтрибут(прм_ИмяАтрибута)  
  Возврат xml_СписокАтрибутов.Получить(прм_ИмяАтрибута);  
КонецФункции // xml_ПолучитьАтрибут
   
///////////////////////////////////////////////////////////////////////
//Закрывает открытый файл XML. По завершении работы с файлом его необходимо закрыть.
Функция xml_Закрыть()
  xml_file.Close();
КонецФункции // xml_Закрыть
   
   
   
//*******************************************  
//Тестовая процедура, которая считывает XML файл в справочник Товаров.  
Процедура Выполнить()  
  стрИмяФайла=КаталогИБ()+"XML\tovar.xml";  
   
  спр=СоздатьОбъект("Справочник.Товары");  
  НачатьТранзакцию(); //Для ускорения  
  сч=0; //Для ускорения  
  Сообщить("Начало чтения XML: "+ТекущееВремя());  
  xml_ОткрытьФайл(стрИмяФайла);
   
  xml_Прочитать("<Товары>");
   
  спрР=СоздатьОбъект("Справочник.Товары");
   
  Пока xml_Прочитать("<Элемент>,</Товары>")=1 Цикл
  сч=сч+1; //Для ускорения
  Если сч%1000=0 Тогда //Для ускорения
  ЗафиксироватьТранзакцию(); //Для ускорения
  НачатьТранзакцию();//Для ускорения
  КонецЕсли;//Для ускорения
   
  Если xml_ИмяТега="</Товары>" Тогда
  Прервать;
  КонецЕсли;
   
  Код=Число(xml_ПолучитьАтрибут("Код"));
  Наименование=xml_ПолучитьАтрибут("Наименование");
  Единица=xml_ПолучитьАтрибут("Единица");
  Цена=Число(xml_ПолучитьАтрибут("Цена"));
  ЭтоГруппа=Число(xml_ПолучитьАтрибут("ЭтоГруппа"));
  КодГруппы=Число(xml_ПолучитьАтрибут("Группа"));
   
  спрР.НайтиПоКоду(КодГруппы,0);
   
  Если спр.НайтиПоКоду(Код)=0 Тогда
  спр.ИспользоватьРодителя(спрР.ТекущийЭлемент());
  Если ЭтоГруппа=1 Тогда
  спр.НоваяГруппа();
  Иначе
  спр.Новый();
  КонецЕсли;
  спр.Код = Код;
  КонецЕсли;
   
  спр.Родитель=спрР.ТекущийЭлемент();
   
  спр.Наименование = Наименование;
  спр.Цена = Цена;
  спр.Единица = Единица;
  спр.Записать();
   
   
  КонецЦикла; //по элементам XML
   
  xml_Закрыть();
  Сообщить("Обработка завершена! "+ТекущееВремя(),"i");
  ЗафиксироватьТранзакцию(); //Для ускорения
   
   
КонецПроцедуры





Запись файла









перем xml_fso;  
перем xml_file; 
перем xml_СтекТегов; 
перем xml_ТегОткрыт; 
перем xml_Отступы; 
   
   
///////////////////////////////////////////////////////////////////////  
//Открывает файл XML в режиме записи. Если файл существовал, перезаписывает его.  
//Принимает параметр прм_ИмяФайла - имя файла (укажите полный путь и расширение .XML)  
Процедура xml_СоздатьФайл(прм_ИмяФайла)  
  xml_fso=СоздатьОбъект("Scripting.FileSystemObject");  
  xml_file=xml_fso.CreateTextFile(прм_ИмяФайла, -1, 0); //создать файл, перезаписывая существующий.

  xml_file.WriteLine("<?xml version=""1.0"" encoding=""windows-1251""?>"); //Пишем заголовок XML.

  xml_СтекТегов=СоздатьОбъект("СписокЗначений"); 
  xml_Отступы="";  
  xml_ТегОткрыт=0; 
КонецПроцедуры  
   
///////////////////////////////////////////////////////////////////////  
//Записывает начало элемента (тега XML). Имя можно указывать в угловых скобках.  
Процедура xml_ЗаписатьНачалоЭлемента(прм_ИмяТега)  
  перем стр;  
   
  Если xml_ТегОткрыт=1 Тогда  
  xml_ТегОткрыт=0;  
  xml_file.WriteLine(">");  
  xml_Отступы=xml_Отступы+" ";  
  КонецЕсли;  
   
  стр=прм_ИмяТега;  
  стр=СтрЗаменить(стр, "<", "");  
  стр=СтрЗаменить(стр, ">", "");  
   
  xml_СтекТегов.ДобавитьЗначение(стр);  
  xml_file.Write(xml_Отступы+"<"+стр);  
  xml_ТегОткрыт=1;  
КонецПроцедуры  
   
///////////////////////////////////////////////////////////////////////  
//Записывает атрибут (параметр) тега XML.  
Процедура xml_ЗаписатьАтрибут(прм_ИмяАтрибута, прм_ЗначениеАтрибута)  
  Если xml_ТегОткрыт=0 Тогда  
  Сообщить("Перед записью атрибута необходимо записать начало элемента!","!"); а=10/0;  
  КонецЕсли;  
   
  стр=прм_ЗначениеАтрибута;  
  стр=СтрЗаменить(стр, "&", "&"+"a"+"m"+"p"+";");
  стр=СтрЗаменить(стр, """", "&"+"q"+"u"+"o"+"t;");
  стр=СтрЗаменить(стр, "<", "&"+"l"+"t"+";");  
  стр=СтрЗаменить(стр, ">", "&"+"g"+"t"+";");
  стр=СтрЗаменить(стр, "'", "&"+"a"+"p"+"o"+"s;");  
  xml_file.Write(" "+прм_ИмяАтрибута+"="+""""+стр+"""");  
КонецПроцедуры // xml_ЗаписатьЗаписатьАтрибут  
   
///////////////////////////////////////////////////////////////////////  
//Записывает конец элемента (тега XML). Имя закрываемого тега можно указывать в угловых скобках,  
//а можно - не указывать вовсе.  
   
Процедура xml_ЗаписатьКонецЭлемента(прм_ОжидаемоеИмяТега="")
  перем стрИмяТега, а; 
  Если xml_СтекТегов.РазмерСписка()<1 Тогда 
  Сообщить("Попытка закрыть неоткрытый элемент!","!"); а=10/0;  
  КонецЕсли;  
   
  стрИмяТега=xml_СтекТегов.ПолучитьЗначение(xml_СтекТегов.РазмерСписка());

  Если ПустаяСтрока(прм_ОжидаемоеИмяТега)=0 Тогда
  стр=прм_ОжидаемоеИмяТега; 
  стр=СтрЗаменить(стр, "<", "");  
  стр=СтрЗаменить(стр, ">", "");  
  стр=СтрЗаменить(стр, "/", "");  
   
  Если стр<>стрИмяТега Тогда  
  Сообщить("Ожидается имя тега "+стр+", а закрыто "+стрИмяТега,"!"); а=10/0;  
  КонецЕсли; 
  КонецЕсли;  
   
   
  xml_СтекТегов.УдалитьЗначение(xml_СтекТегов.РазмерСписка());
  Если xml_ТегОткрыт=1 Тогда 
  xml_ТегОткрыт=0; 
  xml_file.WriteLine("/>"); 
  Возврат;
  КонецЕсли;  
  xml_Отступы=лев(xml_Отступы, СтрДлина(xml_Отступы)-2);

  xml_file.WriteLine(xml_Отступы+"</"+стрИмяТега+">"); 
   
КонецПроцедуры // xml_ЗаписатьКонецЭлемента  
   
   
///////////////////////////////////////////////////////////////////////  
//Закрывает открытый файл XML. После окончания работы с файлом его необходимо закрыть.  
Функция xml_Закрыть() 
  xml_file.Close(); 
  Если xml_СтекТегов.РазмерСписка()<>0 Тогда  
  Сообщить("Имеются незакрытые элементы XML!","!"); а=10/0; 
  КонецЕсли;  
КонецФункции // xml_Закрыть  
//*******************************************  


Процедура Выполнить() 
  стрИмяФайла=КаталогИБ()+"XML\tovar_out.xml";  
  Сообщить("Начало записи: "+стрИмяФайла);  
  Сообщить("Время начала: "+ТекущееВремя());  
  xml_СоздатьФайл(стрИмяФайла);  
  xml_ЗаписатьНачалоЭлемента("<Товары>");  
  спр=СоздатьОбъект("Справочник.Товары");  
  спр.ВыбратьЭлементы();  
  Пока спр.ПолучитьЭлемент()=1 Цикл  
  xml_ЗаписатьНачалоЭлемента("<Элемент>"); 
  xml_ЗаписатьАтрибут("Код", спр.Код);  
  xml_ЗаписатьАтрибут("Наименование", СокрЛП(спр.Наименование));  
  Если спр.ЭтоГруппа()=1 Тогда  
  xml_ЗаписатьАтрибут("ЭтоГруппа", "1"); 
  Иначе 
  xml_ЗаписатьАтрибут("Единица", СокрЛП(спр.Единица));  
  xml_ЗаписатьАтрибут("Цена", СокрЛП(спр.Цена));
  КонецЕсли;  
  Если ПустоеЗначение(спр.Родитель)=0 Тогда
  xml_ЗаписатьАтрибут("Группа", спр.Родитель.Код);
  КонецЕсли;  
  xml_ЗаписатьКонецЭлемента("</Элемент>");
  КонецЦикла;
  xml_ЗаписатьКонецЭлемента("</Товары>");
  xml_Закрыть();
  Сообщить("Конец записи: "+ТекущееВремя());
КонецПроцедуры




KarpovSergei
Конфигурация "Зарплата и управление персоналом"
Форма "Передача СЗВ-4 в ПФР"
Версия файла: версия 07.00 XML

При выгрузке данных возникает сообщение: "Не удалось провести документ"
и ошибка: "Не указан формат файла"

Подскажите пожалуйста, как решить проблему.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.