Загрузка документов перемещеня МПЗ из XML
Доброго времени суток, уважаемые читатели и "УМЫ" форума! :)
У меня возникла трудность с загрузкой XML файла в 1С 7.7. Раньше я использовал только типовые загрузки XML, поэтому каюсь, в этом вопросе опыта мало... Начну с того, что есть "Выгрузка.xml" с документами перемещение за определенный период. Структура XML-файла приложена. Есть также внешняя обработка импорта данных документов, которая создает документы "ПеремещениеМПЗ" в 1С 7.7.. Обработку писал не сам, а честно признаюсь, что позаимствовал её здесь на форуме, только слегка переделал под свои нужды :). Так вот всё вроде бы работает, но почему-то номенклатуры в табличной части не появляются. Я подозреваю, что в обработке "логические" ошибки при чтении "Тегов" скорее всего, так как при выполнении запроса не дохожу до тега "Строка Номер...". Прошу помощи у вас! Заранее благодарю.
P.S. Загрузку делаю в конфигурацию Производство+Услуги+Бухгалтерия.
У меня возникла трудность с загрузкой XML файла в 1С 7.7. Раньше я использовал только типовые загрузки XML, поэтому каюсь, в этом вопросе опыта мало... Начну с того, что есть "Выгрузка.xml" с документами перемещение за определенный период. Структура XML-файла приложена. Есть также внешняя обработка импорта данных документов, которая создает документы "ПеремещениеМПЗ" в 1С 7.7.. Обработку писал не сам, а честно признаюсь, что позаимствовал её здесь на форуме, только слегка переделал под свои нужды :). Так вот всё вроде бы работает, но почему-то номенклатуры в табличной части не появляются. Я подозреваю, что в обработке "логические" ошибки при чтении "Тегов" скорее всего, так как при выполнении запроса не дохожу до тега "Строка Номер...". Прошу помощи у вас! Заранее благодарю.
//*******************************************
Процедура Сформировать()
ПутьКФайлуЗагрузки = "c:\Выгрузка.xml";
Если ( ПустоеЗначение(ПутьКФайлуЗагрузки) = 1 ) Тогда
Предупреждение("Не указан файл загрузки");
Возврат;
КонецЕсли;
флЕстьОшибкиВФайлеЗагрузки = 0;
ТЗнач = СоздатьОбъект("ТаблицаЗначений");
ТЗнач.НоваяКолонка("НомерДок");
ТЗнач.НоваяКолонка("ДатаДок");
ТЗнач.НоваяКолонка("МестоХранения");
ТЗнач.НоваяКолонка("МестоХраненияВ");
ТЗнач.НоваяКолонка("Номенклатура");
ТЗнач.НоваяКолонка("Количество", "Число", 15, 2);
ТЗначТовары = СоздатьОбъект("ТаблицаЗначений");
ТЗнач.Выгрузить(ТЗначТовары);
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1 Тогда
Предупреждение("Внешняя компонента не найдена");
Возврат;
КонецЕсли;
гXMLАнализатор = СоздатьОбъект("AddIn.XMLParser");
ФайлXML = гXMLАнализатор.СоздатьПоследовательноСчитываемыйДокумент();
ФайлXML.СвязатьСФайлом(ПутьКФайлуЗагрузки);
ТипТега = ФайлXML.Спуститься();
Пока ТипТега <> 4 Цикл // пока не достигнут конец файла
Если ТипТега <> 1 Тогда
ТипТега = ФайлXML.Следующий();
Продолжить
КонецЕсли; // пропускаем концы уровней
ИмяТега = ФайлXML.СвойстваТекущегоУзла.Имя;
Если ИмяТега = "Документ" Тогда
Объект = ФайлXML.ТекущийЭлементВВидеОбъекта();
НомерДок = "";
ДатаДок = "";
СкладОтправитель = "";
СкладОтправитель = "";
КолвоПодчиненныхУзлов_Накладные = Объект.КоличествоПодчиненных();
Сообщить(КолвоПодчиненныхУзлов_Накладные);
Для сч_Накладные = 1 По КолвоПодчиненныхУзлов_Накладные Цикл
УзелНакладные= Объект.ПолучитьПодчиненныйПоНомеру(сч_Накладные);
Если ( УзелНакладные.Наименование = "Номер" ) Тогда
НомерДок = УзелНакладные.Значение;
ИначеЕсли ( УзелНакладные.Наименование = "Дата" ) Тогда
ДатаДок = УзелНакладные.Значение;
ИначеЕсли ( УзелНакладные.Наименование = "СкладОтправитель" ) Тогда
СкладОтправитель = УзелНакладные.Значение;
ИначеЕсли ( УзелНакладные.Наименование = "СкладПолучатель" ) Тогда
СкладПолучатель = УзелНакладные.Значение;
ИначеЕсли ( УзелНакладные.Наименование = "Товары" ) Тогда
ТипТега = ФайлXML.Спуститься();
Если ИмяТега = "Строка" Тогда
Объект = ФайлXML.ТекущийЭлементВВидеОбъекта();
КоличествоЛинийНакладной = Объект.КоличествоПодчиненных();
Номенклатура = "";
Количество = "";
Для сч_Линий = 1 По КоличествоЛинийНакладной Цикл
УзелЛинии = Объект.Объект.ПолучитьПодчиненныйПоНомеру(сч_Линий);
Если ( УзелЛинии.Наименование = "Номенклатура" ) Тогда
Номенклатура = УзелЛинии.Значение;
Сообщить(Номенклатура);
ИначеЕсли ( УзелЛинии.Наименование = "Количество" ) Тогда
Количество = УзелЛинии.Значение;
Сообщить(Количество);
КонецЕсли;
КонецЦикла;
КонецЕсли;
// записываем даные в таблицу значений
ТЗнач.НоваяСтрока();
ТЗнач.НомерДок = НомерДок;
ТЗнач.ДатаДок = ДатаДок;
ТЗнач.МестоХранения = СкладОтправитель;
ТЗнач.МестоХраненияВ = СкладПолучатель;
ТЗнач.Номенклатура = Номенклатура;
ТЗнач.Количество = Количество;
КонецЕсли;
КонецЦикла;
Иначе
ТипТега = ФайлXML.Спуститься();
Продолжить;
КонецЕсли;
ТипТега = ФайлXML.Следующий();
КонецЦикла;
ТЗнач.Сортировать("+НомерДок");
ТЗнач.ВыбратьСтроки();
Пока ТЗнач.ПолучитьСтроку() = 1 Цикл
ТЗначТовары.НоваяСтрока();
ТЗначТовары.НомерДок = ТЗнач.НомерДок;
ТЗначТовары.ДатаДок = ТЗнач.ДатаДок;
ТЗначТовары.МестоХранения = ТЗнач.МестоХранения;
ТЗначТовары.МестоХраненияВ = ТЗнач.МестоХраненияВ;
ТЗначТовары.Номенклатура = ТЗнач.Номенклатура;
ТЗначТовары.Количество = ТЗнач.Количество;
КонецЦикла;
СпрСклады = СоздатьОбъект("Справочник.МестаХранения");
СпрТовары = СоздатьОбъект("Справочник.Материалы");
// Товары
ДокумТовары = СоздатьОбъект("Документ.ДвижениеМПЗ");
ТЗначДокументы = СоздатьОбъект("ТаблицаЗначений");
ТЗначТовары.Выгрузить(ТЗначДокументы);
ТЗначДокументы.Свернуть("НомерДок", "");
ТЗначДокументы.ВыбратьСтроки();
Пока ТЗначДокументы.ПолучитьСтроку() = 1 Цикл
ДокумТовары.Новый();
ДокумТовары.ДатаДок = ТЗначТовары.ДатаДок;
ДокумТовары.НомерДок = ТЗначТовары.НомерДок;
ТекКодСклада = ТЗначТовары.МестоХранения;
Если ( СпрСклады.НайтиПоНаименованию(ТекКодСклада, 0) = 1 ) Тогда
ТекСклад = СпрСклады.ТекущийЭлемент();
Иначе
ТекСклад = "";
Сообщить("В справочнике мест хранения не найден склад с кодом " + ТекКодСклада);
КонецЕсли;
ДокумТовары.МестоХранения = ТекСклад;
ТекКодСкладаВ = ТЗначТовары.МестоХраненияВ;
Если ( СпрСклады.НайтиПоНаименованию(ТекКодСкладаВ, 0) = 1 ) Тогда
ТекСкладВ = СпрСклады.ТекущийЭлемент();
Иначе
ТекСкладВ = "";
Сообщить("В справочнике мест хранения не найден склад с кодом " + ТекКодСкладаВ);
КонецЕсли;
ДокумТовары.МестоХраненияВ = ТекСкладВ;
ТЗначТовары.ВыбратьСтроки();
Пока ТЗначТовары.ПолучитьСтроку() = 1 Цикл
ДокумТовары.ВидМПЗвТЧ = Перечисление.ВидыМПЗ.Материалы;
ТекНаименованиеТовара = Строка(ТЗначТовары.Номенклатура);
Если ( СпрТовары.НайтиПоНаименованию(ТекНаименованиеТовара, 0 ) = 1 ) Тогда
ТекНаименованиеТовара = СпрТовары.ТекущийЭлемент();
Иначе
ТекНаименованиеТовара = "";
Сообщить("Товар " + ТекНаименованиеТовара + ", не найден в справочнике");
КонецЕсли;
ДокумТовары.НоваяСтрока();
ДокумТовары.МПЗ = ТекНаименованиеТовара;
КонецЦикла;
ДокумТовары.Записать();
Сообщить("Создан документ " + ДокумТовары.ТекущийДокумент());
КонецЦикла;
КонецПроцедуры
ПоказатьP.S. Загрузку делаю в конфигурацию Производство+Услуги+Бухгалтерия.
Прикрепленные файлы:
Выгрузка.xml
ЗагрузкаXML.ert
По теме из базы знаний
Найденные решения
Можно так сделать))) Обработка во вложении + Print Screen
ИначеЕсли ( УзелНакладные.Наименование = "Товары" ) Тогда
УзелКорень = Объект.ВыбратьУзел("Товары");
//загружаем товары
Товары = УзелКорень.ВыбратьУзлы("Строка");
Для ш=1 По Товары.КоличествоУзлов() Цикл
ТекТовар = Товары.ПолучитьУзел(ш-1);
// записываем даные в таблицу значений
ТЗнач.НоваяСтрока();
ТЗнач.НомерДок = НомерДок;
ТЗнач.ДатаДок = ДатаДок;
ТЗнач.МестоХранения = СкладОтправитель;
ТЗнач.МестоХраненияВ = СкладПолучатель;
ТЗнач.Номенклатура = ТекТовар.ВыбратьУзел("Номенклатура").Значение;
ТЗнач.Количество = ТекТовар.ВыбратьУзел("Количество").Значение;
КонецЦикла;
КонецЕсли;
ПоказатьПрикрепленные файлы:
ЗагрузкаXML_123.ert
(7)
Если несколько документов тогда можно сделать так:
Если ТЗначТовары.НомерДок <> ТЗначДокументы.НомерДок Тогда
Если несколько документов тогда можно сделать так:
Если ТЗначТовары.НомерДок <> ТЗначДокументы.НомерДок Тогда
Прикрепленные файлы:
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
ИначеЕсли ( УзелНакладные.Наименование = "Товары" ) Тогда
ОбъектТовары = ФайлXML.ТекущийЭлементВВидеОбъекта();
КолвоПодчиненныхУзлов_Товары = ОбъектТовары.КоличествоПодчиненных();
Для сч_Товары = 1 По КолвоПодчиненныхУзлов_Товары Цикл
УзелТовары= ОбъектТовары.ПолучитьПодчиненныйПоНомеру(сч_Товары);
Если ( УзелТовары.Наименование = "Строка" ) Тогда
ОбъектСтрока = ФайлXML.ТекущийЭлементВВидеОбъекта();
КоличествоЛинийСтроки = ОбъектСтрока.КоличествоПодчиненных();
Номенклатура = "";
Количество = "";
Для сч_Линий = 1 По КоличествоЛинийСтроки Цикл
УзелЛинии = ОбъектСтрока.ПолучитьПодчиненныйПоНомеру(сч_Линий);
Если ( УзелЛинии.Наименование = "Номенклатура" ) Тогда
Номенклатура = УзелЛинии.Значение;
Сообщить(Номенклатура);
ИначеЕсли ( УзелЛинии.Наименование = "Количество" ) Тогда
Количество = УзелЛинии.Значение;
Сообщить(Количество);
КонецЕсли;
КонецЦикла;
КонецЕсли;
ПоказатьПопробуй так, но не уверен что получится нет 7ки под рукой
Можно так сделать))) Обработка во вложении + Print Screen
ИначеЕсли ( УзелНакладные.Наименование = "Товары" ) Тогда
УзелКорень = Объект.ВыбратьУзел("Товары");
//загружаем товары
Товары = УзелКорень.ВыбратьУзлы("Строка");
Для ш=1 По Товары.КоличествоУзлов() Цикл
ТекТовар = Товары.ПолучитьУзел(ш-1);
// записываем даные в таблицу значений
ТЗнач.НоваяСтрока();
ТЗнач.НомерДок = НомерДок;
ТЗнач.ДатаДок = ДатаДок;
ТЗнач.МестоХранения = СкладОтправитель;
ТЗнач.МестоХраненияВ = СкладПолучатель;
ТЗнач.Номенклатура = ТекТовар.ВыбратьУзел("Номенклатура").Значение;
ТЗнач.Количество = ТекТовар.ВыбратьУзел("Количество").Значение;
КонецЦикла;
КонецЕсли;
ПоказатьПрикрепленные файлы:
ЗагрузкаXML_123.ert
Нашел ошибку сам, теперь создается несколько документов, но табличная часть у всех одна и та же.
Прикрепленные файлы:
ЗагрузкаXML_123.ert
выгрузка2.xml
(7)
Если несколько документов тогда можно сделать так:
Если ТЗначТовары.НомерДок <> ТЗначДокументы.НомерДок Тогда
Если несколько документов тогда можно сделать так:
Если ТЗначТовары.НомерДок <> ТЗначДокументы.НомерДок Тогда
Прикрепленные файлы:
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот