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

24.09.14

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

При выгрузке из 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-фрагментов ссылок на выгруженные объекты. Пришлось для ПКО моего большого справочника поставить «не запоминать выгруженные объекты».

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

См. также

Перенос данных 1C Программист Бухгалтер Платформа 1С v8.3 Оперативный учет 7.7 1С:Торговля и склад 7.7 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет Управленческий учет Платные (руб)

Переносится из типовой конфигурации «Торговля и Склад», реакции 9.2 платформы «1С:Предприятие 7.7» в типовую конфигурацию «Бухгалтерия предприятия», редакции 3.0 платформы «1С: Предприятие 8.3» следующие документы и их операции (с соблюдением всех соответствующих проводок): Поступления товаров и услуг (в т.ч. комиссия), Реализации товаров и услуг (в т.ч. комиссия), ПКО и РКО, выписки банка, счета фактуры (выданные и полученный), Возвраты от покупателей и поставщику, Заявка Покупателя, Инвентаризация и другие (всего 28 видов документов, смотрите описание, приложенное к обработке)

11988 руб.

30.06.2014    65371    105    96    

112

Перенос данных 1C Программист Платформа 1С v7.7 Платформа 1С v8.3 1С:Торговля и склад 7.7 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Бухгалтерский учет Управленческий учет Платные (руб)

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

6000 руб.

18.05.2020    23584    63    39    

37

Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v7.7 Конфигурации 1cv7 Россия Платные (руб)

Класс 1С++ для подключения ФИАС (Федеральная информационная адресная система) к любой конфигурации 1С 7.7. Опционально доступно геокодирование адресов и хранение географических координат адресных элементов ФИАС в отдельной БД. В конфигурации, где для ведения адресов используется типовой интерфейс по работе с КЛАДР, встраивается за пару минут.

6000 руб.

15.11.2017    27486    31    71    

29

Файловый обмен (TXT, XML, DBF), FTP Учет документов Распознавание документов и образов Бухгалтер Пользователь Платформа 1С v7.7 Платформа 1С v8.3 Платформа 1C v8.2 Конфигурации 1cv8 Конфигурации 1cv7 Россия Платные (руб)

Программный комплекс способный распознавать сотни листов за раз любых сканированных(фото) документов (УПД, ТОРГ12, СФ, паспорт и пр.) и загружать их в любую 1С (БП3.0, УТ, КА, УНФ, УПП, 1С7.7 ТиС, ЗУП3 и пр.), а также формировать архив сканированных документов.<br> Робот применяет до 5 способов распознавания. Максимальное качество загрузки документов из бесплатных OCR. Работает без Интернета.

10800 руб.

13.10.2022    8404    1    12    

9

Файловый обмен (TXT, XML, DBF), FTP ЭДО и ОФД Программист Бухгалтерский учет 7.7 1С:Бухгалтерия 7.7 1С:Торговля и склад 7.7 1С:Бухгалтерия 1.6 1С:Упрощенное налогообложение 7.7 Россия Бухгалтерский учет Абонемент ($m)

Обмениваемся УПД (УКД) с различными контрагентами через СБИС. А чтобы загрузить УПД (УКД) из 7.7 в Сбис, используем данную обработку, которая создает файл в формате XML, который можно импортировать в систему электронного документооборота. Для конфигурации "Бухгалтерский учет" (тестировалась на релизе 7.70.663) Для конфигурации "Упрощенная система налогообложения" ( тестировалась на релизе 7.70.305) Для конфигурации "Торговля и Склад 7.7" (тестировалась на релизе 7.70.1007)

1 стартмани

31.07.2021    16521    253    AndKovalchuk    54    

18

Перенос данных 1C Программист Платформа 1С v7.7 Платформа 1С v8.3 Платформа 1C v8.2 1С:Управление торговлей 10 1С:Комплексная 7.7 Россия Управленческий учет Платные (руб)

Начните вести учет в УТ 10.3! Перенесите все свои данные в УТ 10.3 в любом месяце года и продолжите вести учет! Программа перенесёт любое количество баз с документами и остатками в больших количествах. Обработка выгрузки выполнит проверку исходных данных и сформирует отчет о найденных ошибках в справочниках и документах. Партии переносятся с себестоимостью. Штрихкоды номенклатуры загружаются. Цена переносится. Автор консультирует.

8400 руб.

17.03.2021    15988    5    13    

6

Зарплата Перенос данных 1C Программист Бухгалтер Бухгалтерский учет 7.7 Сложные периодические расчеты 1С:Бухгалтерия 7.7 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Как известно, Бухгалтерия 7.7 не имеет штатной возможности для обмена с ЗУП 3.1. Данная разработка пригодится тем, кто перешел с ЗиК 2.3 на ЗУП 3.1, но вынужден по каким-то своим причинам оставаться на Бухгалтерии 7.7.

18000 руб.

29.09.2020    13824    2    0    

5

Перенос данных 1C Программист Платформа 1С v7.7 Платформа 1С v8.3 1С:Конвертация данных Бесплатно (free)

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

17.10.2019    15185    ksnik    0    

