Информационный поток
Задания вакансии материалы разработки сообщения форума
Форум

Обсуждение к заданию: 1с 7.7 доработка внешней обработки

    • #1
    • 22.02.2016 12:02
    0
    Есть обработка "Загрузка из DBF" которая создает приходные накладные в "ТиС". В процессе создания проходит сопоставление с номенклатурой. Проблема – в формате базы данных d...  Подробнее>>
    • #2
    • 22.02.2016 12:03
    0
    как идет процесс загрузки?
    может стоит сперва загрузить в тз, затем запросом через список проверить существующие, а то что не нашел создать
    просто в SQL там есть некоторые определенные ньюансы
    • #3
    • 22.02.2016 12:09
    • Отредактировано: 22.02.2016 12:09:56
    0
    Часть кода:

    Процедура ЗаполнитьНовый()               
    
    	ТЗ_НомерДок = СоздатьОбъект("ТаблицаЗначений");
    	ТЗ_НомерДок.НоваяКолонка("НомерДок");
    	ТЗ_НомерДок.НоваяКолонка("ДатаДок");
    	ТЗ_Документы.УдалитьСтроки();
    	ДБФ = СоздатьОбъект("XBASE");
    	ДБФ.ОткрытьФайл(ИмяФайлаЗагрузки,,1);
    	НП = 0;   
    	ДБФ.Первая();  
    	Всего_Зап = ДБФ.КоличествоЗаписей();
    	Н_Зап = 1;
    	Пока ДБФ.ВКонце() = 0 Цикл
    		Если Н_Зап > Всего_Зап Тогда
    			Прервать;
    		КонецЕсли;
    		ДБФ.Перейти(Н_Зап); 
    		СтрПоиска = 0;
    		Если ТЗ_НомерДок.НайтиЗначение(ДБФ.NKL_NUM, СтрПоиска, 1) = 0 Тогда
    			ТЗ_НомерДок.НоваяСтрока();
    			ТЗ_НомерДок.НомерДок = ДБФ.NKL_NUM;
    			ТЗ_НомерДок.ДатаДок  = ДБФ.NKL_DATE;
    		КонецЕсли;
    		Н_Зап = Н_Зап + 1;
    	КонецЦикла;
    	ПеремСтрока = 0;
    	Если ТЗ_НомерДок.ВыбратьСтроку(ПеремСтрока) = 1 Тогда 
    		ПеремНомерДок = ТЗ_НомерДок.ПолучитьЗначение(ПеремСтрока, 1);
    	Иначе
    		ПеремНомерДок = "";
    	КонецЕсли;
    	
    	
    	Ном = СоздатьОбъект("Справочник.Номенклатура");
    	Ном.ВыбратьЭлементы(); 
    	ТЗ_Документы.УдалитьСтроки();
    
    	ДБФ = СоздатьОбъект("XBASE");
    	ДБФ.ОткрытьФайл(ИмяФайлаЗагрузки,,1);
    	НП = 0;   
    	ДБФ.Первая();  
    	//ДБФ.ТекущийИндекс("idxOS_Name2");
    	Всего_Зап = ДБФ.КоличествоЗаписей();
    	Н_Зап = 1;
    	Пока ДБФ.ВКонце() = 0 Цикл
    		Если Н_Зап > Всего_Зап Тогда
    			Прервать;
    		КонецЕсли;
    		ДБФ.Перейти(Н_Зап); 
    		
    		Если ПеремНомерДок = ДБФ.NKL_NUM Тогда
    			
    			ТЗ_Документы.НоваяСтрока();
    			ТЗ_Документы.Флаг = 1;    
    			ТЗ_Документы.ТТ   = ДБФ.NAME_KLI;
    			ТЗ_Документы.НомерДок   = ДБФ.NKL_NUM;
    			ТЗ_Документы.ДатаДок    = ДБФ.NKL_DATE;     
    			ФлагНайден = 0;
    			Ном.ВыбратьЭлементы();
    			Пока Ном.ПолучитьЭлемент() = 1 Цикл
    				Если (СокрЛП(Ном.Наименование) = СокрЛП(ДБФ.NAME_TOV)) и (Ном.Емкость = Число(ДБФ.NETTO)/1000) Тогда  
    					ФлагНайден = 1;
    					ТЗ_Документы.Товар      = Ном.ТекущийЭлемент(); 
    					ТЗ_Документы.Емк_Наша   = Ном.Емкость;
    					ТЗ_Документы.НовыйТовар = "";
    					Прервать;
    				КонецЕсли;	
    			КонецЦикла;
    			
    			Если ФлагНайден = 0 Тогда
    				ТЗ_Документы.Товар      = "НОВЫЙ"; 
    				ТЗ_Документы.НовыйТовар = СокрЛП(ДБФ.NAME_TOV);
    				ТЗ_Документы.Емк_Наша   = "";
    			КонецЕсли;
    			
    			ТЗ_Документы.Колво        = ДБФ.KOLICH;     
    			ТЗ_Документы.Изготовитель = ДБФ.NAME_IZG;
    			ТЗ_Документы.Цена         = ДБФ.PRICE;
    			ТЗ_Документы.Емкость      = Число(ДБФ.NETTO)/1000;
    			ТЗ_Документы.ДатаРозлива  = ДБФ.DATE_IZG;
    			ТЗ_Документы.Спирт        = ДБФ.SPIRT; 
    			ТЗ_Документы.Регион       = ДБФ.REGI;  
    			
    		КонецЕсли; 
    		
    		Н_Зап = Н_Зап + 1;
    	КонецЦикла;	  
    
    	Предупреждение("Обработка Завершена");
    КонецПроцедуры
    • #4
    • 22.02.2016 12:16
    0
    По тексту у вас в справочнике номенклатура с одинаковыми наименованиями?
    Надо данные видеть, чтобы понять как там оптимизировать. Ну и "второстепенные задачи" развернуть бы для оценки.
    • #5
    • 22.02.2016 12:26
    0
    надо все полностью переписать, без запроса будет работать медленно
    а таблицу можно просто свернуть выгрузка в таблицу и сворачивание будет явно быстрее чем как тут написано
    • #6
    • 22.02.2016 13:25
    0
    все будет играть сервер.
    • #7
    • 22.02.2016 14:44
    0
    Да, обработку надо оптимизировать. При таком коде в скуле она быстрее работать не будет.
    • #8
    • 22.02.2016 14:54
    0
    а цены Вы два дня формируете что ли ?
    • #9
    • 22.02.2016 14:55
    0
    если два дня - уходите на восьмерку
    • #10
    • 22.02.2016 16:43
    0
    	Пока ДБФ.ВКонце() = 0 Цикл
    ..............
    			Ном.ВыбратьЭлементы();
    			Пока Ном.ПолучитьЭлемент() = 1 Цикл
    			Если (СокрЛП(Ном.Наименование) = СокрЛП(ДБФ.NAME_TOV)) и (Ном.Емкость = Число(ДБФ.NETTO)/1000) Тогда  
    					ФлагНайден = 1;
    					ТЗ_Документы.Товар      = Ном.ТекущийЭлемент(); 
    					ТЗ_Документы.Емк_Наша   = Ном.Емкость;
    					ТЗ_Документы.НовыйТовар = "";
    					Прервать;
    				КонецЕсли;	
    			КонецЦикла;
    ...............			
            КонецЦикла;
    


    за такое во времена инквизиции на костре сжигали
    конечно, у вас будет долго обработка работать, если при обработке КАЖДОЙ строки из файла - она перелопачивает весь справочник номенклатуры в поисках совпадения
    обработку надо похоронить и написать заново, без "гуанокода"
    • #11
    • 22.02.2016 16:59
    0
    тогда нужно новое техническое задание , Николай ?
    • #12
    • 22.02.2016 17:08
    +1
    Научно доказанный факт из психологии:
    "Если приложить текст своей обработки на 1clancer в открытом виде, то ребята все сделают бесплатно"
    ;-)
    привито в головах с kuban и mista
Яндекс-директ
Для участия в обсуждении Вам необходимо авторизоваться либо   зарегистрироваться