Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
02 окт 2022, 13:47

Обращение к процедуре объекта как к функции

Автор natanka123, 21 сен 2022, 16:13

0 Пользователей и 1 гость просматривают эту тему.

natanka123

Из регламентной задачи вызываю этот код:


Процедура ЗаписатьДанныеНаСервере()   Экспорт

ЧтениеXML=Новый ЧтениеXML;

Файл_XML=ЧтениеXML.ОткрытьФайл("D:\НоваяПапка\document.xml");

Для каждого СтрокаДанных Из Файл_XML Цикл

НайденныйКонтрагент = Справочники.Контрагенты.Найти(Число(СтрокаДанных.УНП), "УНП");//Справочники.Контрагенты.НайтиПоРеквизиту("УНП", Число(СтрокаДанных.УНП));
Если НайденныйКонтрагент <> Неопределено Тогда
Продолжить;
КонецЕсли;

НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйКонтрагент.Наименование = СтрокаДанных.Наименование;
НовыйКонтрагент.УНП = СтрокаДанных.УНП;
НовыйКонтрагент.ПолноеНаименование = СтрокаДанных.ПолноеНаименование;
НовыйКонтрагент.Записать();

КонецЦикла;

Сообщить("Создание контрагентов завершено!");

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


Получаю такую ошибку:

Обращение к процедуре объекта как к функции (ОткрытьФайл)
{ОбщийМодуль.РегЗад_загрузка.Модуль(5)}:Файл_XML=ЧтениеXML.ОткрытьФайл("D:\НоваяПапка\document.xml");

напишите пожалйста, что я делаю не правильно.

LexaK

natanka123, так не работает
    Файл_XML=ЧтениеXML.ОткрытьФайл("D:\НоваяПапка\document.xml");

попробуйте так

Процедура ЗаписатьДанныеНаСервере()   Экспорт
   
    ЧтениеXML=Новый ЧтениеXML;
   
    ЧтениеXML.ОткрытьФайл("D:\НоваяПапка\document.xml");
       
    //Для каждого СтрокаДанных Из Файл_XML Цикл
    Пока ЧтениеXML.Прочитать() Цикл

       //переделать под ЧтениеXML...
       
    КонецЦикла;
   
    Сообщить("Создание контрагентов завершено!");
   
КонецПроцедуры

если помогло нажмите: Спасибо!

natanka123

LexaK,

Сделала как Вы написали:


Процедура ЗаписатьДанныеНаСервере()   Экспорт
   
    ЧтениеXML=Новый ЧтениеXML;
   
    ЧтениеXML.ОткрытьФайл("D:\НоваяПапка\document.xml");
       
    Пока ЧтениеXML.Прочитать() Цикл
               
        НайденныйКонтрагент = Справочники.Контрагенты.Найти(Число(ЧтениеXML.УНП), "УНП");
        //ЧтениеXML.ЗначениеАтрибута("УНП");
        //Справочники.Контрагенты.НайтиПоРеквизиту("УНП", Число(ЧтениеXML.УНП));
        Если НайденныйКонтрагент <> Неопределено Тогда
            Продолжить;
        КонецЕсли;
       
        НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
        НовыйКонтрагент.Наименование = ЧтениеXML.Наименование;
        НовыйКонтрагент.УНП = ЧтениеXML.УНП;
        НовыйКонтрагент.ПолноеНаименование = ЧтениеXML.ПолноеНаименование;
        НовыйКонтрагент.Записать();
       
    КонецЦикла;
   
    Сообщить("Создание контрагентов завершено!");
   
КонецПроцедуры


теперь выдает такую ошибку:


Поле объекта не обнаружено (УНП)
{ОбщийМодуль.РегЗад_загрузка.Модуль(9)}:НайденныйКонтрагент = Справочники.Контрагенты.Найти(Число(ЧтениеXML.УНП), "УНП")



antoneus

Потому что у объекта ЧтениеXML нет свойства УНП. Чтобы обращаться к узлам по имени через точку, используйте ПрочитатьXML.

LexaK

