Оптимизация выгрузки из 1С 7.7 по правилам обмена большого объема данных

Публикация № 304008

Разработка - Обмен данными 1С - Перенос данных из 1С7.7 в 1C8.X

Недостаточно памяти для завершения операции

При выгрузке из 1С 7.7. большого справочника программа завершалась примерно с таким сообщением: "msxml6.dll: Недостаточно памяти для завершения операции". Вариант выгрузки порциями меня не устраивал. Поэтому немного оптимизировал обработку выгрузки. Возможно кому-то сэкономит время.

Конвертация данных хороший инструмент, которая позволяет быстро реализовать несложную перегрузку данных между различными базами 1С. С помощью конвертации данных реализованы перенос остатков из типовых конфигураций 1С 7.7 в типовые на базе 1С8.

Когда в очередной раз столкнулся с необходимостью переноса данных из 1С7.7 в 1С8, то столкнулся с проблемой. При выгрузке большого справочника (около 400 тыс. элементов. Все относительно конечно)  семерка вылетает с ошибкой «недостаточно памяти…» Проблема в том, что обработка выгрузки использует объектную модель DOM для работы с XML. В результате все дерево XML до записи в файл хранится в памяти. Также столкнулся с тем, что при выгрузке большого числа элементов, чем дольше работает выгрузка тем медленнее она работает.

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

Первая доработка. Возможность формирования файла xml большого размера. 

Доработка заключается в потоковой записи данных XML сразу в файл. На IS видел публикацию в которой автор писал, что использовал другой объект для работы с XML, но подход вроде такой же – запись сразу в файл.

Для потоковой записи в файл использую объект FileSystemObject Windows Script Host. Доработки следующие.

1.Добавить описание переменных

Перем ФСО; 
Перем ХМЛФайл;

2.Изменить процедуру Выгрузить()

Процедура Выгрузить()

    // Добавлено. Начало
    ФСО = СоздатьОбъект("Scripting.FileSystemObject");
    ХМЛФайл = ФСО.CreateTextFile(ИмяФайлаДанных, 1, 1);
    // Добавлено. Конец
        
    ВыполнитьВыгрузку();

    // Добавлено. Начало
    ХМЛФайл.Close();
    // Добавлено. Конец
    
    Если Форма.МодальныйРежим() = 0 Тогда
        //Предупреждение("Выгрузка данных завершена.");
        Сообщить("Выгрузка данных завершена.");
    Иначе
        Сообщить("Выгрузка данных завершена.");
    КонецЕсли;
    
    Форма.Параметр = СписокОшибок;
    
КонецПроцедуры // Выгрузить()

3.Изменить процедуру ВыгрузитьПоПравилу()
Весь текст процедуры не пишу.  Изменения ближе к концу процедуры

Функция ВыгрузитьПоПравилу(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО = "", УзелСсылки = "", ТолькоПолучитьУзелСсылки = 0,
    НомерПКО = 0)
………………………………………………………………
    // Изменено. Начало
    // Запись объекта
    //ДобавитьПодчиненный(rootNode, Приемник);
    ХМЛФайл.WriteLine(Приемник.xml);
    // Изменено. Конец
    
    // Обработчик ПослеВыгрузкиВФайлОбмена
    Если ПолучитьРеквизитПКО(НомерПКО, "ПослеВыгрузкиВФайл") = 1 Тогда
        
        КодПравила = СокрЛП(ПолучитьРеквизитПКО(НомерПКО, "Код"));
        
        Отказ = Шаблон("[ПКО_ПослеВыгрузкиВФайлОбмена_" + КодПравила + "(Источник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО, Приемник, УзелСсылки)]");
        
        Если Число(Отказ) = 1 Тогда
            
            Возврат УзелСсылки;
            
        КонецЕсли;

    КонецЕсли;
    
    Возврат УзелСсылки;

КонецФункции // ВыгрузитьПоПравилу()

4.Изменить процедуру ИнициализацияФайлаОбмена()

Процедура ИнициализацияФайлаОбмена()
    
    УстановитьАтрибут(rootNode, "ВерсияФормата", "2.0");
    УстановитьАтрибут(rootNode, "ДатаВыгрузки",  ПолучитьДатуV8(ТекущаяДата(), ТекущееВремя()));
    УстановитьАтрибут(rootNode, "НачалоПериодаВыгрузки", ПолучитьДатуV8(ДатаНачала));
    УстановитьАтрибут(rootNode, "ОкончаниеПериодаВыгрузки", ПолучитьДатуV8(ДатаОкончания));
    УстановитьАтрибут(rootNode, "ИмяКонфигурацииИсточника", мКонфигурацияИсточник);
    УстановитьАтрибут(rootNode, "ИмяКонфигурацииПриемника", мКонфигурацияПриемник);
    УстановитьАтрибут(rootNode, "ИдПравилКонвертации", мИд);
    УстановитьАтрибут(rootNode, "Комментарий", "");

    // Добавлено. Начало
    ХМЛФайл.WriteLine("ВерсияФормата=" + """2.0""");  //NewNode.xm
    ХМЛФайл.WriteLine("ДатаВыгрузки" + "=""" + Строка(ПолучитьДатуV8(ТекущаяДата(), ТекущееВремя())) + """");
    ХМЛФайл.WriteLine("НачалоПериодаВыгрузки" + "=""" + Строка(ПолучитьДатуV8(ДатаНачала)) + """");
    ХМЛФайл.WriteLine("ОкончаниеПериодаВыгрузки" + "=""" + Строка(ПолучитьДатуV8(ДатаОкончания)) + """");
    ХМЛФайл.WriteLine("ИмяКонфигурацииИсточника" + "=""" + Строка(мКонфигурацияИсточник) + """");
    ХМЛФайл.WriteLine("ИмяКонфигурацииПриемника" + "=""" + Строка(мКонфигурацияПриемник) + """");
    ХМЛФайл.WriteLine("ИдПравилКонвертации" + "=""" + Строка(мИд) + """");
    ХМЛФайл.WriteLine("Комментарий" + "=""""");
    ХМЛФайл.WriteLine(">");
    // Добавлено. Конец
………………………………………………………………
………………………………………………………………
    // Добавлено. Начало
    ХМЛФайл.WriteLine(УзелПравилаОбмена.xml);
    // Добавлено. Конец


КонецПроцедуры // ИнициализацияФайлаОбмена()

5.Изменить процедуру ВыполнитьВыгрузку()

Процедура ВыполнитьВыгрузку()
…………………………………………………
    rootNode = DOMDocument.createNode(1, "ФайлОбмена", "");
    
    // Добавлено. Начало.
    ХМЛФайл.WriteLine("<" + "ФайлОбмена");
    // Добавлено. Конец
…………………………………………………..
    // Изменено. Начало
    //DOMDocument.appendChild(rootNode);
    //DOMDocument.save(ИмяФайлаДанных);
    ХМЛФайл.WriteLine("</" + "ФайлОбмена>");
    // Изменено. Конец

    
    ВывестиСообщение("Выгружено объектов:   " + мСчетчикВыгруженныхОбъектов);
    
    ВывестиСообщение("Окончание выгрузки:   " + ТекущаяДата() + " " + ТекущееВремя());

КонецПроцедуры // ВыполнитьВыгрузку()

Вторая доработка. Оптимизация скорости выгрузки.
По мере выгрузки справочника делал простой замер скорости. Считал за сколько минут выгружается  допустим 1000 объектов. И по этим данным делал примерный расчет общего времени выгрузки. И чем больше объектов выгружалось, тем больше становилось расчетное время выгрузки.  25 тыс – 4,5 часа. 50тыс. – 6 часов. На 100 тыс – уже 10 часов.
Сделал замер. На три однотипные строчки кода тратилось 78% времени.

УзелСсылки = ВыгруженныеОбъекты.Получить(КлючВыгружаемыхДанных);
ВыгруженныеОбъекты.Установить(КлючВыгружаемыхДанных, Нпп);
ВыгруженныеОбъекты.Установить(КлючВыгружаемыхДанных, УзелСсылки);

Изначально ВыгруженныеОбъекты – это список значений.
Заменил Список значений на индексированную таблицу из компоненты 1С++

Что сделать.
1.    Изменил процедуру  ПриОткрытии ()

Процедура ПриОткрытии()
    
    // Добавлено. Начало
    ЗагрузитьВнешнююКомпоненту("1cpp.dll");    
    // Добавлено. Конец
…………………………………………………………
КонецПроцедуры // ПриОткрытии()

2.    Изменить процедуру ЗагрузитьПКО()

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

3.    Изменить процедуру ВыгрузитьПоПравилу()
Места изменния найти поиском по слову ВыгруженныеОбъекты

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


После этих изменений выгрузка моего справочника выполнилась за 2 с половиной часа.
С чем так и не смог справиться, так это с ошибкой о нехватке памяти, когда для ПКО НЕ стоит свойство «не запоминать выгруженные. Растет таблица закэшированных xml-фрагментов ссылок на выгруженные объекты. Пришлось для ПКО моего большого справочника поставить «не запоминать выгруженные объекты».

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. rfcor 74 30.09.14 17:17 Сейчас в теме
Сейчас попробуем) для начала неплохо было бы упомянуть, что сперва нужно зарегистрировать библиотеку scrrun.dll.
В командной строке под админом:
cd c:\windwos\system32
regsvr32 scrrun.dll
2. ander_ 01.10.14 10:39 Сейчас в теме
Здорово! А никто не подскажет как бы подобным волшебным образом ускорить типовой обмен в 8-ке?
3. Just4Fun 31 01.10.14 11:02 Сейчас в теме
(2) ander_, на практике с медленной работой тпового обмена не сталкивался. По крайней мере обмен не выполнялся настолько долго, что бы стать проблемой. Нужно смотреть конкретно на вашем случае, где узкое место при обмене. Точнее не отвечу.
4. skt-roman 21.12.14 16:29 Сейчас в теме
Не понял где поставить в ПКО не запоминать выгруженные объекты
5. Just4Fun 31 22.12.14 12:35 Сейчас в теме
(4) skt-roman, это галочка в свойствах ПКО. При наличии этой галочки, для объекта в файл XML будет формироваться полная выгрузка по правилам, каждый раз когда объект встречается при выгрузке. А если галочка НЕ стоит - то в файл объект записывается полностью только один раз, а дальше, если встречается повторно - записывается только описание "ссылки" с полями поиска.
6. skt-roman 28.12.14 07:14 Сейчас в теме
Сделал первую доработку. Виснет на выгрузке счета 41.1, оставил выгрузку по правилу только этот счет - виснет выгрузив 2284 объекта
7. Just4Fun 31 29.12.14 10:27 Сейчас в теме
(6) skt-roman, общий смысл первой доработки - исключить хранение в памяти объекта большого размера. это реализовано потоковой записью в файл. Общий алгоритм выгрузки не затронут.

Виснет на выгрузке счета 41.1, оставил выгрузку по правилу только этот счет - виснет выгрузив 2284 объекта
Если я правильно понял, выгружаете только этот один счет. А если выгружается 2284 объекта для одного счета - то это очень похоже на зацикливание.
Предположу, что для ПКО какого-то объекта, который попал в выгрузку, снята галочка "не запоминать выгруженные" (о чем говорили в (4) и (5)), а у выгружаемого объекта есть реквизит, который ссылается на этот же объект. По крайней мере сталкивался с таким. Точнее скажет только отладчик. Если не ошибаюсь, при записи сразу в файл, этот файл можно сразу открыть. Посмотрите по содержимому, что именно выгружается для вашего счета.

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


По этому ставить этот флаг у ПКО объекта нужно, только в крайнем случае, если это действительно необходимо.
8. skt-roman 31.12.14 05:48 Сейчас в теме
(7) Just4Fun, выгрузка без доработки это отрабатывает нормально, странно.
9. NoRazum 27 13.05.15 18:14 Сейчас в теме
Когда смотрел стандартную выгрузку из 7.7 бухгалтерию в Бух 3.0
Особенно выгрузку остатков по счету. Кто придумывал такой алгоритм работы...
Создается таблица потом в первом прогоне уменьшается в два раза и потом еще раза три - четыре в цикле крутиться.
Пока это не исправить все остальное: мелочи.
10. buy_sale 220 16.06.16 01:32 Сейчас в теме
Примерно до 20000 выгрузка шла быстро, потом стала выгружать примерно по 10 объектов в секунду. Никто не сталкивался ?
11. Just4Fun 31 16.06.16 12:46 Сейчас в теме
(10) buy_sale, Сталкивался. Мой случай описан во "второй доработке" из этой статьи. Уже не помню свои исходные данные, но прогнозная оценка времени выгрузки составляла больше 10 часов. После доработки выгрузка выполнилась за 2,5 часа
Если применили эту доработку, то понять причину поможет только отладчик.
12. buy_sale 220 17.06.16 13:57 Сейчас в теме
Уважаемый а вы уверены, что это тождественнно

//УзелСсылки = ВыгруженныеОбъекты.Получить(КлючВыгружаемыхДанных);
            НомерСтроки = ВыгруженныеОбъекты.НайтиСтроку("Ключ", 1);


мне кажется надо

//УзелСсылки = ВыгруженныеОбъекты.Получить(КлючВыгружаемыхДанных);
            НомерСтроки = ВыгруженныеОбъекты.НайтиСтроку("Ключ", КлючВыгружаемыхДанных);

иначе зацикливается на одном элементе

исправил так как указано - 480 000 за 90 мин !) До этого было 2 суток и падало с ошибкой. База 1,5 гиг свернутая

Аплодирую стоя !

В ВыгрузитьПоПравилу добавил для спр Номенклатура ( У меня 160000 элементов)
....
	НеЗапоминатьВыгруженные     = ПолучитьРеквизитПКО(НомерПКО, "НеЗапоминатьВыгруженные");
	НеВыгружатьОбъектыСвойствПоСсылкам = ПолучитьРеквизитПКО(НомерПКО, "НеВыгружатьОбъектыСвойствПоСсылкам");
	ВыгруженныеОбъекты          = ПолучитьРеквизитПКО(НомерПКО, "Выгруженные");
	ВсеОбъектыВыгружены         = ПолучитьРеквизитПКО(НомерПКО, "ВсеОбъектыВыгружены");
	НеЗамещатьОбъектПриЗагрузке = ПолучитьРеквизитПКО(НомерПКО, "НеЗамещать");
	НеСоздаватьЕслиНеНайден     = ПолучитьРеквизитПКО(НомерПКО, "НеСоздаватьЕслиНеНайден");
	
	РежимЗаписи     			= "";
	РежимПроведения 			= ""; 
	
	//фирс
	Если ТипЗначенияСтр(Источник)="Справочник" Тогда
		Если Источник.Вид()="Номенклатура" Тогда
			НеЗапоминатьВыгруженные = 1;
		КонецЕсли;
	КонецЕсли;	
	//фирс
Показать
Прикрепленные файлы:
ACC_ACC8.ert
13. Just4Fun 31 21.06.16 13:44 Сейчас в теме
(12) buy_sale,
"Уважаемый а вы уверены, что это тождественнно " -
За давностью лет, подтвердить или опровергнуть не смогу. Поскольку вместо типового списка значений задействовал индексированную таблицу из 1СPP, то возможно сделал так по возможному синтаксису метода этого объекта. Уже не помню, скорее всего в методе допускалось указание имени или номера колонки, потому так и написал.

"Аплодирую стоя ! "
Пожалуйста.
20. primat 2361 08.11.16 22:23 Сейчас в теме
(12)(12)(19) its_valera, добрый день.
Коллеги, всех приветствую. Использовали рекомендации из этой публикации на сложной задаче переноса данных из ТиС в УТ 11. Большое спасибо автору за идею и направление движения по оптимизации выгрузки! Пока у нас решение не заработало полноценно - зависает даже при отметке единственного правила "Номенклатура" на 27168м элементе. Будем пробовать рекомендации из комментариев.

А насчет ошибки, с которой Вы столкнулись - у нас такая тоже была. Вот что надо сделать. Вместо строки:
мТаблицаПравилКонвертацииОбъектов.Выгруженные.УдалитьВсе();

Нужен такой код:
мТаблицаПравилКонвертацииОбъектов.Выгруженные.УдалитьСтроки();


Так как тип теперь стал ТаблицаЗначений.
корум; its_valera; +2 Ответить
14. buy_sale 220 23.06.16 22:15 Сейчас в теме
Есть проблема : выгрузка зависает на 497144 объектах. После загрузки БП3 пишет Extra Content at the end of document. Соответственно документы остатков по самому большому справочнику номенклатуры (150 000 элементов) не появляются.

даже когда маленький файл гружу все равно конец обрезается (((
https://yadi.sk/i/8b7xdzFRsm4Hm
15. Just4Fun 31 28.06.16 00:56 Сейчас в теме
(14) buy_sale,
"даже когда маленький файл гружу все равно конец обрезается"
Нужно проверить, корректно ли "закрывается" файл, т.е. все ли закрывающие теги на месте. На маленьком файле должно быть видно. Если файл действительно небольшой, то можно открыть в IE - должен корректно отобразиться в виде дерева.
В своей практике сталкивался с проблемой - "некорректный" символ в строке (в наименовании элемента справочника) - долго не мог понять, в чем причина.

"Соответственно документы остатков по самому большому справочнику номенклатуры (150 000 элементов) не появляются."
Может конечно у вас и не одним документом все грузится, но на всякий случай посоветовал бы ограничить количество строк на документ, например по 1-2 тыс. строк.. С документами с небольшим количеством строк потом и работать легче (отрывать, проверять, проводить и т.п.).

Еще как вариант оптимизации, выгрузить отдельно ваш большой справочник, только то что возвращает запрос для выгрузки остатков. А потом отдельно выгружать документы остатков с включенным флагом (в ПКО) "не выгружать объекты по ссылкам..."
16. Just4Fun 31 28.06.16 01:04 Сейчас в теме
(14) buy_sale, посмотрел внимательно на скрин с ошибкой. Нет ли в обработчике "после загрузки данных" чтения каких-либо дополнительных данных из файла?
17. its_valera 4 10.08.16 07:20 Сейчас в теме
Добрый день! А 1CPP.dll в Windows 10 работает? Что то не могу зарегистрировать dll-ку.
24. UserPro 4 13.05.19 01:38 Сейчас в теме
18. its_valera 4 10.08.16 07:56 Сейчас в теме
Господа, подскажите что делаю не так. Не могу зарегистрировать 1СРР через regsvr32. Скачал с 1cpp.ru. Пробовал на Виндовс 10, 7 и ХР. Пушу в командной строке от Админа regsvr32 "c:\1CPP.dll" , ошибка Не найден путь.
19. its_valera 4 10.08.16 09:36 Сейчас в теме
Вопрос снят! Просто закинул ее в BIN и в папку с базой!

Теперь другая ошибка при выгрузке:
мТаблицаПравилКонвертацииОбъектов.Выгруженные.УдалитьВсе();
{C:\CONVERT_25\V77EXP+.ERT(59116)}: Поле агрегатного объекта не обнаружено (УдалитьВсе)
CheBurator; +1 Ответить
21. VeronH 19.04.17 12:41 Сейчас в теме
Интересно, сделал доработку, перестали загружаться ссылочные реквизиты: например выгружаем справочник номенклатура, реквизит ед. измерения, в файле выгрузки есть единица измерения, выгружена один раз, далее ссылками заполняется, а в итоговой базе пусто. Если без доработки тогда - все нормально, и в файле выгрузки ед измерения выгружается каждый раз, без ссылок, хотя флаг " не запоминать объекты" не взведен.
22. VeronH 28.04.17 09:59 Сейчас в теме
УзелСсылки = ВыгруженныеОбъекты.ПолучитьЗначение(НомерСтроки, "Ссылка"); здесь получается не xml узел(типа dom объект), а просто Нпп...
23. VeronH 28.04.17 12:22 Сейчас в теме
Вроде разобрался:
вместо НомерСтроки = ВыгруженныеОбъекты.НайтиСтроку("Ключ", 1); надо НайтиСтроку("Ключ", КлючВыгружаемыхДанных, 1);

Так как в таблицу добавляется 2 записи, одна с нпп, другая с выгруженным узломссылки, если без 1 всегда будет находить первую запись с нпп и ссылочные реквизиты не загрузятся, с 1 будет найдена последняя строка.
25. UserPro 4 13.05.19 09:09 Сейчас в теме
Автору +++. Время выгрузки значительно уменьшается, но проблема нехватки памяти к сожалению осталась, при размере в 561 Мб файла выгрузки xml, 1С 7.7 зависает и Windows 10 x64 пишет "Нет свободной оперативной памяти".
26. Just4Fun 31 15.05.19 13:42 Сейчас в теме
(25) попробуйте для ПКО объекта, по которому выгружается наибольшее количество данных поставить «не запоминать выгруженные объекты».
Также, возможно, разбить выгрузку на этапы. Например. 1. справочники, 2. Документы. в ПКО документов указать "не выгружать объекты свойств по ссылкам".
Ну и еще простое решение, разбить выгрузку на порции, например, по видам объектов или периодам.
27. UserPro 4 15.05.19 15:14 Сейчас в теме
Спасибо за инфу. Выгружаю только один справочник ТМЦ и зависает (примерно на 200000 записях ), не большие справочники все гут.
28. timurhv 18.10.19 11:55 Сейчас в теме
Падает в процедуре "ИнициализацияФайлаОбмена" на строчке:
// Добавлено. Начало
ХМЛФайл.WriteLine(УзелПравилаОбмена.xml);
// Добавлено. Конец

Код выше отрабатывает без ошибок:
ХМЛФайл.WriteLine("ВерсияФормата=" + """2.0"""); //NewNode.xm

Файл создается в UTF-16, я так понимаю, происходит ошибка преобразования символов в кодировке.
Попытался через ADODB.Stream.WriteText с созданием файла в кодировке UTF-8 - тоже самое.
Тестировал на Windows 10, 7, XP.

Кто-то сталкивался с таким? И если да, то как решить проблему?
29. timurhv 19.10.19 03:12 Сейчас в теме
(28) как мне подсказали: есть ограничение к длине строки.
Опытным путем было установлено что ровно на 500кб уже начинает выгружать корректно, но если запускать помощник перехода на новую редакцию, то все-равно падает с ошибкой (со 100кб - все стало хорошо).

В "ВыгрузитьПоПравилу" необходимо вместо

ХМЛФайл.WriteLine(Приемник.xml);

Вставить:

ДлинаСтроки = СтрДлина(Приемник.xml);
ОграничениеСтроки = 102400; // 100кб
Если ДлинаСтроки > ОграничениеСтроки Тогда
Для Инд = 1 По (Цел(ДлинаСтроки / ОграничениеСтроки) + 1) Цикл
Если ((Инд-1)*ОграничениеСтроки+1) >= ДлинаСтроки Тогда
Продолжить;
КонецЕсли;
ХМЛФайл.Write(Сред(Приемник.xml, ((Инд-1)*ОграничениеСтроки+1),ОграничениеСтроки));
КонецЦикла;
Иначе
ХМЛФайл.WriteLine(Приемник.xml);
КонецЕсли;

В конце "ИнициализацияФайлаОбмена" - тоже самое, только там "УзелПравилаОбмена.xml"
Оставьте свое сообщение

См. также

Как в 1С 7.7 сделать обмен на базе FTP

Файловые протоколы обмена, FTP 1С7.7<->1C7.7 v7.7 1cv7.md Бесплатно (free)

Выгрузка данных на FTP на примере в конфигурации Штрих-М Кассир 1.10.

12.05.2020    1345    Ignatov_mu    7    

Доработка конвертации данных КД2 (версии 2.1). Расширенная диагностическая информация при выгрузке по правилам из 1С 7.7 и при загрузке в 1С 7.7

Обмен данными 1С Перенос данных из 1С7.7 в 1C8.X Обмен через XML v7.7 v8 КД Бесплатно (free)

Есть очень неприятная особенность при настройке обмена по правилам КД2 в момент отладки на стороне 1С 7.7, как при выгрузке из 1С 7.7, так и при загрузке в 1С 7.7. Непонятно, в каком конкретно месте формирования или разбора данных XML файла в какой именно момент споткнулась программа (произошел сбой). Я нашел способ вывода дополнительной диагностики, теперь точно известно, на каком элементе данных XML споткнулся модуль выгрузки V77Exp.ert (модуль загрузки V77Imp.ert). Теперь отладка правил обмена на стороне 1С 7.7 стала простой, выполняется на порядок проще.

18.10.2019    5564    ksnik    0    

Конвертация данных из 1С 8.3 в 7.7 (версия КД 2.1). Перенос данных из 8.3 в 7.7. Создание в современной 1С 8.3 XML в формате КД2. Инструкции и примеры переноса данных из любой современной 1С 8.3 в устаревшую конфигурацию 1С 7.7, через Конвертацию данных 2

Обмен данными 1С Перенос данных из 1С7.7 в 1C8.X v7.7 v8 КД Бесплатно (free)

При переходе на новую версию 1С в период параллельной эксплуатации может возникнуть необходимость обратной конвертации данных (по правилам КД версии 2.1) из 1С:Предприятие 8.3 в 1С:Предприятие 7.7 для переноса данных из 1С:Предприятие 8.3 в 7.7. Сделать это поможет следующая инструкция по КД2 о том, как создать новую конвертацию из 8.3 в 7.7, сохранить модуль и правила загрузки данных, сделать загрузку данных. КД2.

17.10.2019    7717    ksnik    0    

Не хватает памяти (OUT OF MEMORY) при переносе данных из 7.7

Перенос данных из 1С7.7 в 1C8.X v7.7 1С7:Бух Россия Бесплатно (free)

Увеличение используемой памяти для 1С: 7.7

22.03.2017    19188    Amadeuc404    11    

Читаем реквизиты по ИНН в 1С:7.7

Обмен через XML v7.7 1cv7.md Россия Бесплатно (free)

Чтение реквизитов контрагентов по ИНН при оформленной подписке на сервис 1С:Контрагенты

17.01.2017    18614    kudenzov    14    

Методика пошагового перехода из решения для платформы 7.7 "Торговля и склад" на решение для платформы 8 "Управление торговлей"

Перенос данных из 1С7.7 в 1C8.X Оптовая торговля Оптовая торговля v7.7 v8 УТ10 1С7:ТиС Оптовая торговля, дистрибуция, логистика Россия БУ УУ Бесплатно (free)

Данная статья предваряет публикацию подсистемы для одностороннего ONLINE обмена документами и справочниками между базами данных для процесса поэтапного перехода из "семерки" в "восьмерку" для случаев распределенной совместной работы большого количества пользователей, не допускающих резких скачкообразных внедрений с рисками остановки процессов продаж, поставок, доставок или складских сборок.

31.10.2016    14933    vugluscr1991    29    

Проблемы переноса данных бухгалтерского учета

Обмен через XML v77::БУ 1С7:Бух Россия БУ Бесплатно (free)

Спецы 1С для удобства конечного пользователя создали специальные решения, позволяющие по нажатию кнопки выгрузить данные. Попробовал и я...

03.02.2016    26336    lvictor58    5    

Перенос данных из семерки по частям

Перенос данных из 1С7.7 в 1C8.X v7.7 v8 1cv8.cf 1cv7.md Бесплатно (free)

При переносе баз из семерки в восьмерку, если база данных достаточно большая, может возникнуть ошибка «msxml3.dll: Недостаточно памяти для завершения операции». В этом случае советуют переносить данные по частям. Но возможности выгрузки по частям в стандартной обработке сильно ограничены: можно выгрузить отдельно справочники, остатки на начало года, обороты, документы. Обычно такая выгрузка по частям не исправляет ситуацию, т.к. основной объем данных сосредоточен обычно в одном справочнике, значит нужно выгружать отдельно этот справочник, мало того, может понадобиться его выгружать в несколько этапов. Попытаюсь описать метод решения, который использую в таких случаях.

01.01.2015    27298    32ops    5    

Конвертация данных 2.1 (2.1.3.1) 1С 7.7 - 1С 8.Х передача параметра ПКО

Практика программирования Перенос данных из 1С7.7 в 1C8.X v7.7 v8 КД Бесплатно (free)

Передача параметров по умолчанию доступна только для баз 1С 8.х -1С 8.х. Показан пример, как передать параметры из 1С 7.7 - 1С 8.х

10.12.2012    25308    serg_gres    6    

Переход на "1С: Бухгалтерию 8". Часть 1. Перенос данных

Перенос данных из 1С7.7 в 1C8.X v7.7 v8 БП2.0 1С7:Бух Россия Бесплатно (free)

В данной публикации рассматривается перенос данных из "1С:Бухгалтерии 7.7" в "1С:Бухгалтерию 8".

03.09.2012    36846    Стил    11    

КД 2.0. Перенос документов 7.7 - 7.7. Передача параметра "Проведен"

Обмен через XML 1С7.7<->1C7.7 v77::ОУ v77::БУ v77::Расчет 1cv7.md КД Бесплатно (free)

1С:Конвертация данных 2.0. Решение проблемы проведения документов при переносе между базами 7.7

20.12.2011    18489    xazrad    18    

Фокусы с Конвертацией данных 2.0

Перенос данных из 1С7.7 в 1C8.X Обмен через XML v7.7 v8 1cv8.cf 1cv7.md КД Бесплатно (free)

Используем мощный инструмент Конвертации данных себе во благо

19.12.2011    19981    tusv    9    

Хитрость. Использование БУЛЕВО при OLE обмене/подключении из 7.7 к 8

Перенос данных из 1С7.7 в 1C8.X Универсальные функции v7.7 v8 1cv8.cf 1cv7.md Бесплатно (free)

Как известно, при OLE обмене доступны только типы СТРОКА, ЧИСЛО, ДАТА. А вот БУЛЕВО (ИСТИНА, ЛОЖЬ) использовать при подключении из 7.7 к 8 не получается. Как же быть? Есть хитрость, как использовать тип булево в семерке при обмене с 1С8! :)

28.09.2011    16531    dnikolaev    9    

Как создать в 7.7 XML, проверить по схемам (XSD, XML) от заказчика и отправить на вебсервер методом Post

Обмен через XML Практика программирования v7.7 1cv7.md Бесплатно (free)

Немного об API из 1С. Или простой способ создать, проверить и отправить на вебсервер XML-файл.

30.04.2011    82660    artms    24    

Работа с 1С через OLE 8.* (V81.Application, V81.COMConnector)

Перенос данных из 1С7.7 в 1C8.X Математика и алгоритмы v7.7 v8 1cv8.cf 1cv7.md Бесплатно (free)

Решил серьезно заняться изучением OLE. Конечно OLE это не КД, но все же...

07.04.2011    96176    artspeed    16    

Конвертация данных 2. Выгрузка виртуальных объектов (документ Установка цен номенклатуры)

Перенос данных из 1С7.7 в 1C8.X Ценообразование, прайсы Ценообразование, анализ цен Ценообразование, анализ цен v7.7 v8 БП2.0 1С7:ТиС КД Россия БУ Бесплатно (free)

Пример выгрузки цен из конфигурации ТиС 9.2 в БП 2.0 Выгружаются все цены на дату, загрузка происходит в документы Установка цен номенклатуры. Документы эти - виртуальные, источника в ТиС не имеют.

03.02.2011    37460    nicxxx    22    

Конвертация данных 2 - Отмена проведения документов в 7.7 при повторной загрузке

1С7.7<->1C7.7 Обработка документов v7.7 1cv7.md КД Бесплатно (free)

При повторной загрузке данных в 1С бывает необходимо отменить проведение у существующих документов.

21.10.2010    18759    nicxxx    7    

OLE в 1С-Предприятии

Математика и алгоритмы 1С7.7<->1C7.7 v7.7 1cv7.md Бесплатно (free)

Небольшая инструкция с примерами - как работать с OLE

09.08.2008    32812    Minotavrik    8    

(OLE 1С - 1C 7.7) Функции для 1С:Предприятие 7.7 для работы с другой базой 1С.

1С7.7<->1C7.7 Практика программирования v7.7 1cv7.md Россия Бесплатно (free)

Простенькие учебные функции (с описанием) для работы с базой 1С 7.7 через OLE. Полностью средствами 1С, т.е. не требуют никаких внешних компонент. Пользоваться можно бесплатно:-) Вставляете в глобальный модуль и пользуетесь. Цель: обучение, готовая иллюстрация подходов, возможность сразу использовать или, если нужно, доработать под свои цели.

06.08.2008    28861    venger    8    

1С:Конвертация данных: Способ переноса дерева элементов справочников между разнородными конфигурациями.

Математика и алгоритмы Обмен через XML 1С7.7<->1C7.7 v7.7 1cv7.md КД Бесплатно (free)

Данная задача возникает когда необходимо перенести справочники между конфигурациями у которых различается количество уровней. Например, количество уровней в справочнике "Номенклатура" в конфигурации "Торговля и Склад" - 5, а в конфигурации "Бухгалтерия" - 4. Самое простое решение - отбросить реквизит "Родитель" элементов справочника при выгрузке, но есть способ элегантнее. В данном случае мы не обсуждаем возможность изменения структуры справочника в базе-приемнике конфигурации "1С:Бухгалтерия".

23.06.2008    13076    api.vl    2    

Объединение справочников и перенос остатков номенклатуры из нескольких баз 1С 7.7 в 1 базу УПП 8.1

Перенос данных из 1С7.7 в 1C8.X Практика программирования v7.7 v8 1cv7.md УПП1 Россия Бесплатно (free)

Объединение справочников и перенос остатков номенклатуры из нескольких баз 1С 7.7 в 1 базу УПП 8.1

11.12.2007    12395    danser    3