Помогите пожалуйста прочитать ошибки

Данный код должен позволять читать xml файла данного вида

```1c
    <?xml version="1.0" encoding="UTF-8"?>
    <Root>
    <RegContr>
    <Contr SNAME="Орг1" INN=" 7802115256 " KPP="781001001"/>
    <Contr SNAME="Орг2" INN=" 7801458148 " KPP="781401001"/>
    <Contr SNAME="Орг3" INN=" 7816103797 " KPP="781601001"/>
    <Contr SNAME="Орг4" INN=" 7801196693 " KPP="781401001"/>
    <Contr SNAME="Орг5" INN=" 7813412980 " KPP="781301001"/>
    <Contr SNAME="Орг6" INN=" 7805507043 " KPP="783801001"/>
    </RegContr>
    </Root>
```

вот код:

```1c
    Процедура ПрочестьИз("D:\Work\User\Desktop\postav.xml")
    // Разбор документа через DOM (document object model)
    // https://ru.wikipedia.org/wiki/Document_Object_Model

    // Разбираем файл test.xml, ссылка на его скачивание выше.

    Парсер = Новый ЧтениеXML;
    Парсер.ОткрытьФайл("D:\Work\User\Desktop\postav.xml");

    Построитель = Новый ПостроительDOM;

    Документ = Построитель.Прочитать(Парсер);

    Для Каждого Элемент0 Из Документ.ЭлементДокумента.ДочерниеУзлы Цикл
    Если Элемент0.ИмяУзла = "Contr" Тогда
    Название = Элемент0;

    Название = Contr.Атрибуты.ПолучитьИменованныйЭлемент("SNAME");
    Если Название <> Неопределено Тогда
    Сообщить("== " + Название.Значение + " ==");
    КонецЕсли;

    Численность = Contr.Атрибуты.ПолучитьИменованныйЭлемент("INN");
    Если ИНН <> Неопределено Тогда
    Сообщить("INN: " + ИНН.Значение);
    КонецЕсли;

    КПП = Contr.Атрибуты.ПолучитьИменованныйЭлемент("KPP");
    Если КПП <> Неопределено Тогда
    Сообщить("KPP: " + КПП.Значение);
    КонецЕсли;

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

    Парсер.Закрыть();
    КонецПроцедуры
```

вот ошибки:

{Справочник.Поставщики.Форма.Поставщики.Форма(142,22)}: Ожидается имя формального параметра
Процедура ПрочестьИз(<<?>>\D:\Work\User\Desktop\postav.xml\) (Проверка: Сервер)
{Справочник.Поставщики.Форма.Поставщики.Форма(142,22)}: Ожидается имя формального параметра
Процедура ПрочестьИз(<<?>>\D:\Work\User\Desktop\postav.xml\) (Проверка: Тонкий клиент)
---
Переменная Contr нигде не определяется.

А вообще, читать XML построителем DOM - суета. Через XDTO читайте.

```1c
    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(ИмяФайла);
    ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
    Для каждого Contr Из ОбъектXDTO.RegContr.Contr Цикл
    Сообщить("ИНН: " + Contr.INN);
    Сообщить("КПП: " + Contr.KPP);
    Сообщить("Наименование: " + Contr.SNAME);
    КонецЦикла;
```
---
Нет, так:

```1c
    Для каждого Contr Из ОбъектXDTO.RegContr.Contr Цикл

    НовыйЭлемент = Справочники.Поставщики.СоздатьЭлемент();
    НовыйЭлемент.Наименование = Contr.SNAME;
    НовыйЭлемент.ИНН = Contr.INN;
    НовыйЭлемент.КПП = Contr.KPP;

    НовыйЭлемент.Записать();

    КонецЦикла;
```
---
примерно так:

```1c
    Если Справочники.Поставщики.НайтиПоРеквизиту("ИНН", Contr.INN).Пустая() Тогда
    //создаем элемент
```
---
Можно вытащить на форму реквизит с типом Справочник.Поставщики и выбрать группу там (так надежнее) или сделать так:

```1c
    //до цикла чтения и создания поставщиков

    Группа = Справочники.Поставщики.НайтиПоНаименованию("Главные");//если в справочнике только один элемент с этим названием

    .....

    //в цикле чтения и создания

    ....
    НовыйЭлемент.ИНН = Contr.INN;
    НовыйЭлемент.Родитель = Группа;
```
---
Процедуре нужно передавать в параметрах переменные, а вы передаете литерал. В ошибке же написано: ожидается имя формального параметра.
---
Я сделал так: Процедура ПрочестьИз(ПутьКФайлу)

пошли такие ошибки, подскажите пожалуйста, где их определять нужно?

