Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 18:00

Помогите написать обработку выгрузки в XML

Автор vidok, 12 янв 2011, 09:39

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

vidok

   Здравствуйте, такая задачка: УТ базовая 8.1. Две идентичные базы, нужно периодически обмениваться двумя документами: ПоступлениеТоваровУслуг и ОтчетОрозничныхПродажах.
    Планы обмена отпадают, да и у стандартной обработки- выгрузка/загрузка в XML долго идет инициализация при ее открытии и поэтому не очень подходит.
P.S. С документом необходимо выгружать номенклатуру и контрагентов.

Попытался с малого, выгрузить всю номенклатуру и документы за период:

Процедура Выгрузка(Элемент)     
ЗаписьXML=Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл("c:\document.xml");
    ЗаписьXML.ЗаписатьНачалоЭлемента("Главный");

Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий () Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Справочник");
ЗаписатьXML(ЗаписьXML, Выборка.ПолучитьОбъект());
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;

Выборка = Документы.ПоступлениеТоваровУслуг.Выбрать (ДатаС, ДатаПо);
Пока Выборка.Следующий () Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Документ");
ЗаписатьXML(ЗаписьXML, Выборка.ПолучитьОбъект());
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;

    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.Закрыть();
Сообщить("Выгружено");
КонецПроцедуры


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


создаю новую позицию и документ поступление - выгружаю - получаю сообщение:
У единицы хранения остатков номенклатуры "" неверно указан владелец!
У единицы для отчетов номенклатуры "" неверно указан владелец!

Помогите довести до ума обработку, подскажите что в ней нужно исправить\добавить

Klyacksa

При интерактивном создании элемента Номенклатуры, автоматически создаются элементы Единица хранения остатков и Единица для отчетов. Соответственно, когда идет программная запись номенклатуры во второй базе, то он не находит Единицы хранения остатков и отчетов.
Выход: Нужно перетаскивать вместе с номенклатурой еще и единицы хранения остатков и отчетов. Причем, при создании их в новой базе, придется записывать их хитро:

ОбъектНоменклатура.ОбменДанными.Загрузка=Истина;
ОбъектНоменклатура.Записать();
ОбъектЕдиницаХраненияОстатков.Владелец=ОбъектНоменклатура.Ссылка;
ОбъектЕдиницаХраненияОтчетов.Владелец=ОбъектНоменклатура.Ссылка;
ОбъектЕдиницаХраненияОстатков.Записать();
ОбъектЕдиницаХраненияОтчетов.Записать();


xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

vidok

Спасибо что откликнулись. Но как это применить в данной обработке?

Klyacksa

Ну как-то вот так:
Процедура Выгрузка(Элемент)     
    ЗаписьXML=Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл("c:\document.xml");
    ЗаписьXML.ЗаписатьНачалоЭлемента("Главный");
   
    Выборка = Справочники.Номенклатура.Выбрать();
    Пока Выборка.Следующий () Цикл
           ЗаписьXML.ЗаписатьНачалоЭлемента("Справочник");
           ЗаписатьXML(ЗаписьXML, Выборка.ПолучитьОбъект());
           ЗаписьXML.ЗаписатьКонецЭлемента();

           ЗаписьXML.ЗаписатьНачалоЭлемента("ЕдиницаХраненияОстатков");
           ЗаписатьXML(ЗаписьXML, Выборка.ЕдиницаХраненияОстатков.ПолучитьОбъект());
           ЗаписьXML.ЗаписатьКонецЭлемента();

           ЗаписьXML.ЗаписатьНачалоЭлемента("ЕдиницаДляОтчетов");
           ЗаписатьXML(ЗаписьXML, Выборка.ЕдиницаДляОтчетов.ПолучитьОбъект());
           ЗаписьXML.ЗаписатьКонецЭлемента();
    КонецЦикла;   
   
    Выборка = Документы.ПоступлениеТоваровУслуг.Выбрать (ДатаС, ДатаПо);
    Пока Выборка.Следующий () Цикл
        ЗаписьXML.ЗаписатьНачалоЭлемента("Документ");
        ЗаписатьXML(ЗаписьXML, Выборка.ПолучитьОбъект());
        ЗаписьXML.ЗаписатьКонецЭлемента();
    КонецЦикла;   
   
    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.Закрыть();
    Сообщить("Выгружено");   
