Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Загрузка даних з файлу xml , BAS Бухгалтерія 16.1 платформа 8.3.16.1690          
bandrah Подменю пользователя
сообщение 27.12.21, 22:08
Сообщение #1

Общительный
**
Группа: Пользователи
Сообщений: 40
Из: Україна
Спасибо сказали: 17 раз
Рейтинг: 9.8

Потрібно загрузити отримані податкові накладні із медка, без використання різних стиковок, ось процедура, обхід якої працює добре, але вкінці пусто, жодних даних не збережено для формування документа, де що не так роблю, можливо у когось є ідеї, бо пару годин голову ламаю

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


Сообщение отредактировал Batchir - 28.12.21, 8:33

Batchir Подменю пользователя
сообщение 28.12.21, 8:56
Сообщение #2

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1435 раз
Рейтинг: 0

На основании чего вы сделали вывод что данных нет?
я так понимаю что на выходе Вы ожидаете заполненное дерево.
В отладчике смотрели строки дерева?
Первое что бросается в глаза, то это то что код выполняется на сервере. На нем может не быть выбранного на клиенте файла.

перед тем как вызвать ЗагрузитьИзФайлаXML необходимо на клиенте поместить файл во временное хранилище
    АдресВременногоХранилища = "";
    ПутьКФайлу = Объект.Каталог;
    ПоместитьФайл(АдресВременногоХранилища, ПутьКФайлу,,Ложь, ЭтаФорма.УникальныйИдентификатор);


Адрес временного хранилища передать в ЗагрузитьИзФайлаXML , там получить это файл и начать обрабатывать

    ДанныеВремененногоХранилища = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
    ДанныеВремененногоХранилища.Записать(ИмяВременногоФайла);  
    Попытка
        Файл.ОткрытьФайл(ИмяВременногоФайла );
    Исключение
        СообщениеПользователю = Новый СообщениеПользователю;
        СообщениеПользователю.Текст = ОписаниеОшибки();
        СообщениеПользователю.Сообщить();
        Возврат;
    КонецПопытки;


Сообщение отредактировал Batchir - 28.12.21, 8:59

bandrah Подменю пользователя
сообщение 28.12.21, 21:04
Сообщение #3

Общительный
**
Группа: Пользователи
Сообщений: 40
Из: Україна
Спасибо сказали: 17 раз
Рейтинг: 9.8

Batchir @ Сегодня, 8:56 * ,

Змінив трохи код, тепер найцікавіше, як співставити значення із початку тексту із їх текстом(значенням) додаю таблицю значень, що виходить після циклу

&НаСервере
Процедура ЗагрузитьДанныеИзФайлаXML()
    
    Файл = Новый ЧтениеXML();
    ИмяФайла = Объект.Каталог;
    
    Попытка
        Файл.ОткрытьФайл(ИмяФайла);
    Исключение
        Возврат
    КонецПопытки;
    
    //подготовим дерево значений
    //у каждой ветки XML может быть наименование, атрибуты и значение
    дзXML = Новый ДеревоЗначений();
    дзXML.Колонки.Добавить("Наименование");
    дзXML.Колонки.Добавить("Значение");
    дзXML.Колонки.Добавить("Атрибуты");
    
    //так как атрибутов у строки XML может быть несколько - будем записывать их в таблицу значений
    //каждый атрибут имеет имя и значение
    тАтрибутыУзла = Новый ТаблицаЗначений();
    тАтрибутыУзла.Колонки.Добавить("ИмяА");
    тАтрибутыУзла.Колонки.Добавить("ЗначениеА");
    тАтрибутыУзла.Колонки.Добавить("Имя");
    тАтрибутыУзла.Колонки.Добавить("Значение");
    //уровень вложенности поможет нам понимать когда требуется добавить вложенную ветку, а когда нужно вернуться на уровень вверх
    УровеньВложенности = 0;
    //текущая строка - строка дерева, будет меняться при увеличении вложенности
    ТекущаяСтрока = Неопределено;
    //чтение файла XML 1С производится не построчно, а по структуре, при окончании файла чтение вернет ЛОЖЬ
    НачатьТранзакцию();
    Пока Файл.Прочитать() Цикл
        //нас интересуют три вида узлов - начало элемента, текст (значение элемента) и конец элемента (чтобы вернуться на уровень вверх)
        Если Файл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            
            Если Файл.Имя = "ROW" Тогда
            УровеньВложенности = 1;    
            //если это первая строка, то добавим ее в самый верх дерева и сохраним только наименование
            Если ТекущаяСтрока = Неопределено Тогда
                ТекущаяСтрока = дзXML.Строки.Добавить();
                ТекущаяСтрока.Наименование = Файл.Имя;
                //Продолжить;
            Иначе
                //вложенные строки
                ТекущаяСтрока = ТекущаяСтрока.Строки.Добавить();
                ТекущаяСтрока.Наименование = Файл.Имя; //сохраним наименование
                //есть ли у этого элемента XML атрибуты?
                Если Файл.КоличествоАтрибутов() > 0 Тогда
                    //если да - скопируем подготовленную пустую таблицу для сохранения атрибутов
                    //тАтрибутыУзла = тАтрибутов.Скопировать();
                    //цикл по количеству атрибутов у этого элемента
                    Для Сч = 0 по Файл.КоличествоАтрибутов()-1 Цикл
                        //для каждого атрибута запомним имя и значение
                        Если Файл.Имя = "LINE" или Файл.Имя = "TAB" Тогда
                            Продолжить;
                        Иначе    
                        РодительскийЭлемент = Файл.Имя;
                        Строка = тАтрибутыУзла.Добавить();
                        Строка.ИмяА = Файл.ИмяАтрибута(Сч);
                        Строка.ЗначениеА = Файл.ЗначениеАтрибута(Сч);
                        КонецЕсли;
                    КонецЦикла;
                    //сохраним таблицу атрибутов элемента в текущую строку
                    ТекущаяСтрока.Атрибуты = тАтрибутыУзла;
                КонецЕсли;
            КонецЕсли;
            КонецЕсли;
        ИначеЕсли Файл.ТипУзла = ТипУзлаXML.Текст Тогда
            //если у элемента есть значение - просто сохраним его
            
            Если УровеньВложенности = 1 Тогда
            
            Строка = тАтрибутыУзла.Добавить();
            Строка.Значение = Файл.Значение;
            Строка.Имя = Файл.Имя;
            
            КонецЕсли;
        ИначеЕсли Файл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
            //в начале элемента увеличиваем уровень вложенности, в конце элемента уменьшаем
            //УровеньВложенности = УровеньВложенности - 1;
            //РодительскийЭлемент = Файл.Имя;
            ////возвращаем текущую строку на уровень вверх
            //ТекущаяСтрока = ТекущаяСтрока.Родитель;    
        КонецЕсли;
        
    КонецЦикла;
КонецПроцедуры


[необходимо зарегистрироваться для просмотра ссылки]

Сообщение отредактировал Vofka - 29.12.21, 10:30

bandrah Подменю пользователя
сообщение 04.01.22, 17:47
Сообщение #4

Общительный
**
Группа: Пользователи
Сообщений: 40
Из: Україна
Спасибо сказали: 17 раз
Рейтинг: 9.8

Тема закрита, зробив нову процедуру через СписокЗначений(), додав туди послідовно назви атрибутів та наступною стрічкою його значення, потім отримую його через індекси, пошук атрибуту + 1 вот і його значення, а далі заповняю табличну частину, після чого формую документ, знаю що замудреним пішов шляхом, але кращих варіантів мною не було, а терміни піджимали

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 01.11.24, 1:04
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!