Показаны сообщения с ярлыком XML. Показать все сообщения
Показаны сообщения с ярлыком XML. Показать все сообщения

воскресенье, 25 августа 2024 г.

Проверка XML-файла на соответствие схеме

Дано: Большой XML-файл, при попытке загрузить через SSIS в базу SQL падает с неинформативной ошибкой. Доступа к ETL-проекту нет. Надо найти ошибку.

Решение:

// 7.7

Процедура Сформировать()

    Анализатор = СоздатьОбъект("AddIn.XMLParser");
    ДокДляПроверки = Анализатор.СоздатьДокумент();

    Схемы = Анализатор.СоздатьКоллекциюСхем();
    Схемы.ДобавитьСхему("", "полный путь и имя файла.xsd");
    ДокДляПроверки.Схемы = Схемы;

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

 

//8.x - https://forum.infostart.ru/forum9/topic71808/

четверг, 18 февраля 2016 г.

Использование XML в 1С 7.7

Памятка отсюда, хороший был сайт:
http://web.archive.org/web/20041102064633/http://chin.dataltd.ru/index2.php?id=1c_xml1
http://web.archive.org/web/20041102065411/http://chin.dataltd.ru/index2.php?id=1c_xml2

Создание XML-файла с помощью компоненты v7plus.dll.

XML, как известно, один из языков разметки. Подробно о нем можно прочитать в книге и в Инете. С его помощью легко реализовать древовидную структуру хранения данных , а также задать жесткие правила построения дерева, что уменьшит ошибки, связанные с доступом к данным.


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

XML-документ вкратце можно представить следующим образом. Верхним в иерархии является корневой элемент. Все остальные элементы (кроме сведений о формате файла) являются вложенными по отношению к нему (подчиненными), назовем их ветви. Каждый элемент, в т.ч. и корневой поименован. Каждый элемент имеет атрибуты, может содержать данные, а также может иметь множество других вложенных в него элементов. В качестве примера разберем задачу по переносу приходно-кассовых ордеров и банковских выписок, формируемых оперативным отделом с помощью ТиС в бухгалтерию. Данный пример показывает простые приемы работы со структурой XML-документа.Код с пояснениями:

//Сначала проинициализируем компоненту v7plus, предоставляющую объекты для работы с XML:
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1 Тогда
     Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() +
"v7plus.dll") <> 1 Тогда
          Предупреждение(
"Компонента v7plus.dll не найдена!");
     КонецЕсли;
КонецЕсли;
Анализатор = СоздатьОбъект("AddIn.XMLParser");


//Теперь начнем строить дерево документа. Заодно занесем служебную информацию о файле выгрузки в атрибуты корневого элемента
Корень=Анализатор.СоздатьДокумент();
Данные =Корень.СоздатьПодчиненныйЭлемент("Данные");Данные.УстановитьАтрибут("ИБ",КаталогИБ());
Данные
.УстановитьАтрибут("Дата",Строка(РабочаяДата()));
Данные
.УстановитьАтрибут("Оператор",ИмяПользователя());


//И создади две основные ветви Справочники и Документы
Справочники=Данные.СоздатьПодчиненныйЭлемент("Справочники");
Документы=Данные.СоздатьПодчиненныйЭлемент("Документы");
 

// в общей ветке Справочники создадим ветку для справочника Контрагентов
Клиенты=Справочники.СоздатьПодчиненныйЭлемент("Клиенты");


//А вот так заполняются элементы для справочников. Каждый реквизит справочника выносится в отдельный элемент дерева. Т.к. в данном задании выбрана схема синхронизации справочника Контрагентов по ИНН, то в значение элемента записываем ИНН, а для наглядности в атрибут элемента заносим наименование клиента
К=СписокКлиентов.ПолучитьЗначение(х);
Состояние(
"Выгружаются сведения по: " +К.Наименование);
Клиент=Клиенты.СоздатьПодчиненныйЭлемент("Клиент");
Клиент.УстановитьАтрибут("Наименование",К.Наименование);
Клиент.Значение=К.ИНН;

 

// выгружаем все нужные реквизиты контрагента
ПН=Клиент.СоздатьПодчиненныйЭлемент("ПолнНаименование");
ПН.Значение=К.ПолнНаименование;
ВК=Клиент.СоздатьПодчиненныйЭлемент("ВидКонтрагента");
ВК.Значение=К.ВидКонтрагента.Идентификатор();

 

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

