Загрузка XML файла в документ 1С

1. 1c_novichok 28.10.16 13:45 Сейчас в теме
Добрый день! У нас стоит бух предприятия 3 и есть стороняя программа никак не связанная с 1с. И тут встала задача по загрузке данных в 1ску данных из этой "левой" программы с помощью XML. Поискал в инете различные обработки и написал по аналогии свою по загрузке данных в документ,но обработка не загружает ничего. Может кто глянуть и посмотреть что не так или что -то надо исправить или вообще есть уже готовое решение?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. 1c_novichok 28.10.16 13:51 Сейчас в теме
&НаСервере
Процедура  ПрочитатьXMLФайлНаСервере(Файлик);
	
	
	ПутьКФайлу = Файлик[0];	
	
	 //XML
	 
	 ЧтениеXML = Новый ЧтениеXML;
	 ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
	 
	 
	 СЗ = Новый СписокЗначений;
	 
	 Пока ЧтениеXML.Прочитать() Цикл
		 
		 Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента
			 Тогда    ЧтениеXML.ПрочитатьАтрибут();
			         Атрибут = ЧтениеXML.Значение;
			 КонецЕсли;
		 
			 Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
				 
				 //дата оказания
				 Если Атрибут  =  "visit_date" Тогда
					 СЗ.Добавить(ЧтениеXML.Значение);
				 КонецЕсли;
				 //код услуги
			 	 Если Атрибут  =  "service_code" Тогда
					 СЗ.Добавить(ЧтениеXML.Значение);
				 КонецЕсли;
				        //Услуга
				 Если Атрибут  =  "service_name" Тогда
					 СЗ.Добавить(ЧтениеXML.Значение);
				 КонецЕсли;
				     //Кабинет
				 Если Атрибут  =  "cablab_name" Тогда
					 СЗ.Добавить(ЧтениеXML.Значение);
					 КонецЕсли;

			 КонецЕсли;
			 
			Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента и 
			 Атрибут = "status_mnemo"   Тогда
			 СоздатьЭлементДокумента(СЗ) ;
			 СЗ.Очистить();
			 КонецЕсли;
			 
			 		 КонецЦикла;
	
	
КонецПроцедуры

Процедура  СоздатьЭлементДокумента(СЗ) ;
 Если СЗ.Количество() >0 Тогда
 НовыйЭлемент = Документы.ОтчетОРозничныхПродажах.СоздатьДокумент();
 НовыйЭлемент.Дата = СЗ[0].Значение;
 НовыйЭлемент.Код = СЗ[1].Значение;
 НовыйЭлемент.Товары.Номенклатура = СЗ[2].Значение;
 НовыйЭлемент.Склад = СЗ[3].Значение;
 
 	
      НовыйЭлемент.Записать();
СЗ.Очистить();
 КонецЕсли;

	

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









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


ОбновитьИнтерфейс();
	
	
КонецПроцедуры



Показать
3. DenisCh 28.10.16 13:52 Сейчас в теме
Надо исправить ошибку в строке 1456 и в 4326
4. vadim1011985 101 28.10.16 14:04 Сейчас в теме
(3) Вы еще не заметил ошибку в 3232 строке )))

(1) Точку останова пробовали ставить ? и смотреть как работает код. Судя по тому что Вы написали работать явно не должно. В документе не устанавливаете Организацию . В ТЧ товары добавляете непонятно как, не заполняете все необходимые поля . Логично предположить что документ не может быть записан
5. DenisCh 28.10.16 14:15 Сейчас в теме
(4) Пусть сначала эти две исправит )
6. 1c_novichok 28.10.16 14:30 Сейчас в теме
(4)(5) исправил,исправил) эти "странные" ошибки)
теперь к серьезному)
то есть в документ надо закидывать прям все данные?
просто из XML берется только 4 строки.
сейчас вот попробую через точку останова смотреть.
7. DenisCh 28.10.16 14:37 Сейчас в теме
(6) в документ нужно закидывать все данные, которые нужны этому документу. Не больше. Но и не меньше.
8. корум 288 28.10.16 14:40 Сейчас в теме
9. DenisCh 28.10.16 14:43 Сейчас в теме
(8) Без этого никуда. Обязательно.
10. 1c_novichok 03.11.16 08:12 Сейчас в теме
(9) кароч решил сделать по-другому. создал справочник с реквизитами в нулевой базе. и на форме создал кнопку. но при нажатии выходит ошибка "Использование синхронных методов на клиенте запрещено!".
11. 1c_novichok 03.11.16 08:13 Сейчас в теме


