четверг, 3 октября 2013 г.

1с 7.7: Пример выгрузки номенклатуры в xml

1с выгрузка номенклатуры в xml.

Пример выгрузки номенклатуры Из 1с 7.7 в xml.

Пример чтения xml из 1с 8.2 можно глянуть Здесь
 
перем СпрНом;
Перем XMLАнализатор;
//*******************************************
Процедура Сформировать()
    Если ПустаяСтрока(Файл)=1 Тогда
        Предупреждение("Не указан файл для выгрузки!");
        Возврат;
    КонецЕсли;
   

    СпрШк = СоздатьОбъект("Справочник.ШтрихКоды");
    СпрЦ = СоздатьОбъект("Справочник.Цены");
    СпрН = СоздатьОбъект("Справочник.НормыРасходов");
    сч=0;
    ИмяФайла = Файл;
    ХМЛФайлДанных    =    XMLАнализатор.СоздатьПоследовательноЗаписываемыйДокумент();   
    ХМЛФайлДанных.ИмяФайла = ИмяФайла;
   
    Тз = СоздатьОбъект("ТаблицаЗначений");
    Тз.НоваяКолонка("Эл");
    Тз.НоваяКолонка("Порядок","число");
   
    МинУровень=1000;
    для сч_=1 по Список.РазмерСписка() Цикл
        Тз.НоваяСтрока();
        Тз.Эл = Список.ПолучитьЗначение(сч_);
        Тз.Порядок = Тз.Эл.уровень();
        МинУровень=Мин(МинУровень,Тз.Эл.уровень());
    КонецЦикла;
   
    ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("КолЭлементов",Список.РазмерСписка());
    ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("МинУровень",МинУровень);
    ХМЛФайлДанных.ОткрытьЭлемент("Элементы");       
   
    Тз.Сортировать("Порядок");
   
    сч=0;
   
    Тз.ВыбратьСтроки();
    Пока Тз.ПолучитьСтроку() = 1 Цикл
       
        сч=сч+1;
        Состояние(Строка(сч));       
       
        Эл = Тз.Эл;
       
        ХМЛФайлДанных.АтрибутыЭлемента.УдалитьВсе();
       
        ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("Имя",СокрЛП(Эл.Наименование));
        ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("ЭтоГруппа",Эл.ЭтоГруппа());
        ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("ИмяП",СокрЛП(Эл.ПолнНаименование));
        ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("ВидНом",сокрлп(Эл.ВидНоменклатуры));
        ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("Вн",ЗначениеВСтрокуВнутр(Эл));
        ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("Уровень",Эл.Уровень());
       
        ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("Еи",Эл.ЕдиницаИзмерения.Код);
               
        ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("СтНдс",строка(Эл.СтавкаНДС.Получить(ТекущаяДата()).Ставка));
        ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("Артикул",СокрЛП(Эл.Артикул));
        ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("ИмяР",СокрЛП(Эл.Родитель.Наименование));
       
        ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("ВесБрутто",Эл.ВесБрутто);
        ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("ВесНетто",Эл.ВесНетто);
        ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("Высота",Строка(Эл.Высота));
        ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("Длина",Строка(Эл.Длинна));
                               
        ХМЛФайлДанных.ОткрытьЭлемент("Элемент");       
       
       
        СпрШк.ИспользоватьВладельца(Эл);
        СпрШк.ВыбратьЭлементы();
        Пока СпрШк.ПолучитьЭлемент() = 1 Цикл
            ХМЛФайлДанных.АтрибутыЭлемента.УдалитьВсе();
       
            ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("ШкСтр",строка(СпрШк.ШтрихКод));
            ХМЛФайлДанных.ОткрытьЭлемент("Шк");
            ХМЛФайлДанных.ЗакрытьЭлемент();//Шк
        КонецЦикла;
       
        СпрЦ.ИспользоватьВладельца(эл);
        СпрЦ.ВыбратьЭлементы();
        Пока СпрЦ.ПолучитьЭлемент() = 1 Цикл
            ХМЛФайлДанных.АтрибутыЭлемента.УдалитьВсе();
       
            ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("Цена",строка(СпрЦ.Цена.Получить(ТекущаяДата())));
            ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("ТипЦены",СокрЛП(СпрЦ.ТипЦен.Наименование));
            ХМЛФайлДанных.ОткрытьЭлемент("Цены");
            ХМЛФайлДанных.ЗакрытьЭлемент();//Шк
        КонецЦикла;
       
        Спрн.ИспользоватьВладельца(эл);
        СпрН.ВыбратьЭлементы();
        Пока СпрН.ПолучитьЭлемент() = 1 Цикл
            ХМЛФайлДанных.АтрибутыЭлемента.УдалитьВсе();
       
            ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("Номенклат",СокрЛП(СпрН.Элемент.Наименование));
            ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("Норм",СпрН.Норма.Получить(ТекущаяДата()));
            ХМЛФайлДанных.АтрибутыЭлемента.УстановитьАтрибут("КолПрод",СпрН.КолПрод.Получить(ТекущаяДата()));
            ХМЛФайлДанных.ОткрытьЭлемент("Норма");
            ХМЛФайлДанных.ЗакрытьЭлемент();//Нормы
        КонецЦикла;
       
        ХМЛФайлДанных.ЗакрытьЭлемент();//Элемент
       
        Если сч % 1000 = 0 Тогда
            Состояние(Строка(сч));
            ХМЛФайлДанных.Сбросить();
        КонецЕсли;   
       
       
    КонецЦикла;       
   
    ХМЛФайлДанных.ЗакрытьЭлемент();//ЭлементЫ
    ХМЛФайлДанных.Завершить();
   
    Предупреждение("Готово",20);