// Завершающие шаги и сохранение файла
ИмяФайла= СтрЗаменить(Строка(ДатаВыгрузки)+Строка(ДатаВыгрузки1),".","") + ".xml";
ПапкаФайла= "C:\1C\Change\Sweet\";
Корень.Записать(ПапкаФайла+ИмяФайла);



Чтение данных. 


В первой части статьи были рассмотрены простейшие приемы работы по созданию XML-документа. В этой части будут описаны способы получения данных. Основным моментом, на который я хотел бы обратить Ваше внимание, является следующее правило: сперва с помощью методов .ВыбратьУзел() или .ВыбратьУзлы() производится выборка узла/элемента, а затем с помощью методов соответственно .ПолучитьПодчиненныйПоНомеру() и .ПолучитьУзел() обеспечивается непосредственный доступ к узлам/элементам документа. Впрочем, здесь можно провести аналогию работы со справочниками и документами в 1С: сначала делаем выборку с помощью .ВыбратьЭлементы() или .ВыбратьДокументы(), а затем получаем сами объекты .ПолучитьЭлемент() или ПолучитьДокумент(). Оба приема используются в данном примере. Код с пояснениями:

Инициализацию компоненты опустим. Для чтения она ничем не отличается.
//создадим объект для доступа к xml-файлу, загрузим в него файл и получим ссылку на корневой элемент xml-документа. Напомню, что у нас он назван "Данные"
ФайлДанных=Анализатор.СоздатьДокумент();
ФайлДанных.Загрузить(ФайлЭксп);
ВсеУзлы=ФайлДанных.ВыбратьУзлы("Данные");


// получаем доступ к корневому узлу/элементу и читаем его атрибутыДанные=ВсеУзлы.ПолучитьУзел(0);
Сообщить(
"Идет загрузка данных из базы: " +Данные.ПолучитьАтрибут("ИБ"));
Сообщить(
"Выгрузка производилась: " +Данные.ПолучитьАтрибут("Дата"));
Сообщить(
"Выгрузку произвел/произвела: " +Данные.ПолучитьАтрибут("Оператор"));


// следующими операторами мы получаем доступ к двум основным ветвям: ветки Справочники и ветке Клиенты
Справочники=Данные.ВыбратьУзел("Справочники");
Документы=Данные.ВыбратьУзел("Документы");


// "спускаемся" по иерархии глубже и получаем доступ к элементу Клиенты, Выписки и Приходники
Клиенты=Справочники.ВыбратьУзел("Клиенты");
Выписки=Документы.ВыбратьУзел("Выписки");
Приходники=Документы.ВыбратьУзел("Приходники");


//если очень интересно сколько прийдется загружать Контрагентов, то можно воспользоваться следующей конструкцией 

Сообщить("Количество клиентов: " + Строка(Клиенты.КоличествоПодчиненных()));

// организация перебора всех элементов узла Клиенты
Для х= 1 ПоКлиенты.КоличествоПодчиненных() Цикл
     Клиент=Клиенты.ПолучитьПодчиненныйПоНомеру(х);
     ИНН=Клиент.Значение;
     Если ПустоеЗначение(ИНН) = 1 Тогда
          Сообщить(
"Ошибка. В файле выгрузки не задан ИНН клиента " +Клиент.ПолучитьАтрибут("Наименование"),"!!");
     Продолжить; 

     КонецЕсли;
КонецЦикла;



понедельник, 20 июля 2009 г.

Возникают проблемы с обработками 1С 7.7, использующими парсер XML или со службой А+Сервер

Ошибки возникают в нескольких случаях
Например, выгрузка регламентированных отчетов в формат XML. (Ошибка: Ошибочное определение для корневого элемента в схеме.")
Выгрузка/загрузка данных 1С<>КПК (вообще не работает обмен данными)
Бывают и другие, более экзотические.

Но в любом случае - виновник - парсер XML :-)

Обычно требуется установить более новую версию парсера msxml.
Установочный файл - ищем в интернете за 5 минут и инсталлируем.

В некоторых случаях простой установки недостаточно.
Тогда нужно отменить регистрацию msxml3.dll и зарегистрировать msxml4.dll.
Для этого нужно в командной строке Windows (Пуск -> Выполнить) прописать 2 команды:
regsvr32 /u msxml3.dll
regsvr32 msxml4.dll

Иногда 4 версия парсера не подходит (например, в случае с ПО Агент+Сервер), и надо поставить последний сервис-пак для 3-й версии, отменив регистрацию 4-го.