&НаСервере
Процедура ПрочитатьXMLФайлНаСервере(Файлик);


ПутьКФайлу = Файлик[0];

//XML

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);


СЗ = Новый СписокЗначений;

Пока ЧтениеXML.Прочитать() Цикл

Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента
Тогда ЧтениеXML.ПрочитатьАтрибут();
Атрибут = ЧтениеXML.Значение;
КонецЕсли;

Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда

//дата оказания
Если Атрибут = "VISIT_DATE" Тогда
СЗ.Добавить(ЧтениеXML.Значение);
КонецЕсли;
//код услуги
Если Атрибут = "SERVICE_CODE" Тогда
СЗ.Добавить(ЧтениеXML.Значение);
КонецЕсли;
//Услуга
Если Атрибут = "SERVICE_NAME" Тогда
СЗ.Добавить(ЧтениеXML.Значение);
КонецЕсли;
//Кабинет
Если Атрибут = "CABLAB_NAME" Тогда
СЗ.Добавить(ЧтениеXML.Значение);
КонецЕсли;
//Сумма
Если Атрибут = "SUMM_WITH_DISCOUNT" Тогда
СЗ.Добавить(ЧтениеXML.Значение);
КонецЕсли;

КонецЕсли;

Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента и
Атрибут = "status_mnemo" Тогда
СоздатьЭлементДокумента(СЗ) ;
СЗ.Очистить();
КонецЕсли;


КонецЦикла;


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

Процедура СоздатьЭлементДокумента(СЗ) ;
Если СЗ.Количество() >0 Тогда
НовыйЭлемент = Справочники.Выгрузка.СоздатьЭлемент();
НовыйЭлемент.Дата = СЗ[0].Значение;
НовыйЭлемент.Код = СЗ[1].Значение;
НовыйЭлемент.Наименование = СЗ[2].Значение;
НовыйЭлемент.Кабинет = СЗ[3].Значение;
НовыйЭлемент.Сумма = СЗ[4].Значение;


НовыйЭлемент.Записать();
СЗ.Очистить();
КонецЕсли;



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


&НаКлиенте
Процедура ПрочитатьИзФайлаXML(Команда)

Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
Фильтр = "xml|*.xml";
ДиалогОткрытияФайла.Фильтр = Фильтр;
Если ДиалогОткрытияФайла.Выбрать() Тогда
Файлик = ДиалогОткрытияФайла.ВыбранныеФайлы;
ПрочитатьXMLФайлНаСервере(Файлик);
КонецЕсли;


ОбновитьИнтерфейс();


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






12. DenisCh 03.11.16 08:55 Сейчас в теме
Или в свойствах конфигурации включи использование синхронных методов, или перепиши выбор файла на асинхронные
13. 1c_novichok 03.11.16 09:32 Сейчас в теме
(12) в свойствах включил. помогло,спасибо!
14. 1c_novichok 03.11.16 16:31 Сейчас в теме
(12) только теперь выходит ошибка
{Справочник.Выгрузка.Форма.ФормаСписка.Форма(76)}: Индекс находится за границами массива
НовыйЭлемент.Сумма= СЗ[4].Значение;
15. корум 288 03.11.16 16:48 Сейчас в теме
(14) значит, где-то не было в XML "SUMM_WITH_DISCOUNT" , и нет СЗ[4]
16. 1c_novichok 07.11.16 07:55 Сейчас в теме
(15) "SUMM_WITH_DISCOUNT" есть в xml. я проверил) а как может не быть СЗ[4].
Просто если я комментирую запись "НовыйЭлемент.Сумма= СЗ[4].Значение;" то все ок.
17. Denis_CFO 49 07.11.16 08:30 Сейчас в теме
(16) тогда вот так можно:
Попытка 
           НовыйЭлемент.Сумма = СЗ[4].Значение; 
Исключение
           НовыйЭлемент.Сумма = 0; 
           Сообщить("В " + СЗ[0].Значение + " " + СЗ[1].Значение +" не найдена сумма!" ; 
КонецПопытки
19. 1c_novichok 07.11.16 11:41 Сейчас в теме
(17) Вроде заработало. Спасибо!
18. YNik 07.11.16 09:18 Сейчас в теме
(16), нет любого из пяти значений, в СЗ будет меньше 5 элементов, поэтому и ругается.
Оставьте свое сообщение

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