{Справочник.Поставщики.Форма.Поставщики.Форма(159,24)}: Переменная не определена (Contr)
            Название = <<?>>Contr.Атрибуты.ПолучитьИменованныйЭлемент("SNAME"); (Проверка: Сервер)
{Справочник.Поставщики.Форма.Поставщики.Форма(164,27)}: Переменная не определена (Contr)
            Численность = <<?>>Contr.Атрибуты.ПолучитьИменованныйЭлемент("INN"); (Проверка: Сервер)
{Справочник.Поставщики.Форма.Поставщики.Форма(169,19)}: Переменная не определена (Contr)
            КПП = <<?>>Contr.Атрибуты.ПолучитьИменованныйЭлемент("KPP"); (Проверка: Сервер)
{Справочник.Поставщики.Форма.Поставщики.Форма(165,18)}: Переменная не определена (ИНН)
            Если <<?>>ИНН <> Неопределено Тогда (Проверка: Сервер)
{Справочник.Поставщики.Форма.Поставщики.Форма(166,36)}: Переменная не определена (ИНН)
                Сообщить("INN: " + <<?>>ИНН.Значение); (Проверка: Сервер)
---
Переменная Contr нигде не определяется.

А вообще, читать XML построителем DOM - суета. Через XDTO читайте.

```1c
    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(ИмяФайла);
    ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
    Для каждого Contr Из ОбъектXDTO.RegContr.Contr Цикл
    Сообщить("ИНН: " + Contr.INN);
    Сообщить("КПП: " + Contr.KPP);
    Сообщить("Наименование: " + Contr.SNAME);
    КонецЦикла;
```
---
Спасибо, но не читает к сожалению
---
Так, извиняюсь, я туплю, а Ваш пример создает элемент в справочнике?
---
код из (4) ничего не создает - просто пишет сообщения пользователю. Но читать должен.
---
А если записать теперь в справочник нужно сделать так?

```1c
    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл("D:\Work\User\Desktop\postav.xml");
    ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
    Для каждого Contr Из ОбъектXDTO.RegContr.Contr Цикл

    Сообщить("ИНН: " + Contr.INN);
    Сообщить("КПП: " + Contr.KPP);
    Сообщить("Наименование: " + Contr.SNAME);

    НовыйЭлемент = Справочники.Поставщики.СоздатьЭлемент();
    НовыйЭлемент.Наименование = USNAME;
    НовыйЭлемент.ИНН = INN;
    НовыйЭлемент.КПП = KPP;

    НовыйЭлемент.Записать();

    КонецЦикла;
```
---
Нет, так:

```1c
    Для каждого Contr Из ОбъектXDTO.RegContr.Contr Цикл

    НовыйЭлемент = Справочники.Поставщики.СоздатьЭлемент();
    НовыйЭлемент.Наименование = Contr.SNAME;
    НовыйЭлемент.ИНН = Contr.INN;
    НовыйЭлемент.КПП = Contr.KPP;

    НовыйЭлемент.Записать();

    КонецЦикла;
```
---
Сделал так, чтобы можно было не определенный файл читать, а именно выбирать из компа и благодаря Вам получилось. Вы гений!

Сделал так:

```1c
    &НаКлиенте
    Процедура ПрочестьИз(Команда)

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

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

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

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

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

    //XML

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

    ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
    Для каждого Contr Из ОбъектXDTO.RegContr.Contr Цикл

    НовыйЭлемент = Справочники.Поставщики.СоздатьЭлемент();
    НовыйЭлемент.Наименование = Contr.SNAME;
    НовыйЭлемент.ИНН = Contr.INN;
    НовыйЭлемент.КПП = Contr.KPP;

    НовыйЭлемент.Записать();
    КонецЦикла;

    КонецПроцедуры
```
---
Ну что вы, я только учусь)

Единственно - этот код не будет работать если клиентский комп и сервер - разные машины.
---
А если файл будет браться с сервера?
---
тогда на клиентском компе выбрать его не получится - надо будет как-то по-другому указывать путь. Если все-таки выбирать на клиенте - можно или передавать на сервер текст, содержащийся в xml-файле, там через текстовый документ сохранять его во временный файл и его открывать или класть двоичные данные файла во временное хранилище, вытаскивать их из него на сервере и опять-таки сохранять во временный файл.
---
а зачем для фабрики нужен файл? Оно принимает ЧтениеXML, которому можно сказауть Установитьстроку()...
---
а, логично)
---
Добавил условие если значение заполнено, а как правильно добавить условие если элемент уже есть в справочнике, то есть сравнивая по ИНН?
---
примерно так:

```1c
    Если Справочники.Поставщики.НайтиПоРеквизиту("ИНН", Contr.INN).Пустая() Тогда
    //создаем элемент
```
---
Это я сделал так