КонецПроцедуры

//======================================================================
Процедура обработкаПодбора(Эл)
    Если Эл.ЭтоГруппа()=1 Тогда
        Если Список.НайтиЗначение(Эл)=0 Тогда
            Список.ДобавитьЗначение(Эл);
        КонецЕсли;
        СпрНом.ИспользоватьРодителя(Эл);
        СпрНом.ВыбратьЭлементы();
        Пока СпрНом.ПолучитьЭлемент() = 1 Цикл
            Если СпрНом.ПометкаУдаления()=1 Тогда
                Продолжить;
            КонецЕсли;
            Если Список.НайтиЗначение(СпрНом.ТекущийЭлемент())=0 Тогда
                Список.ДобавитьЗначение(СпрНом.ТекущийЭлемент());
            КонецЕсли;
        КонецЦикла;
    Иначе
        Если Список.НайтиЗначение(Эл)=0 Тогда
            Список.ДобавитьЗначение(Эл);
        КонецЕсли;
    КонецЕсли;
    Форма.Отобрано.Заголовок("К выгрузке(включая группы):"+Строка(Список.РазмерСписка()));
КонецПроцедуры //

//======================================================================
Процедура Подобрать()
    Перем НовЗнач;
    ОткрытьПодбор("Справочник.Номенклатура","Основная",НовЗнач,1);
    НовЗнач.ВыборГруппы(1);
КонецПроцедуры // Подобрать

//======================================================================
Процедура Удалить()
    ТекЗн = Список.ТекущаяСтрока();
    Если ПустоеЗначение(ТекЗн)=1 Тогда
        Возврат;
    КонецЕсли;
    Если Вопрос("Удалить строку?","Да+Нет")="Нет" Тогда
        Возврат;
    КонецЕсли;
    Список.УдалитьЗначение(ТекЗн);
    Форма.Отобрано.Заголовок("К выгрузке(включая группы):"+Строка(Список.РазмерСписка()));
КонецПроцедуры // Удалить

Функция НайтиПервыйСуществующийФайл(СписокВозможныхМест)
   
    Для Сч = 1 По СписокВозможныхМест.РазмерСписка() Цикл
        ПолноеИмя    =    СписокВозможныхМест.ПолучитьЗначение(Сч);
        Если Фс.СуществуетФайл(ПолноеИмя) = 1 Тогда    Возврат(ПолноеИмя)    КонецЕсли;
    КонецЦикла;
   
    Возврат("");
   
КонецФункции

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

//======================================================================
Процедура Выбрать()
    ИмяФайла="";
    Каталог="";
    Если ФС.ВыбратьФайл(1,ИмяФайла,Каталог,"Укажите файл для сохранения данных","*.xml|*.xml")=1 Тогда
        Файл = СокрЛП(Каталог)+СокрЛП(ИмяФайла);
    КонецЕсли;
КонецПроцедуры // Выбрать

//======================================================================
Процедура ОткрытьЭл()
    ТекСтр = Список.ТекущаяСтрока();
    ТекЗн = Список.ПолучитьЗначение(ТекСтр);
    Если ПустоеЗначение(ТекЗн)=1 Тогда
        Возврат;
    КонецЕсли;
    ОткрытьФорму(ТекЗн);
КонецПроцедуры // ОткрытьЭл