natanka123, сильно зависит от того, что, какая структура ХМЛ файла!
вложите/присоедините сюда свой файл.
если помогло нажмите: Спасибо!

natanka123


antoneus

    ЧтениеXML=Новый ЧтениеXML;
   
    ЧтениеXML.ОткрытьФайл("D:\НоваяПапка\document.xml");

Результат = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
       
    Для каждого Элемент Из Результат.ЭлементСправочника Цикл
               
        НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту("УНП", Число(Элемент.УНП));
        //ЧтениеXML.ЗначениеАтрибута("УНП");
        //Справочники.Контрагенты.НайтиПоРеквизиту("УНП", Число(ЧтениеXML.УНП));
        Если НайденныйКонтрагент <> Неопределено Тогда
            Продолжить;
        КонецЕсли;
       
НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйКонтрагент.Наименование = Элемент.Наименование;
НовыйКонтрагент.УНП = Элемент.УНП;
НовыйКонтрагент.ПолноеНаименование = Элемент.ПолноеНаименование;
НовыйКонтрагент.Записать();
       
    КонецЦикла;

natanka123

antoneus,
не, не знаю что но все равно выдает такую ошибку:
Преобразование значения к типу Число не может быть выполнено
{ОбщийМодуль.РегЗад_загрузка.Модуль(10)}:НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту("УНП", Число(Элемент.УНП));

antoneus

Для каждого Элемент Из Результат.ЭлементСправочника Цикл
    Если ТипЗнч(Элемент.УНП) <> Тип("Строка") Тогда
        Продолжить
    КонецЕсли;

....

и там еще три унп = 0 у разных контров, еще бы обработку нуля добавить.

LexaK

natanka123, попробуйте такой код
    Пока лкЧтениеXML.Прочитать() Цикл
        лкДанные = ПолучитьДанные(лкЧтениеXML,"ЭлементСправочника");
        Если лкДанные <> Неопределено Тогда
            //получили данные
            Сообщить("УНП " + лкДанные.УНП + ", Наименование " + лкДанные.Наименование);
            Если лкДанные.УНП <> Неопределено Тогда
                //есть УНП
               
                НайденныйКонтрагент = Справочники.Контрагенты.Найти(Число(лкДанные.УНП), "УНП");
                //ЧтениеXML.ЗначениеАтрибута("УНП");
                //Справочники.Контрагенты.НайтиПоРеквизиту("УНП", Число(ЧтениеXML.УНП));
                Если НайденныйКонтрагент <> Неопределено Тогда
                    Продолжить;
                КонецЕсли;
               
                НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
                НовыйКонтрагент.Наименование = лкДанные.Наименование;
                НовыйКонтрагент.УНП = лкДанные.УНП;
                НовыйКонтрагент.ПолноеНаименование = лкДанные.ПолноеНаименование;
                НовыйКонтрагент.Записать();
           
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;

и в вашем модуле эту функцию добавьте

&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьДанные(лкЧтениеXML, ИмяЭлемента)
   
    лкДанные = Неопределено;
    Если лкЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента
        и лкЧтениеXML.ЛокальноеИмя = ИмяЭлемента Тогда
        лкДанные = Новый Структура;
        ИмяРек = "Реквизит";
        лкЗначение = Неопределено;
       
        Пока лкЧтениеXML.Прочитать() Цикл
           
            Если лкЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                //это имя реквизита
                ИмяРек = лкЧтениеXML.ЛокальноеИмя;
                лкЗначение = Неопределено;
            ИначеЕсли лкЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
                //получили значение реквизита
                лкЗначение = лкЧтениеXML.Значение;
            ИначеЕсли лкЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
                Если лкЧтениеXML.ЛокальноеИмя = ИмяРек Тогда
                    лкДанные.Вставить(ИмяРек, лкЗначение);
                ИначеЕсли лкЧтениеXML.ЛокальноеИмя = ИмяЭлемента Тогда
                    //дочитали до конца элемента
                    Прервать;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
   
    КонецЕсли;
   
    Возврат лкДанные;
   
КонецФункции
 
если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск