• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Как записать из Xml в справочник номенклатур?

  • Автор темы arrio
  • Дата начала
A

arrio

Есть шаблон для чтения произвольного xml файл (в нем 2 поля -код - значение). Мне нужно записать полученные данные в справочник Номенклатур? Какой код должен быть в коце для записи в Справочник.Номенклатура?
На экран я получаю выход вида:


--COL
--DATA
Текст:3249
--Конец:DATA
--Конец:COL
--COL
--DATA
Текст:11370
--Конец:DATA
--Конец:COL

На последние 2 строчки (если снимаю комментарии) мне выдает, что значение не является значением объектного типа Справочники..



ПутьКФайлу="d:\1C-Filemak\zak_elem.xml" ;
Чтение.ОткрытьФайл(ПутьКФайлу);
Пока Чтение.Прочитать() Цикл // Прочитать «структурные части» элементов.
// Проверить, какая часть элемента – текущая.
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ИмяУзла = Чтение.Имя;
Сообщить("--" + ИмяУзла);
// Атрибуты элементов можно читать только если текущая часть – начало элемента
Пока Чтение.ПрочитатьАтрибут() Цикл
// Прочитать данные узла атрибута.
ТипУзла = Чтение.ТипУзла;
Имя = Чтение.Имя;
Значение = Чтение.Значение;
КонецЦикла;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
Сообщить("Текст:" + Чтение.Значение);
// ЗагруженныйОбъект="Чтение.Значение";
// ЗагруженныйОбъект.Справочники.Номенклатура.Записать();
 
P

puh14

Гм. Чтение.Значение - это что, имя? Тогда примерно так

Спр = СоздатьОбъект("Справочник.Номенклатура");
Если Спр.НайтиПоНаименованию(Чтение.Значение,0) = 1 Тогда//Проверить, есть ли такой
Спр.Новый();
Спр.Наименование = Чтение.Значение;
Спр.Записать();
Иначе
Сообщить("Наименование "+ СокрЛП(Чтение.Наименование) +" присутствует в номенклатуре");
КонецЕсли;
кстати - не видно конца первого цикла.
ЗагруженыйОбъект - это что, переменная?
 
A

arrio

Гм. Чтение.Значение - это что, имя? Тогда примерно так

Спр = СоздатьОбъект("Справочник.Номенклатура");
Если Спр.НайтиПоНаименованию(Чтение.Значение,0) = 1 Тогда//Проверить, есть ли такой
Спр.Новый();
Спр.Наименование = Чтение.Значение;
Спр.Записать();
Иначе
Сообщить("Наименование "+ СокрЛП(Чтение.Наименование) +" присутствует в номенклатуре");
КонецЕсли;
кстати - не видно конца первого цикла.
ЗагруженыйОбъект - это что, переменная?

Да, ЗагруженныйОбъект - это переменная, и в ней я хочу видеть значения типа Текст:11370 и т.п.
А хачем мне создавать объект Справыочник.Номенклатура, если в конФИГУРАЦИИ итак уже есть Справочник.Нменклатура?
 
P

puh14

СоздатьОбъект() - это не создание справочника, а присвоение переменной Спр ссылки на объект конфигурации Справочник.Номенклатура.
Иначе получается, что ты пытаешся определить переменной непонятное свойство Справочники.Номенклатура - которого у него тупо нет - это ведь просто текст.
 
A

arrio

СоздатьОбъект() - это не создание справочника, а присвоение переменной Спр ссылки на объект конфигурации Справочник.Номенклатура.
Иначе получается, что ты пытаешся определить переменной непонятное свойство Справочники.Номенклатура - которого у него тупо нет - это ведь просто текст.
Спр = СоздатьОбъект("Справочник.Номенклатура");
Если Спр.НайтиПоНаименованию(Чтение.Значение,0) = 1 Тогда//Проверить, есть ли такой
Спр.Новый();
Спр.Наименование = Чтение.Значение;
Спр.Записать();
Иначе
Сообщить("Наименование "+ СокрЛП(Чтение.Наименование) +" присутствует в номенклатуре");
КонецЕсли;

Понятно. Спр - это ссылка.. Вставил этот код вместо последних двух комментариев - ошибка{ВнешняяОбработка.импортXML(30,9)}: Процедура или функция с указанным именем не определена (СоздатьОбъект)
Спр = <<?>>СоздатьОбъект("Справочник.Номенклатура");
 
A

arrio

скорее так:
Код:
Спр = Справочники.Номенклатура.СоздатьЭлемент();

это ж в0сьмерка, насколько я понял?

Ну да, 8.0. В итоге

// Прочитать данные узла атрибута.
ТипУзла = Чтение.ТипУзла;
Имя = Чтение.Имя;
Значение = Чтение.Значение;


Сообщить("Текст:" + Чтение.Значение);
Спр = Справочники.Номенклатура.СоздатьЭлемент();
ЗначениеРеквизита1=Имя.Значение;
ЗначениеРеквизита2=Чтение.Значение;
спр.Реквизит1 = ЗначениеРеквизита1;
спр.Реквизит2 = ЗначениеРеквизита2;
спр.Записать();

Выдает

{ВнешняяОбработка.импортXML(40)}: Значение не является значением объектного типа (Значение)
по причине:
{ВнешняяОбработка.импортXML(40)}: Значение не является значением объектного типа (Значение)
 
P

puh14

Пардон, я семерочник , подтупил малость :(
 
B

b00tch

ЗначениеРеквизита1=Имя.Значение;

переменная Имя не определена... либо Чтение.Имя, либо читать след. узел (если таковой есть) и присваивать его значение...
 
A

arrio

да, проблема в этом. уфф.... че-то получилось... итоговый код:

ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
// В примере просто выводим текст в окно сообщений.
Сообщить("Текст:" + Чтение.Значение);

Сообщить("Текст:" + Чтение.Значение);

Объект = Справочники.Номенклатура.СоздатьЭлемент();
Объект.Реквизит1 = Имя; //код номенклатуры
Объект.Реквизит2 = Значение; //значение
Объект.Записать();

правда, теперь в справочнике номенклатур где реквизит ИМЯ (реквизит1) у меня веззьде значение RecordID.
Подскажите, а какой код нужен, чтобы сделать проверку на наличие реквизита2 в справочнике номенклатур, и, если его там нет, то создание?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!