16
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. rfcor 77 30.09.14 17:17 Сейчас в теме
Сейчас попробуем) для начала неплохо было бы упомянуть, что сперва нужно зарегистрировать библиотеку scrrun.dll.
В командной строке под админом:
cd c:\windwos\system32
regsvr32 scrrun.dll
2. ander_ 01.10.14 10:39 Сейчас в теме
Здорово! А никто не подскажет как бы подобным волшебным образом ускорить типовой обмен в 8-ке?
3. Just4Fun 36 01.10.14 11:02 Сейчас в теме
(2) ander_, на практике с медленной работой тпового обмена не сталкивался. По крайней мере обмен не выполнялся настолько долго, что бы стать проблемой. Нужно смотреть конкретно на вашем случае, где узкое место при обмене. Точнее не отвечу.
4. skt-roman 21.12.14 16:29 Сейчас в теме
Не понял где поставить в ПКО не запоминать выгруженные объекты
5. Just4Fun 36 22.12.14 12:35 Сейчас в теме
(4) skt-roman, это галочка в свойствах ПКО. При наличии этой галочки, для объекта в файл XML будет формироваться полная выгрузка по правилам, каждый раз когда объект встречается при выгрузке. А если галочка НЕ стоит - то в файл объект записывается полностью только один раз, а дальше, если встречается повторно - записывается только описание "ссылки" с полями поиска.
6. skt-roman 28.12.14 07:14 Сейчас в теме
Сделал первую доработку. Виснет на выгрузке счета 41.1, оставил выгрузку по правилу только этот счет - виснет выгрузив 2284 объекта
7. Just4Fun 36 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 29 13.05.15 18:14 Сейчас в теме
Когда смотрел стандартную выгрузку из 7.7 бухгалтерию в Бух 3.0
Особенно выгрузку остатков по счету. Кто придумывал такой алгоритм работы...
Создается таблица потом в первом прогоне уменьшается в два раза и потом еще раза три - четыре в цикле крутиться.
Пока это не исправить все остальное: мелочи.
10. buy_sale 220 16.06.16 01:32 Сейчас в теме
Примерно до 20000 выгрузка шла быстро, потом стала выгружать примерно по 10 объектов в секунду. Никто не сталкивался ?
11. Just4Fun 36 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 36 21.06.16 13:44 Сейчас в теме
(12) buy_sale,
"Уважаемый а вы уверены, что это тождественнно " -
За давностью лет, подтвердить или опровергнуть не смогу. Поскольку вместо типового списка значений задействовал индексированную таблицу из 1СPP, то возможно сделал так по возможному синтаксису метода этого объекта. Уже не помню, скорее всего в методе допускалось указание имени или номера колонки, потому так и написал.

"Аплодирую стоя ! "
Пожалуйста.
20. primat 1321 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 36 28.06.16 00:56 Сейчас в теме
(14) buy_sale,
"даже когда маленький файл гружу все равно конец обрезается"
Нужно проверить, корректно ли "закрывается" файл, т.е. все ли закрывающие теги на месте. На маленьком файле должно быть видно. Если файл действительно небольшой, то можно открыть в IE - должен корректно отобразиться в виде дерева.
В своей практике сталкивался с проблемой - "некорректный" символ в строке (в наименовании элемента справочника) - долго не мог понять, в чем причина.

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

Еще как вариант оптимизации, выгрузить отдельно ваш большой справочник, только то что возвращает запрос для выгрузки остатков. А потом отдельно выгружать документы остатков с включенным флагом (в ПКО) "не выгружать объекты по ссылкам..."
16. Just4Fun 36 28.06.16 01:04 Сейчас в теме
(14) buy_sale, посмотрел внимательно на скрин с ошибкой. Нет ли в обработчике "после загрузки данных" чтения каких-либо дополнительных данных из файла?
17. its_valera 10.08.16 07:20 Сейчас в теме
Добрый день! А 1CPP.dll в Windows 10 работает? Что то не могу зарегистрировать dll-ку.
24. UserPro 4 13.05.19 01:38 Сейчас в теме
18. its_valera 10.08.16 07:56 Сейчас в теме
Господа, подскажите что делаю не так. Не могу зарегистрировать 1СРР через regsvr32. Скачал с 1cpp.ru. Пробовал на Виндовс 10, 7 и ХР. Пушу в командной строке от Админа regsvr32 "c:\1CPP.dll" , ошибка Не найден путь.
19. its_valera 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 36 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"
30. Teh-Cto 10.12.20 14:51 Сейчас в теме
Здравствуйте.
Я столкнулся с задачей выгрузки очень большого справочника номенклатура из конфигурации Торговля и Склад в xml файл для последующей загрузки в новую конфигурацию.
У меня есть обработка специально для этих целей, но она не справляется с задачей, упираясь в ограничения по памяти - процесс вылетает, набрав 1,4 Гб памяти.
Мне нужно мождифицировать свою обработку, и тут я нашел вашу статью.
Возможно, у вас есть пример работающей выгрузки с описанными изменениями? Мне бы это очень помогло для понимания, как модифицировать свою обработку.
33. Just4Fun 36 18.12.20 19:07 Сейчас в теме
(31) если работает, то тоже решение.
32. Just4Fun 36 18.12.20 19:03 Сейчас в теме
(30) лет то прошло... сделал и забыл.
По идее все ключевые моменты описаны в статье. Все внесенные изменения в статье показаны. Их не так много. Я бы даже сказал, доработки минимальные. Больше, к сожалению, ничем помочь не могу.
Оставьте свое сообщение