8.х ОБМЕН Загрузка номенклатуры

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем Oleg_NSK, 7 дек 2010.

  1. TopicStarter Overlay
    Oleg_NSK
    Offline

    Oleg_NSK Опытный в 1С

    Регистрация:
    25 окт 2010
    Сообщения:
    164
    Симпатии:
    0
    Баллы:
    26
    Из 7.7 номенклатура выгружается в excel. Получается файлик размерностью в 16 тыс. строк и 15 колонок. В 8.1 файл загружается довольно быстро в таблицу значений и далее начинается перебор этой ТЗ и запись номенклатуры. Проблема в том что приходится подгружать по 1000 строк, а потом перезапускать процесс, т.к. если загружать всё сразу, платформа сжирает память и вылетает. Возможно ли как-то избежать такой ситуации?
  2. StarLight
    Offline

    StarLight Опытный в 1С

    Регистрация:
    28 июл 2009
    Сообщения:
    212
    Симпатии:
    0
    Баллы:
    26
    А почему не xml, ну на крайний случай dbf. Пошустрее бы работало
  3. Andy13
    Offline

    Andy13 Опытный в 1С

    Регистрация:
    1 мар 2010
    Сообщения:
    244
    Симпатии:
    2
    Баллы:
    29
    1. Из 8.1 com-соединение, прямая передача данных.
    2. Из 7.7 OLE - соединение, прямая передача данных.
    3. XML. (КД2)
    4. DBF.
    5. TXT.

    Все варианты выгоднее чем EXCEL.
  4. Andy13
    Offline

    Andy13 Опытный в 1С

    Регистрация:
    1 мар 2010
    Сообщения:
    244
    Симпатии:
    2
    Баллы:
    29
    Но если подумать...
    Как мне кажется, основная проблема в том, что сначала грузится в ТЗ. Именно это съедает память. Насколько необходимо сначала пихать данные в ТЗ? Можно ведь сразу после чтения строки из Экселя записать. Если при загрузке грамотно по переменными разложить, то вообще ничего не сожрет.
  5. TopicStarter Overlay
    Oleg_NSK
    Offline

    Oleg_NSK Опытный в 1С

    Регистрация:
    25 окт 2010
    Сообщения:
    164
    Симпатии:
    0
    Баллы:
    26
    Хм.. сомневаюсь.. Ведь эта ТЗ создается быстро... Уничтожение памяти начинается при переборе этой ТЗ в цикле и записи номенклатуры, ед. измеререний и недостающих значений свойств объектов

    Вот кусок кода убивающий память

    Код:
    	Для i = 0 По КоличествоСтрок-1 Цикл
    ЭлементыФормы.НадписьИндикатор.Значение = "Создание номенклатуры";
    ЭлементыФормы.Индикатор.Значение = Окр(((i+1)/КоличествоСтрок)*100);
    
    Единица =  ТаблДанныхАртикул[i].Единица;
    НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
    НовыйЭлемент.Наименование  = ТаблДанныхАртикул[i].Наименование;
    НовыйЭлемент.НаименованиеПолное = ТаблДанныхАртикул[i].НаименованиеПолное;
    НовыйЭлемент.БазоваяЕдиницаИзмерения  = Единица;
    НовыйЭлемент.ВестиУчетПоХарактеристикам = Ложь;
    НовыйЭлемент.ВидНоменклатуры = ВидТовар;
    НовыйЭлемент.СтавкаНДС = ТаблДанныхАртикул[i].СтавкаНДС;
    НовыйЭлемент.Родитель = ТаблДанныхАртикул[i].Родитель;
    //	НовыйЭлемент.НоменклатурнаяГруппа = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию(ТаблДанныхАртикул[i].НомГруппа);
    НовыйЭлемент.Записать();
    //запишем единицу
    НайденнаяЕдиницаОбъект = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
    НайденнаяЕдиницаОбъект.Наименование            = Единица.Наименование;
    НайденнаяЕдиницаОбъект.ЕдиницаПоКлассификатору = Единица;
    НайденнаяЕдиницаОбъект.Коэффициент             = 1;
    НайденнаяЕдиницаОбъект.Владелец                = НовыйЭлемент.Ссылка;
    
    Попытка
    НайденнаяЕдиницаОбъект.Записать();
    Исключение
    Сообщить("Не удалось записать единицу хранения остатков: " + ОписаниеОшибки(), СтатусСообщения.Важное);
    Отказ = Истина;
    Возврат;
    КонецПопытки;
    
    НайденнаяЕдиница = НайденнаяЕдиницаОбъект.Ссылка;
    
    НовыйЭлемент.ЕдиницаХраненияОстатков = НайденнаяЕдиница;
    НовыйЭлемент.ЕдиницаДляОтчетов =  НайденнаяЕдиница;
    НовыйЭлемент.ЕдиницаИзмеренияМест =НайденнаяЕдиница; 
    НовыйЭлемент.Записать();
    //торговая марка
    Если ЗначениеЗаполнено(ТаблДанныхАртикул[i].ТорговаяМарка) Тогда
    ЗначениеСвойстваТМ =  НайтиЗначениеСвойства(СвойствоТМ,ТаблДанныхАртикул[i].ТорговаяМарка);
    НоваяЗаписьХарактер = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
    НоваяЗаписьХарактер.Объект = НовыйЭлемент.Ссылка;
    НоваяЗаписьХарактер.Свойство = СвойствоТМ;
    НоваяЗаписьХарактер.Значение = ЗначениеСвойстваТМ;
    Попытка
    НоваяЗаписьХарактер.Записать();
    Исключение
    ОбщегоНазначения.СообщитьОбОшибке("Ошибка при записи свойства: " + ИнформацияОбОшибке().Описание);
    КонецПопытки;
    КонецЕсли;
    
    
    // тут другие свойства
    
    ТекЗапись = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
    ТекЗапись.Владелец         = НовыйЭлемент.Ссылка;
    ТекЗапись.ЕдиницаИзмерения = НовыйЭлемент.ЕдиницаХраненияОстатков;
    ТекЗапись.ТипШтрихкода     = ТипШтрихКода;
    ТекЗапись.Качество         = Справочники.Качество.Новый;
    ТекЗапись.Штрихкод         = ТаблДанныхАртикул[i].Код;
    Попытка
    ТекЗапись.Записать();
    Исключение
    ОбщегоНазначения.СообщитьОбОшибке("Ошибка при записи штрихкода: " + ИнформацияОбОшибке().Описание);
    КонецПопытки;
    НовыйЭлемент.Записать();
    КонецЦикла;	
    
    
  6. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    1) метод "ЛистИзФайла.UsedRange.Value.Выгрузить()" моментально получает из excel массивы строковых значений.. за несколько секунд спокойно загружаются прайсы в табличную часть документа (по 13 000 строк каждый). так что excel не есть зло. можно спокойно грузить из excel. я думаю дело не в excel..

    // открываем excel
    Эксель = Новый COMОбъект("Excel.Application");
    ЭксельЭтотОбъектКниги = Эксель.Workbooks;
    КнигаИзФайла = ЭксельЭтотОбъектКниги.Open(ЗагружаемыйФайл);

    // обработка
    ЛистИзФайла = КнигаИзФайла.Worksheets(1);

    МассивыИзЭксель = ЛистИзФайла.UsedRange.Value.Выгрузить();

    Массив1 = МассивыИзЭксель[0]; // Код
    Массив2 = МассивыИзЭксель[1]; // Наименование
    Массив3 = МассивыИзЭксель[7]; // Цена - колонка 3кол
    Массив4 = МассивыИзЭксель[4]; // Категория

    КолЭлементов = Массив1.Количество();
    Для Сч=0 По КолЭлементов-1 Цикл

    СтрокаТабличнойЧасти = Объект.ТабличнаяЧасть2.Добавить();
    СтрокаТабличнойЧасти.Код = Массив1[Сч];
    СтрокаТабличнойЧасти.Наименование = Массив2[Сч];
    СтрокаТабличнойЧасти.ЦенаПрайса = Массив3[Сч];
    СтрокаТабличнойЧасти.КурсВалютыПрайса = 1; // руб

    КонецЦикла;

    // закрываем книгу
    КнигаИзФайла.Close();


    2) создание объектов идет в транзакции? я бы фиксировал транзакцию через каждую 1000 элементов например.

    что-то типа

    НачатьТранзакцию();
    НомерСтроки = 0;

    Для Каждого СтрокаТаблЧасти Из ТаблЧасть

    НомерСтроки = НомерСтроки + 1;

    // тут обработка строки

    Если НомерСтроки=1000 Тогда

    ЗафиксироватьТранзакцию();
    НачатьТранзакцию();
    НомерСтроки = 0;

    КонецЕсли;

    КонецЦикла;

    ЗафиксироватьТранзакцию();

    3) можно в несколько проходов обрабатывать таблицу. например сначала создать Единицы, потом создать Номенклатуру, потом привязать единицы к номенклатуре по владельцу, затем загрузить свойство1, затем свойство 2 итд

    4) базу можно на сервере создать.. якобы есть ограничения на максимальный размер используемой памяти в файловом варианте.. вполне вероятно тот же код на клиент-сервере отработает.
  7. Andy13
    Offline

    Andy13 Опытный в 1С

    Регистрация:
    1 мар 2010
    Сообщения:
    244
    Симпатии:
    2
    Баллы:
    29
    Память съедают вот эти строки:

    НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
    НайденнаяЕдиницаОбъект = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
    НоваяЗаписьХарактер = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
    ТекЗапись = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();

    Вся эта куча объектов будет уничтожена только после закрытия обработчика. Памяти съедает немеряно.
    Подумайте как использовать повторно элементы. Я полагаю что объявить их для начала переменными
    очень поможет - будут использоваться повторно.
    Или вот менеджеры наборов записей можно в начале раз объявить и далее просто перепозиционировать (создавать новые записи).

Поделиться этой страницей