```1c
    Если ЗначениеЗаполнено(Contr.INN) Тогда
    //Создаем элемент
```

А сделать если Contr.INN = с тем что есть в справочнике, то его не добавлять.
---
в (19) про это и написано.
---
Всё, понял! Спасибо. Ты реально гений.
---
Последнее, тут при экспорте код работает все нормально, но даже при работе просто так выдает ошибку

вот код:

```1c
    //ЭКСПОРТ

    &НаКлиенте
    Процедура ЭкспортФайлик(Команда)
    Запись = Новый ЗаписьXML;

    Запись.ОткрытьФайл("D:\Work\User\Desktop\doc.xml");

    Запись.ЗаписатьОбъявлениеXML();

    Запись.ЗаписатьНачалоЭлемента("Root");
    Запись.ЗаписатьНачалоЭлемента("RegContr");

    Выборка = Справочники.Поставщики.Выбрать();
    Пока Выборка.Следующий() Цикл

    Запись.ЗаписатьНачалоЭлемента("Contr");

    Запись.ЗаписатьАтрибут("SNAME",Строка(Выборка.Наименование));
    Запись.ЗаписатьАтрибут("INN",Строка(Выборка.ИНН));
    Запись.ЗаписатьАтрибут("KPP",Строка(Выборка.КПП));

    Запись.ЗаписатьКонецЭлемента();

    КонецЦикла;

    Запись.ЗаписатьКонецЭлемента();
    Запись.ЗаписатьКонецЭлемента();

    Запись.Закрыть();

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

А вот ошибка:
{Справочник.Поставщики.Форма.Поставщики.Форма(90,12)}: Переменная не определена (Справочники)
 Выборка = <<?>>Справочники.Поставщики.Выбрать(); (Проверка: Тонкий клиент)
{Справочник.Поставщики.Форма.Поставщики.Форма(167,12)}: Переменная не определена (Справочники)
 Выборка = <<?>>Справочники.Поставщики.Выбрать(); (Проверка: Тонкий клиент)
---
Справочники недоступны на клиенте. Запись надо формировать на сервере, ну так примерно.
---
не создает, как и код в (1). Он просто показывает, как достучаться до значений в файле XML. А "не читает" - это что значит? Файл XML с текстом из (1) прочитался на ура.
---
И снова привет, слушай, а если нужно это все записать в определенную группу "Главные" в справочнике "Поставщики", я уже все перепробовал, вообще не получается.
---
Можно вытащить на форму реквизит с типом Справочник.Поставщики и выбрать группу там (так надежнее) или сделать так:

```1c
    //до цикла чтения и создания поставщиков

    Группа = Справочники.Поставщики.НайтиПоНаименованию("Главные");//если в справочнике только один элемент с этим названием

    .....

    //в цикле чтения и создания

    ....
    НовыйЭлемент.ИНН = Contr.INN;
    НовыйЭлемент.Родитель = Группа;
```
---
Оказывается так все просто, а я огромные коды смотрю, где всякие поиски по коду и тд, вообще жесть.
---
молодой ишшо, я тоже поначалу огороды городил)
---
А ты сталкивался с таким, что 2 файла xml в одном файле содержатся поставщики, которые должны относиться к Группе "Главные" а во втором файле содержатся поставщики, которые относятся к группе "Второстепенные"?. Если выбран файлик Главные, то в группу "Главные", а если Второстепенные, то в группу "Второстепенные"?
---
Я вообще с загрузкой сталкивался постольку-поскольку. Значит, тебе стопудово надо вешать на форму реквизит, в котором выбирается группа, в которую нужно писать поставщиков. К тому, чтобы поиск группы прописывать в коде, я (и не только я) отношусь очень отрицательно, потому что завтра-послезавтра этих групп могут нашлепать еще тридцать штук. В общем, вешаешь на форму реквизит, выбираешь группу - грузишь файл. Выбираешь другую группу - грузишь другой файл.
---
Просто напиши возможно ли такое вообще, задача жесткая.

Представим есть файл счета.xml в котором хранятся все данные о контрагентах поставщики и номер счета. добавляем в справочник "Счета", в котором табличная часть - ссылается на справочник "Поставщики", при этом идет функция считывания данных о поставщиках в справочнике "поставщики" и если в файле будет например, Наименование - заполнено, ИНН - заполнено, а в справочнике 1с будет тот же поставщик, но Наименование - заполнено, ИНН - не заполнено, то в справочнике не создается новый элемент, а реквизит ИНН добавляется в уже созданный элемент.
---
Конечно, возможно)
---
учителя просто издеваются. Всего лишь на бухгалтеров учимся, а тут такое. Ну если что, сможешь помогать? А то мне уже не по себе от того сколько ты мне помог
---
да обращайся.
---
Все так, если элементов Contr больше одного.