Записки программиста 1с

1с загрузка данных xml

загрузка данных объектов между конфигурациями 1с через xml

Выгрузка и загрузка данных объектов через xml между 1с

Иногда в работе можно столкнуться с ситуацией, когда возникает необходимость перенести данные в формате xml.

     XML – это расширяемый язык разметки. Он широко применяется в 1с для обмена данными между конфигурациями, а также между другими внешними источниками данных с помощью данного механизма.

    Все базы данных поддерживают стандарт формата в полном объеме. Существует множество вариантов, в которых применяют XML для переноса данных. все они реализованы в 1С и совместимых с ней продуктах.

      Часто формат XML используются для решения следующих вопросов:

     ·Выгрузка прайс-листов, заказов, печатных форм документов.

  Загрузка информации, переданной из филиалов/представительств организации, где используется локальное программное обеспечение.

     ·Обмен данными с банками, налоговой службой, внебюджетными фондами.

          В программах 1С существует типовая обработка загрузки данных из файла формата XML.

     Воспользоваться данной обработкой может пользователь, у которого настроены полные права. Так как данная обработка открывается через раздел «Режим технического специалиста». Разрешить показ пункта меню «Режим технического специалиста» можно, используя раздел «Сервис и настройки». Далее «Настройки» — «Параметры», найти нужное поле и установить напротив него флажок.

В меню «Функции для технического специалиста» перейти в пункт «Обработки» и в предложенном списке выбрать «Универсальный обмен данными в формате XML».

1с загрузка данных xml
Универсальный обмен данными в формате XML

Бывают случаи когда нужно перенести один-два объекта из одной конфигурации в другую и если метаданные переносимых объектов совпадают в обоих конфигурациях, то можно использовать следующий способ.

Выгрузка данных элементов справочника 1с в файл XML

Процедура ВыгрузитьОбъектыВXML(Кнопка)

ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.ОткрытьФайл("c:\obmen.xml");
ЗаписьXML.ЗаписатьНачалоЭлемента("Spravohniki");
ЗаписьXML.ЗаписатьНачалоЭлемента("Валюты");

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|	Валюты.Ссылка
|ИЗ
|	Справочник.Валюты КАК Валюты";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
	ТекущийСправочник = Выборка.Ссылка.ПолучитьОбъект();
	ЗаписатьXML(ЗаписьXML,ТекущийСправочник);
КонецЦикла;
	
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
	
ЗаписьXML.Закрыть();   
	
КонецПроцедуры

По такому же принципу можно выгружать и документы. Причем можно выгрузить один объект, для этого нужно передать вторым параметром метода “ЗаписатьXML” необходимый объект.

В итоге при выполнении этой процедуры сформируется файл со следующим содержанием:

Текст XML файла


<Spravohniki>
<Валюты>
<CatalogObject.Валюты>
<Ref>bd72d8f9-55bc-11d9-848a-00112f43529a</Ref>
<DeletionMark>false</DeletionMark>
<Code>643</Code>
<Description>руб.</Description>
<НаименованиеПолное>Российский рубль</НаименованиеПолное>
<ПараметрыПрописиНаРусском>рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2</ПараметрыПрописиНаРусском>
</CatalogObject.Валюты>
<CatalogObject.Валюты>
<Ref>bd72d8fa-55bc-11d9-848a-00112f43529a</Ref>
<DeletionMark>false</DeletionMark>
<Code>840</Code>
<Description>USD</Description>
<НаименованиеПолное>Доллар США</НаименованиеПолное>
<ПараметрыПрописиНаРусском>доллар, доллара, долларов, м, цент, цента, центов, м, 2</ПараметрыПрописиНаРусском>
</CatalogObject.Валюты>
<CatalogObject.Валюты>
<Ref>cbcf4923-55bc-11d9-848a-00112f43529a</Ref>
<DeletionMark>false</DeletionMark>
<Code>978</Code>
<Description>EUR</Description>
<НаименованиеПолное>ЕВРО</НаименованиеПолное>
<ПараметрыПрописиНаРусском>евро, евро, евро, м, цент, цента, центов, м, 2</ПараметрыПрописиНаРусском>
</CatalogObject.Валюты>
<CatalogObject.Валюты>
<Ref>0e617614-55bd-11d9-848a-00112f43529a</Ref>
<DeletionMark>false</DeletionMark>
<Code>792</Code>
<Description>TRL</Description>
<НаименованиеПолное>Турецкая лира</НаименованиеПолное>
<ПараметрыПрописиНаРусском/>
</CatalogObject.Валюты>
<CatalogObject.Валюты>
<Ref>0e617615-55bd-11d9-848a-00112f43529a</Ref>
<DeletionMark>false</DeletionMark>
<Code>001</Code>
<Description>у.е.</Description>
<НаименованиеПолное>Условная единица</НаименованиеПолное>
<ПараметрыПрописиНаРусском>условная единица, условные единицы, условных единиц, ж, цент, цента, центов, м, 2</ПараметрыПрописиНаРусском>
</CatalogObject.Валюты>
</Валюты>
</Spravohniki>

Корень ХМЛ-файла “Spravohniki” и ветка “Валюты” сделаны для пояснения содержимого XML файла, можно обойтись без них. Но в файле обязательно должен быть корень дерева, т.е. перед записью данных нужно обязательно написать “ЗаписатьНачалоЭлемента”.