КонецПроцедуры

Процедура Загрузка(Элемент) //загрузка номенклатуры
    ДанныеXML = Новый ЧтениеXML;
    ДанныеXML.ОткрытьФайл("c:\document.xml");
    Пока ДанныеXML.Прочитать() Цикл
    Пока ДанныеXML.Прочитать() Цикл
        Пока ДанныеXML.Прочитать() Цикл
               Если ВозможностьЧтенияXML(ДанныеXML) Тогда
                   НовыйОбъект = ПрочитатьXML(ДанныеXML); // пошел элемент Номенклатуры
               КонецЕсли;
               Если ВозможностьЧтенияXML(ДанныеXML) Тогда
                   ОбъектЕдиницыХраненияОстатков = ПрочитатьXML(ДанныеXML);
               КонецЕсли;
               Если ВозможностьЧтенияXML(ДанныеXML) Тогда
                   ОбъектЕдиницыДляОтчетов = ПрочитатьXML(ДанныеXML);
               КонецЕсли;
               
               // далее то, о  чем я писала - хитрая запись объектов
               НовыйОбъект.ОбменДанными.Загрузка=Истина;
               НовыйОбъект.Записать();

               ОбъектЕдиницыХраненияОстатков.Владелец=НовыйОбъект.Ссылка;
               ОбъектЕдиницыХраненияОстатков.Записать();

               ОбъектЕдиницыДляОтчетов.Владелец=НовыйОбъект.Ссылка;
               ОбъектЕдиницыДляОтчетов.Записать();
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
    ДанныеXML.Закрыть();
    Сообщить("Загружено");
КонецПроцедуры


Плюс, можно еще одну вложенность сделать - чтобы Номенклатура->Единица хранения остатков->Единица для отчетов были объединены, например, элементом "ГруппаОбъектов".

p.s. Могла накосячить в чтении объектов - проверить было негде.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

vidok

да, ругается на объекты, на оба. Как еще можно попробовать?

Klyacksa

xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Klyacksa

Процедура ОсновныеДействияФормыВыгрузить(Кнопка)
    ЗаписьXML=Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл("c:\document.xml");
    ЗаписьXML.ЗаписатьНачалоЭлемента("Главный");
   
    Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий () Цикл
ОбработкаПрерыванияПользователя();
                ЗаписьXML.ЗаписатьНачалоЭлемента("Справочник");
                ЗаписатьXML(ЗаписьXML, Выборка.ПолучитьОбъект());
                ЗаписьXML.ЗаписатьКонецЭлемента();

ЗаписьXML.ЗаписатьНачалоЭлемента("ГруппаОбъектов");

Если ЗначениеЗаполнено(Выборка.ЕдиницаХраненияОстатков) тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("ЕдиницаХраненияОстатков");
ЗаписатьXML(ЗаписьXML, Выборка.ЕдиницаХраненияОстатков.ПолучитьОбъект());
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;

Если ЗначениеЗаполнено(Выборка.ЕдиницаДляОтчетов) тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("ЕдиницаДляОтчетов");
ЗаписатьXML(ЗаписьXML, Выборка.ЕдиницаДляОтчетов.ПолучитьОбъект());
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;

ЗаписьXML.ЗаписатьКонецЭлемента();
    КонецЦикла;   
   
    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.Закрыть();
    Сообщить("Выгружено");   
КонецПроцедуры


Процедура КнопкаВыполнитьНажатие(Кнопка)
ДанныеXML = Новый ЧтениеXML;
ДанныеXML.ОткрытьФайл("c:\document.xml");
Пока ДанныеXML.Прочитать() Цикл
ОбработкаПрерыванияПользователя();
Пока ДанныеXML.Прочитать() Цикл
Пока ДанныеXML.Прочитать() Цикл
Пока ДанныеXML.Прочитать() Цикл
ОбработкаПрерыванияПользователя();
Если ВозможностьЧтенияXML(ДанныеXML) Тогда
НовыйОбъект = ПрочитатьXML(ДанныеXML); // пошел элемент Номенклатуры
НовыйОбъект.ОбменДанными.Загрузка=Истина;
НовыйОбъект.Записать();

Если ВозможностьЧтенияXML(ДанныеXML) Тогда
ОбъектЕдиницыХраненияОстатков = ПрочитатьXML(ДанныеXML);
ОбъектЕдиницыХраненияОстатков.Владелец=НовыйОбъект.Ссылка;
ОбъектЕдиницыХраненияОстатков.Записать();
КонецЕсли;

Если ВозможностьЧтенияXML(ДанныеXML) Тогда
ОбъектЕдиницыДляОтчетов = ПрочитатьXML(ДанныеXML);
ОбъектЕдиницыДляОтчетов.Владелец=НовыйОбъект.Ссылка;
ОбъектЕдиницыДляОтчетов.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЦикла;
ДанныеXML.Закрыть();
Сообщить("Загружено");
КонецПроцедуры
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Klyacksa

Соответвтенно, первая процедура - выгрузка, вторая - загрузка. Забыла переименовать.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Klyacksa

И последний дубль без опечаток  :nhsrm: :
Процедура Выгрузка(Кнопка)
    ЗаписьXML=Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл("c:\document.xml");
    ЗаписьXML.ЗаписатьНачалоЭлемента("Главный");
   
    Выборка = Справочники.Номенклатура.Выбрать(,,Новый Структура("Код","00000000143"));
Пока Выборка.Следующий () Цикл
ОбработкаПрерыванияПользователя();

ЗаписьXML.ЗаписатьНачалоЭлемента("ГруппаОбъектов");

ЗаписьXML.ЗаписатьНачалоЭлемента("Справочник");
        ЗаписатьXML(ЗаписьXML, Выборка.ПолучитьОбъект());
        ЗаписьXML.ЗаписатьКонецЭлемента();

Если ЗначениеЗаполнено(Выборка.ЕдиницаХраненияОстатков) тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("ЕдиницаХраненияОстатков");
ЗаписатьXML(ЗаписьXML, Выборка.ЕдиницаХраненияОстатков.ПолучитьОбъект());
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;

Если ЗначениеЗаполнено(Выборка.ЕдиницаДляОтчетов) тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("ЕдиницаДляОтчетов");
ЗаписатьXML(ЗаписьXML, Выборка.ЕдиницаДляОтчетов.ПолучитьОбъект());
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;

ЗаписьXML.ЗаписатьКонецЭлемента();
    КонецЦикла;   
   
    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.Закрыть();
    Сообщить("Выгружено");   
КонецПроцедуры

Процедура Загрузка(Кнопка)
ДанныеXML = Новый ЧтениеXML;
ДанныеXML.ОткрытьФайл("c:\document.xml");
Пока ДанныеXML.Прочитать() Цикл
ОбработкаПрерыванияПользователя();
Пока ДанныеXML.Прочитать() Цикл
Пока ДанныеXML.Прочитать() Цикл
ОбработкаПрерыванияПользователя();
Если ВозможностьЧтенияXML(ДанныеXML) Тогда
НовыйОбъект = ПрочитатьXML(ДанныеXML); // пошел элемент Номенклатуры
НовыйОбъект.ОбменДанными.Загрузка=Истина;
НовыйОбъект.Записать();

Если ВозможностьЧтенияXML(ДанныеXML) Тогда
ОбъектЕдиницыХраненияОстатков = ПрочитатьXML(ДанныеXML);
ОбъектЕдиницыХраненияОстатков.Владелец=НовыйОбъект.Ссылка;
ОбъектЕдиницыХраненияОстатков.Записать();
КонецЕсли;

Если ВозможностьЧтенияXML(ДанныеXML) Тогда
ОбъектЕдиницыДляОтчетов = ПрочитатьXML(ДанныеXML);
ОбъектЕдиницыДляОтчетов.Владелец=НовыйОбъект.Ссылка;
ОбъектЕдиницыДляОтчетов.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
ДанныеXML.Закрыть();
Сообщить("Загружено");
КонецПроцедуры
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

vidok

спасибо огромное!!! всё работает!!!

Теги:

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

Рейтинг@Mail.ru

Поиск