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

Загрузка текстового файла с количеством позиций более 300 000 наименований,как настроить загрузку порциями?

Автор ZSS, 10 окт 2016, 10:35

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

ZSS

Для Сч = 1 по Строк Цикл     
      
      Состояние("Обрабатывается строка " + Сч + " из " + Строк);
                             
      ТекСтрокаНач   = Текст.ПолучитьСтроку(Сч); 
      ТекСтрока      = СтрЗаменить(ТекСтрокаНач,";",Символы.ПС);
      
      Если СтрЧислоСтрок(ТекСтрока) < 9 Тогда
         Сообщить("Пропустили строку: " + ТекСтрокаНач);
         Продолжить;
      КонецЕсли;     
      
      Реферанс   = СтрЗаменить(СтрПолучитьСтроку(ТекСтрока,1),"""","");
      Реферанс   = СокрЛП(Реферанс);       
      
      Цена      = Число(СтрПолучитьСтроку(ТекСтрока,8));
      Цена      = Окр(Цена * 1.18,0,1);
      
      Попытка
         Семья      = Число(СтрЗаменить(СтрПолучитьСтроку(ТекСтрока,3),"""",""));
      Исключение   
         Семья      =0;
      КонецПопытки;
         
      Сегмент      = СокрЛП(СтрЗаменить(СтрПолучитьСтроку(ТекСтрока,4),"""",""));
      
      П   = Найти(Реферанс,"`");
      Если П > 0 Тогда
         Реферанс   = Сред(Реферанс,П + 1);
      КонецЕсли;
                                                   
      Если ПустаяСтрока(Реферанс) Тогда
         Сообщить("Пропустили строку: " + ТекСтрокаНач + ". Пустой реферанс");
         Продолжить;
      КонецЕсли;
      
      Сообщить("Обрабатываем реферанс: " + Реферанс);
                     
      ПропуститьЗагрузкуЦены   = 0;
      
      Если Цена > 0 Тогда
      Иначе
         Сообщить("Пропустили. Нет цены.");
         ПропуститьЗагрузкуЦены   = 1;
      КонецЕсли;     
      
      НашлиНом = спрНоменклатура.НайтиПоРеквизиту("Артикул",Реферанс);
      Если  НашлиНом = спрНоменклатура.ПустаяСсылка() Тогда
         //Сообщить("Пропустили. Не найден реферанс: " + Реферанс,"!");
         Продолжить;
      КонецЕсли;     
      
      Если НашлиНом.ЭтоГруппа Тогда
         Продолжить;
      КонецЕсли;   
      
      ЦенаПродажа = обПолучитьЦену(ВыбТипЦен,НашлиНом.Ссылка,,,,, , , );
      
      //сохраняем номенклатуру
      //СохранятьНоменклатуру   = 0;
      //Если НашлиНом.Семья <> Семья Тогда
      //   НашлиНом.Семья   = Семья;
      //   СохранятьНоменклатуру   = 1;
      //КонецЕсли;
      //
      //Если СокрЛП(НашлиНом.Сегмент) <> Сегмент Тогда
      //   НашлиНом.Сегмент   = Сегмент;
      //   СохранятьНоменклатуру   = 1;
      //КонецЕсли;                       
      //
      //Если СохранятьНоменклатуру = 1 Тогда
      //   НашлиНом.Записать();
      //КонецЕсли;
      //сохраняем номенклатуру             
      
      Если ПропуститьЗагрузкуЦены   = 0 Тогда
      Иначе
         Продолжить;
      КонецЕсли;      
      
      Если ФлагФиксЦеныПропустить = 1 Тогда
         Сообщить("Пропустили. Цена зафиксирована.");
         Продолжить;
      КонецЕсли;        
      
      ВалютаТипаЦены = обВалютаТипаЦены(, ВыбТипЦен);
      Если Рубли<>ВалютаТипаЦены Тогда
         Цена=обПересчет(Цена,ВалютаТипаЦены,КонецДня(ТекущаяДата()),Рубли,КонецДня(ТекущаяДата()));
      КонецЕсли;
      
      Если Цена<>ЦенаПродажа Тогда
         новстр = ДоОб.Товары.Добавить();
         новстр.БазоваяЕдиницаИзмерения = НашлиНом.ОсновнаяЕдиницаИзмерения;
         новстр.ЕдиницаИзмерения = НашлиНом.ОсновнаяЕдиницаИзмерения;
         новстр.Коэффициент = 1;
         новстр.Номенклатура = НашлиНом;
         //новстр.ПроцентНаценки = Запрос.Процент;
         новстр.Цена = Цена;
         
         Сообщить("Установлена цена: " + СокрЛП(Цена));
         ОбновленоЦен   = ОбновленоЦен   + 1;
         
         Если ДоОб.Товары.Количество()>2000 Тогда
            ДоОб.Записать(РежимЗаписиДокумента.Проведение);
            ДоОб.УстановитьНовыйНомер();
            
            ДоОб = ДокЦены.СоздатьДокумент();
            ДоОб.Дата = ТекущаяДата();
            ДоОб.ДатаНачалаДействия = ТекущаяДата();
            ДоОб.ДатаОперации = ТекущаяДата();
            ДоОб.ДатаСоздания = ТекущаяДата();
            ДоОб.ТипЦен = ВыбТипЦен;
            ДоОб.ВалютаДокумента = Рубли;
         КонецЕсли;
      КонецЕсли;
   КонецЦикла;

ZSS

Полный код обработки

//*******************************************
Процедура Обработать()
   Если НЕ ЗначениеЗаполнено(ВыбТипЦен) Тогда
      Предупреждение("Тип цен не выбран");
      Возврат;
   КонецЕсли; 
   
   Если ФлагФиксЦеныПропустить = 1 Тогда
   ИначеЕсли Вопрос("Обработать зафиксированные цены ?",РежимДиалогаВопрос.ДаНет) <>  КодВозвратаДиалога.Да Тогда
      Возврат;
   КонецЕсли;             
   
   Файл =  Новый Файл(ВыбФайл);
   Если НЕ Файл.Существует() Тогда
      сообщить("Файл не найден или не доступен.");
      Возврат;
   КонецЕсли;
   
   спрНоменклатура   = Справочники.Номенклатура;
   ДокЦены         = Документы.ИзменениеЦен; 
                          
   Текст = Новый ТекстовыйДокумент;
   Текст.Прочитать(ВыбФайл);
   
   Строк   = Текст.КоличествоСтрок();   
   
   ОбновленоЦен   = 0;
   
   Рубли = Константы.ВалютаРегламентированногоУчетаОрганизаций.Получить();
   
   ДоОб = ДокЦены.СоздатьДокумент();
   ДоОб.Дата = ТекущаяДата();
   ДоОб.ДатаНачалаДействия = ТекущаяДата();
   ДоОб.ДатаОперации = ТекущаяДата();
   ДоОб.ДатаСоздания = ТекущаяДата();
   ДоОб.ТипЦен = ВыбТипЦен;
   ДоОб.ВалютаДокумента = Рубли;
   
   Для Сч = 1 по Строк Цикл     
      
      Состояние("Обрабатывается строка " + Сч + " из " + Строк);
                             
      ТекСтрокаНач   = Текст.ПолучитьСтроку(Сч); 
      ТекСтрока      = СтрЗаменить(ТекСтрокаНач,";",Символы.ПС);
      
      Если СтрЧислоСтрок(ТекСтрока) < 9 Тогда
         Сообщить("Пропустили строку: " + ТекСтрокаНач);
         Продолжить;
      КонецЕсли;     
      
      Реферанс   = СтрЗаменить(СтрПолучитьСтроку(ТекСтрока,1),"""","");
      Реферанс   = СокрЛП(Реферанс);       
      
      Цена      = Число(СтрПолучитьСтроку(ТекСтрока,8));
      Цена      = Окр(Цена * 1.18,0,1);
      
      Попытка
         Семья      = Число(СтрЗаменить(СтрПолучитьСтроку(ТекСтрока,3),"""",""));
      Исключение   
         Семья      =0;
      КонецПопытки;
         
      Сегмент      = СокрЛП(СтрЗаменить(СтрПолучитьСтроку(ТекСтрока,4),"""",""));
      
      П   = Найти(Реферанс,"`");
      Если П > 0 Тогда
         Реферанс   = Сред(Реферанс,П + 1);
      КонецЕсли;
                                                   
      Если ПустаяСтрока(Реферанс) Тогда
         Сообщить("Пропустили строку: " + ТекСтрокаНач + ". Пустой реферанс");
         Продолжить;
      КонецЕсли;
      
      Сообщить("Обрабатываем реферанс: " + Реферанс);
                     
      ПропуститьЗагрузкуЦены   = 0;
      
      Если Цена > 0 Тогда
      Иначе
         Сообщить("Пропустили. Нет цены.");
         ПропуститьЗагрузкуЦены   = 1;
      КонецЕсли;     
      
      НашлиНом = спрНоменклатура.НайтиПоРеквизиту("Артикул",Реферанс);
      Если  НашлиНом = спрНоменклатура.ПустаяСсылка() Тогда
         //Сообщить("Пропустили. Не найден реферанс: " + Реферанс,"!");
         Продолжить;
      КонецЕсли;     
      
      Если НашлиНом.ЭтоГруппа Тогда
         Продолжить;
      КонецЕсли;   
      
      ЦенаПродажа = обПолучитьЦену(ВыбТипЦен,НашлиНом.Ссылка,,,,, , , );
      
      //сохраняем номенклатуру
      //СохранятьНоменклатуру   = 0;
      //Если НашлиНом.Семья <> Семья Тогда
      //   НашлиНом.Семья   = Семья;
      //   СохранятьНоменклатуру   = 1;
      //КонецЕсли;
      //
      //Если СокрЛП(НашлиНом.Сегмент) <> Сегмент Тогда
      //   НашлиНом.Сегмент   = Сегмент;
      //   СохранятьНоменклатуру   = 1;
      //КонецЕсли;                       
      //
      //Если СохранятьНоменклатуру = 1 Тогда
      //   НашлиНом.Записать();
      //КонецЕсли;
      //сохраняем номенклатуру             
      
      Если ПропуститьЗагрузкуЦены   = 0 Тогда
      Иначе
         Продолжить;
      КонецЕсли;      
      
      Если ФлагФиксЦеныПропустить = 1 Тогда
         Сообщить("Пропустили. Цена зафиксирована.");
         Продолжить;
      КонецЕсли;        
      
      ВалютаТипаЦены = обВалютаТипаЦены(, ВыбТипЦен);
      Если Рубли<>ВалютаТипаЦены Тогда
         Цена=обПересчет(Цена,ВалютаТипаЦены,КонецДня(ТекущаяДата()),Рубли,КонецДня(ТекущаяДата()));
      КонецЕсли;
      
      Если Цена<>ЦенаПродажа Тогда
         новстр = ДоОб.Товары.Добавить();
         новстр.БазоваяЕдиницаИзмерения = НашлиНом.ОсновнаяЕдиницаИзмерения;
         новстр.ЕдиницаИзмерения = НашлиНом.ОсновнаяЕдиницаИзмерения;
         новстр.Коэффициент = 1;
         новстр.Номенклатура = НашлиНом;
         //новстр.ПроцентНаценки = Запрос.Процент;
         новстр.Цена = Цена;
         
         Сообщить("Установлена цена: " + СокрЛП(Цена));
         ОбновленоЦен   = ОбновленоЦен   + 1;
         
         Если ДоОб.Товары.Количество()>2000 Тогда
            ДоОб.Записать(РежимЗаписиДокумента.Проведение);
            ДоОб.УстановитьНовыйНомер();
            
            ДоОб = ДокЦены.СоздатьДокумент();
            ДоОб.Дата = ТекущаяДата();
            ДоОб.ДатаНачалаДействия = ТекущаяДата();
            ДоОб.ДатаОперации = ТекущаяДата();
            ДоОб.ДатаСоздания = ТекущаяДата();
            ДоОб.ТипЦен = ВыбТипЦен;
            ДоОб.ВалютаДокумента = Рубли;
         КонецЕсли;
      КонецЕсли;
   КонецЦикла;
   
   Если ДоОб.Товары.Количество()>0 Тогда
      ДоОб.Записать(РежимЗаписиДокумента.Проведение);
      ДоОб.УстановитьНовыйНомер();
   КонецЕсли;
   
   Предупреждение("Обновлено цен: " + ОбновленоЦен);
КонецПроцедуры                         

Процедура ПриОткрытии()
   ФлагФиксЦеныПропустить   = Истина;
КонецПроцедуры 

Процедура ВыбФайлНачалоВыбора(Элемент, СтандартнаяОбработка)
      СтандартнаяОбработка   = Ложь;
      _Файл      = "";
      _Каталог   = "";
      
      ВремФайл   = "";
      ФС = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
      ФС.Заголовок = "Открыть";
      ФС.Фильтр = "txt |*.txt";
      ФС.ПолноеИмяФайла = ВремФайл;
      Если НЕ ФС.Выбрать()Тогда
         Возврат;
      КонецЕсли;
      ВыбФайл   = ФС.ПолноеИмяФайла;
КонецПроцедуры


Afinogen

Синтаксис:

СтрЧислоСтрок(<Строка>)
Параметры:

<Строка> (обязательный)

Тип: Строка.
Исходная строка.
Возвращаемое значение:

Тип: Число.
Число строк.
Описание:

Позволяет посчитать число строк в многострочной строке. Строки в многострочной строке разделены символами перевода строк (Символы.ПС).

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример:

Для Х = 1 по СтрЧислоСтрок(ИсходныйТекст) Цикл
    ...
КонецЦикла;

т.е. определите общее количество строк
а затем ПолучитьСтроку()

Теги:

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

Рейтинг@Mail.ru Rambler's Top100

Поиск