Загрузка объектов из XML


Процедура ЗагрузитьОбъектыИзXML(Кнопка)
	
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.ОткрытьФайл("c:\obmen.xml");
	
Пока ЧтениеXML.Прочитать() Цикл
    Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл 
	ТекущийОбъект = ПрочитатьXML(ЧтениеXML);
	ТекущийОбъект.Записать();
  КонецЦикла;	
КонецЦикла;	
ЧтениеXML.Закрыть();  

КонецПроцедуры

Как Вы видите программа сама определяет тип объекта и все его свойства методом “ПрочитатьXML”. Здесь только стоит упомянуть, что при загрузке программа ищет наличие этого объекта по Уникальному идентификатору. поэтому если у Вас уже есть такой объект, то программа перезапишет его заменив данными из файла. И наоборот при попытке загрузить объект с другим идентификатором, но такими же данными программа сообщить, что объект с таким кодом(номером) уже существует.

Рассмотрели перенос данных 1с между конфигурациями Предприятие 8.

// Интерфейс для запуска логики обработки.
Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения) Экспорт 
	
	Если ИмяКоманды = "ЗагрузкаКурсовВалют" Тогда
		Загрузка();
	КонецЕсли;
	
КонецПроцедуры                                                            

#КонецОбласти

Функция ЗагрузитьДанныеИзXMLФайла(Адрес) Экспорт
	
	Чтение = Новый ЧтениеXML;
	Чтение.ОткрытьФайл(Адрес);
	
	ПостроительDOM = Новый ПостроительDOM;
	ДокументDOM = ПостроительDOM.Прочитать(Чтение);
	
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("ЦифрКод");
	ТЗ.Колонки.Добавить("СимвКод");
	ТЗ.Колонки.Добавить("Номинал");
	ТЗ.Колонки.Добавить("Курс");
	ТЗ.Колонки.Добавить("Имя");
	
	Для Каждого Элемент Из ДокументDOM.ДочерниеУзлы Цикл
		Если Элемент.ИмяУзла = "ValCurs" Тогда
			ДатаXML = Элемент.Атрибуты.ПолучитьИменованныйЭлемент("Date").ЗначениеУзла;
			Попытка
				Атрибут = Дата(Прав(ДатаXML,4), Сред(ДатаXML,4,2), Лев(ДатаXML,2));
			Исключение
				Возврат Ложь;
			КонецПопытки;
			//Если Атрибут <> КонецДня(ТекущаяДата() + 1) Тогда   
			//	Возврат Ложь;
			//КонецЕсли;               
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого Элемент Из ДокументDOM.ЭлементДокумента.ДочерниеУзлы Цикл
					 
		Если Элемент.ИмяУзла = "Valute" Тогда
			
			Стр = ТЗ.Добавить();
			Для Каждого ЭлементКурса Из Элемент.ДочерниеУзлы Цикл			
				Если ЭлементКурса.ИмяУзла = "NumCode" Тогда
					Стр.ЦифрКод = ЭлементКурса.ТекстовоеСодержимое;
				ИначеЕсли ЭлементКурса.ИмяУзла = "CharCode" Тогда
					Стр.СимвКод = ЭлементКурса.ТекстовоеСодержимое;
				ИначеЕсли ЭлементКурса.ИмяУзла = "Nominal" Тогда
					Стр.Номинал = ЭлементКурса.ТекстовоеСодержимое;
				ИначеЕсли ЭлементКурса.ИмяУзла = "Value" Тогда
					Стр.Курс = ЭлементКурса.ТекстовоеСодержимое;
				ИначеЕсли ЭлементКурса.ИмяУзла = "Name" Тогда
					Стр.Имя = ЭлементКурса.ТекстовоеСодержимое;
				КонецЕсли;
			КонецЦикла;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	Валюты.Ссылка КАК Ссылка,
	               |	Валюты.Код КАК Код,
	               |	Валюты.СпособУстановкиКурса КАК СпособУстановкиКурса
	               |ИЗ
	               |	Справочник.Валюты КАК Валюты
	               |ГДЕ
	               |	Валюты.СпособУстановкиКурса = &СпособУстановкиКурса";
	
	Запрос.УстановитьПараметр("СпособУстановкиКурса", Перечисления.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета);
	РезультатЗапроса = Запрос.Выполнить();
	
	Выборка = РезультатЗапроса.Выбрать();
	
	Пока Выборка.Следующий() Цикл
		НайденнаяСтрока = ТЗ.Найти(Выборка.Код);
		НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
		НаборЗаписей.Валюта = Выборка.Ссылка;
		НаборЗаписей.Кратность = НайденнаяСтрока.Номинал;
		НаборЗаписей.Курс = НайденнаяСтрока.Курс;
		НаборЗаписей.Период = ТекущаяДата() + 86400;
		НаборЗаписей.Записать();
	КонецЦикла;
	
	Чтение.Закрыть();
	Чтение = Неопределено;
	
КонецФункции

Процедура Загрузка() Экспорт
	
	АдресФайла = "https://www.cbr.ru/scripts/XML_daily.asp?date_req";
	Файл = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(АдресФайла);	
	Попытка
		ЗагрузитьДанныеИзXMLФайла(Файл.Путь);
	Исключение
		ВызватьИсключение Файл.СообщениеОбОшибке;
	КонецПопытки;
	
КонецПроцедуры

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *