Имя: Пароль:
   
1C
 
1C подскажите идею, как разбить результат запроса или выгрузку
0 ig0z
 
09.12.18
20:47
Произвожу выгрузку из одной базы XML, а именно завис на регистрах
есть очень большими регистры на которых не хватает памяти, а построчно нет желания переносить десятки миллионы записей (по итогам и срезам)

формирую выгрузку из запроса, удаляю и переименовываю столбец Регистратор (подменяю на корректировку), гружу в набор записей дальше  гружу в XML

только нужно как-то разбить на несколько запросов или саму выгрузку, но ничего в голову нелезет и найти не могу

как разбить??
1 ig0z
 
09.12.18
20:52
// Ошибок это не до конца переделанный шаблон

    
    Для Каждого РегСве Из Метаданные.РегистрыСведений Цикл
        
        НомерФайла             = 0;
        НомерОбъекта         = 0;
        СквознаяНумирация     = 0;
        НовыйФайл             = Истина;        
        
        ДатаНачала = ТекущаяДата();
        //НачатьТранзакцию();
        
        Запрос = Новый Запрос;
        Если РегСве.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический
            И РегСве.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый  Тогда
            Запрос.Текст = "ВЫБРАТЬ * ИЗ РегистрСведений."+РегСве.Имя+" КАК Р";    
        Иначе
            //ig0z - удалть коноку регистратор, и заменить на корректировку
            ЗапросРег = "";
            ПериоРег = "";
            Если РегСве.РежимЗаписи <> Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый Тогда
                ДокРег = Документы.КорректировкаЗаписейРегистров.СоздатьДокумент();
                ДокРег.Комментарий = "Перенос остатков: " + РегСве.Имя;
                ДокРег.Дата = ДатаСверткиИБ;
                                
                Попытка
                    ДокРег.Записать(РежимЗаписиДокумента.Запись);
                Исключение
                    Сообщить(ДокРег.Комментарий + " ошибка: " + ОписаниеОшибки());
                КонецПопытки;
                
                ЗапросРег = ", &РегистраторКор ";                 
            КонецЕсли;        
            
            Если РегСве.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда
                ПериоРег = ".СрезПоследних(&Период, )";
                Запрос.УстановитьПараметр("Период", ДатаСверткиИБ);
            КонецЕсли;
            
            Запрос.Текст = "ВЫБРАТЬ *"+ЗапросРег+" ИЗ РегистрСведений."+РегСве.Имя + ПериоРег + " КАК Р";        
            Запрос.УстановитьПараметр("РегистраторКор", ДокРег.Ссылка);
        КонецЕсли;
        
        Результат = Запрос.Выполнить();
        
        Если Результат.Пустой() Тогда
            Продолжить; // справочник пустой нахрен всё    
        КонецЕсли;
        
        Выгрузка = Результат.Выгрузить();
        ОбщееКол = Выгрузка.Количество();
                        
        нзВыгрузка = "";
        Выполнить("нзВыгрузка = РегистрыСведений."+РегСве.Имя+".СоздатьНаборЗаписей()");
        //нзВ = РегистрыСведений.ТелефонныеНомера.СоздатьНаборЗаписей();
            
        Если РегСве.РежимЗаписи <> Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый  Тогда
            Выгрузка.Колонки.Удалить("Регистратор");
            Выгрузка.Колонки.Найти("РегистраторКор").Имя = "Регистратор";
            нзВыгрузка.Отбор.Регистратор.Установить(ДокРег.Ссылка);
        КонецЕсли;
        
        нзВыгрузка.Загрузить(Выгрузка);
        
        //СозданиеФайлаXML("Справочник", Спрравочник.Имя, НомерФайла, НомерОбъекта, НовыйФайл, Объ, ЗаписьXML);             
        СозданиеФайлаXML("РегистрСведений", РегСве.Имя, 1, 1, Истина, нзВыгрузка, ЗаписьXML);
        Если РегСве.РежимЗаписи <> Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый  Тогда
            СозданиеФайлаXML("РегистрСведений", РегСве.Имя, 1, 1, Ложь, ДокРег.Ссылка.ПолучитьОбъект(), ЗаписьXML);    
        КонецЕсли;
                
        СостояниеДелПоВыгрузке(ОбщееКол, СквознаяНумирация, ДатаНачала);
        
        //начало да есть заебись, а завершение где
        ЗаписьXML.ЗаписатьКонецЭлемента(); //V8Exc:Data
        ЗаписьXML.ЗаписатьКонецЭлемента(); //V8Exc:_1CV8DtUD
        
        //ОтменитьТранзакцию();
    КонецЦикла;
2 H A D G E H O G s
 
09.12.18
20:59
Я бы поставил x64 и забыл бы о проблеме.
3 ig0z
 
09.12.18
21:00
(2) Что не знаю? это 64 ...
4 H A D G E H O G s
 
09.12.18
21:03
(3) Я вам не верю. Единственный вариант, когда может не хватить памяти - если вы будете закрывать xml в строку. Пишите xml сразу в файл, потом правьте заголовок в akelpad. Как я понимаю, эта выгрузка - разовая акция.
5 ig0z
 
09.12.18
21:27
(4) Действительно 86x, но нет админских прав поменять

сделал срез по каждому измерению, и за каким среднее удовлетворительное значение строк по этому отбору и выгружаю


// как-то так
    
    //начало да есть заебись, а завершение где
    Если НомерОбъекта > ОграничениеНаКоличествоОбъектовВXML Тогда
        ЗаписьXML.ЗаписатьКонецЭлемента(); //V8Exc:Data
        ЗаписьXML.ЗаписатьКонецЭлемента(); //V8Exc:_1CV8DtUD    
    КонецЕсли;
    
    
    Если НомерОбъекта > ОграничениеНаКоличествоОбъектовВXML ИЛИ НовыйФайл Тогда
        НовыйФайл         = Ложь;
        НомерФайла         = НомерФайла + 1;
        НомерОбъекта     = 0;

        ЗаписьXML = Новый ЗаписьXML;    
        ИмяФайла = СтрЗаменить(ПолеИмениФайла, ".xml", ТипТаб + "_" + ИмяТаблицы + "_" + НомерФайла + ".xml");
        ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8");
        ЗаписьXML.ЗаписатьОбъявлениеXML();
        ЗаписьXML.ЗаписатьНачалоЭлемента("_1CV8DtUD", "http://www.1c.ru/V8/1CV8DtUD/";);
        ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("V8Exch", "http://www.1c.ru/V8/1CV8DtUD/";);
        ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance";);
        ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8",  "http://v8.1c.ru/data";);
        ЗаписьXML.ЗаписатьНачалоЭлемента("V8Exch:Data");        
    КонецЕсли;
    
    
    Попытка
        
        //Если ТипТаб = "Справочник" Тогда
        //    ЗаписатьXML(ЗаписьXML, Объект);
        //ИначеЕсли ТипТаб = "РегистрСведений" Тогда
        ЗаписатьXML(ЗаписьXML, Объект);
        //КонецЕсли;        
    
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;