Импорт из csv в 1С

1. 20.09.10 14:02 Сейчас в теме
Всем доброго времени суток.
Подскажите пожалуйста как организовать импорт данных в 1с из фавйла csv.
Или направьте куда почитать.

Процедура ПрайсИзcsv()
	Перем ИмяПути,ИмяФайла;
	ИмяФайла = "1";
	ИмяПути="C:\";                                                                
	Если ФС.ВыбратьФайл(0,ИмяФайла, ИмяПути, "Открыть файл","*.csv",,) = 1 Тогда
		ТекстДок = СоздатьОбъект("Текст");
	КонецЕсли;	



Дальше я что-то туплю, не могу сдвинуться с мертвой точки.
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. jmw 20.09.10 14:28 Сейчас в теме
Ну, если в память влезет, то ТекстДок.Открыть(ИмяПути + ИмяФайла);
А затем пройтись по строкам: Для НомСтроки = 1 По ТекстДок.КоличествоСтрок() Цикл Стр = ТекстДок.ПолучитьСтроку(НомСтроки); КонецЦикла;
А потом разобрать строку на составляющие и т.д.
3. ilonnaa 20.09.10 17:10 Сейчас в теме
Функция РазобратьСтроку(Стр)
    СтрРазб = Стр;
    Рзд        = "    ";
    Сп         = СоздатьОбъект("СписокЗначений");
    Если Лев(СтрРазб,1) = Рзд Тогда
        СтрРазб = Сред(СтрРазб, 2);    
    КонецЕсли;             
    Инд = Найти(СтрРазб, Рзд);
    Пока Инд <> 0 Цикл
        ТекСтр = Сред(СтрРазб, 1, Инд - 1);
        Сп.ДобавитьЗначение(СокрЛП(ТекСтр));
        СтрРазб = Сред(СтрРазб, Инд + 1);
        Инд = Найти(СтрРазб, Рзд);
    КонецЦикла;
    для н = 1 по сп.размерсписка() Цикл
        Сообщить(сп.получитьзначение(н));
    КонецЦикла;
    Возврат Сп;
КонецФункции

Процедура ПрайсИзcsv() 
    Перем ИмяПути,ИмяФайла;
    ИмяФайла = ""; 
    ИмяПути=""; 
    Если ФС.ВыбратьФайл(0,ИмяФайла, ИмяПути, "Открыть файл","*.csv",,) = 1 Тогда 
        ТекстДок = СоздатьОбъект("Текст"); 
    КонецЕсли;
    ТекстДок.Открыть(ИмяПути + ИмяФайла); 
    НомерИмпортированнойСтроки = 0;
    Для НомСтроки = 1 По ТекстДок.КоличествоСтрок() Цикл 
        таб.новаястрока();
        Стр = ТекстДок.ПолучитьСтроку(НомСтроки);
        СЗ = РазобратьСтроку(Стр); 
            ТекСтрока = ТекстДок.ПолучитьСтроку(НомСтроки); 
            Спис = СоздатьОбъект("СписокЗначений");
            Спис = РазобратьСтроку(ТекСтрока);      
            ЛеваяСтрока="";
        //получаем данные... 
 
            Код         = СокрЛП(Спис.ПолучитьЗначение(1,ЛеваяСтрока));  //число - это номер колонки в текстовом файле 
 
            Модель     = СокрЛП(Спис.ПолучитьЗначение(2,ЛеваяСтрока));
            Наименование = СокрЛП(Спис.ПолучитьЗначение(3,ЛеваяСтрока));
            ТорговаяМарка = СокрЛП(Спис.ПолучитьЗначение(4,ЛеваяСтрока));    
            Сертификат3 = СокрЛП(Спис.ПолучитьЗначение(5,ЛеваяСтрока));    
            Кодф = СокрЛП(Спис.ПолучитьЗначение(6,ЛеваяСтрока));    
            Род = СокрЛП(Спис.ПолучитьЗначение(7,ЛеваяСтрока));    
            КолЕдиниц  = СокрЛП(Спис.ПолучитьЗначение(8,ЛеваяСтрока));    
            РозничнаяЦена = Число(СокрЛП(Спис.ПолучитьЗначение(9,ЛеваяСтрока)));    
            Куренси1 = Число(СокрЛП(Спис.ПолучитьЗначение(10,ЛеваяСтрока)));    
            Валюта = СокрЛП(Спис.ПолучитьЗначение(11,ЛеваяСтрока));    
      КонецЦикла; 
    
КонецПроцедуры
Показать


Так вот получилось, все работает.
А вот подскажите пожалуйста как мне так сделать что бы мне не только определенный csv который я сейчас делаю раскладывало, а так что бы любой csv беру и мне в таблицу его содержание выдает.
я так понимаю надо что-то типо функции разбиения столбцов и функцию заполнения таблицы по столбцам и строкам.
или универсальной такой разборки не сделать?
4. jmw 21.09.10 05:41 Сейчас в теме
Нужно для функции разбиения определить параметр - символ разделителя, чтобы было более универсально... и достаточно, если не хочешь попробовать другие способы (см. в синтакс-помошнике: СтрЗаменить и ИзСтрокиСРазделителями).
В процедурке ПрайсИзcsv кусок кода:
Если ФС.ВыбратьФайл(0,ИмяФайла, ИмяПути, "Открыть файл","*.csv",,) = 1 Тогда
    ТекстДок = СоздатьОбъект("Текст");
КонецЕсли; 

переделать на:
Если ФС.ВыбратьФайл(0,ИмяФайла, ИмяПути, "Открыть файл","*.csv",,) <> 1 Тогда
    Возврат;
КонецЕсли;
ТекстДок = СоздатьОбъект("Текст");

А то не красиво получается.
5. ilonnaa 21.09.10 09:54 Сейчас в теме
Вот что получилось, может будут ещё какие-то дополнения к коду.
Заранее спасибо
Функция РазобратьСтроку(Стр)    //Отделяет в строке столбцы
    СтрРазб = Стр;
    Рзд		= "	";
    Сп 		= СоздатьОбъект("СписокЗначений");
    Если Лев(СтрРазб,1) = Рзд Тогда
        СтрРазб = Сред(СтрРазб, 2);    
    КонецЕсли;             
    Инд = Найти(СтрРазб, Рзд);
    Пока Инд <> 0 Цикл
        ТекСтр = Сред(СтрРазб, 1, Инд - 1);
        Сп.ДобавитьЗначение(СокрЛП(ТекСтр));
        СтрРазб = Сред(СтрРазб, Инд + 1);
        Инд = Найти(СтрРазб, Рзд);
	КонецЦикла;
	Возврат Сп;
КонецФункции
	
Процедура ПрайсИзcsv()        //получает из *.csv или *.txt данные и раскладывает их
	Перем ИмяПути,ИмяФайла;
	ИмяФайла = ""; 
	ИмяПути=""; 
	Если ФС.ВыбратьФайл(0,ИмяФайла, ИмяПути, "Открыть файл","*.csv",,) <> 1 Тогда 
    Возврат; 
КонецЕсли; 
ТекстДок = СоздатьОбъект("Текст");   
	ТекстДок.Открыть(ИмяПути + ИмяФайла); 
    НомерИмпортированнойСтроки = 0;
//	ТЗ=СоздатьОбъект("ТаблицаЗначений");
	Для НомСтроки = 1 По 1 Цикл     //заполняет заголовки в таблице
		Стр = ТекстДок.ПолучитьСтроку(НомСтроки);
		СЗ = РазобратьСтроку(Стр); 
    	ТекСтрока = ТекстДок.ПолучитьСтроку(НомСтроки); 
        Спис = СоздатьОбъект("СписокЗначений");
	    Спис = РазобратьСтроку(ТекСтрока);      
    	ЛеваяСтрока="";
		Для  н = 1 по спис.размерсписка() Цикл
			Тз.новаяколонка(СокрЛП(Спис.ПолучитьЗначение(н,ЛеваяСтрока)),,,СокрЛП(Спис.ПолучитьЗначение(н,ЛеваяСтрока)));
		КонецЦикла;
		
	КонецЦикла;
	Для НомСтроки = 2 По ТекстДок.КоличествоСтрок() Цикл    //pfgjkyztn nf,kbwe
		Стр = ТекстДок.ПолучитьСтроку(НомСтроки);
		СЗ = РазобратьСтроку(Стр); 
    	    ТекСтрока = ТекстДок.ПолучитьСтроку(НомСтроки); 
        	Спис = СоздатьОбъект("СписокЗначений");
	        Спис = РазобратьСтроку(ТекСтрока);      
    	    ЛеваяСтрока="";
        //получаем данные
			Код 			= СокрЛП(Спис.ПолучитьЗначение(1,ЛеваяСтрока));  //число - это номер колонки в текстовом файле 
    	    Модель 			= СокрЛП(Спис.ПолучитьЗначение(2,ЛеваяСтрока));
        	Наименование	= СокрЛП(Спис.ПолучитьЗначение(3,ЛеваяСтрока));
	        ТорговаяМарка 	= СокрЛП(Спис.ПолучитьЗначение(4,ЛеваяСтрока));    
    	    РегистрацНомер 	= СокрЛП(Спис.ПолучитьЗначение(5,ЛеваяСтрока));    
        	ВнутКод			= СокрЛП(Спис.ПолучитьЗначение(6,ЛеваяСтрока));    
	        Род 			= СокрЛП(Спис.ПолучитьЗначение(7,ЛеваяСтрока));    
    	    КолЕдиниц  		= СокрЛП(Спис.ПолучитьЗначение(8,ЛеваяСтрока));    
        	РозничнаяЦена 	= СокрЛП(Спис.ПолучитьЗначение(9,ЛеваяСтрока));    
	        Куренси1 		= СокрЛП(Спис.ПолучитьЗначение(10,ЛеваяСтрока));    
    	    Цена2 			= СокрЛП(Спис.ПолучитьЗначение(11,ЛеваяСтрока));
			Валюта2			= СокрЛП(Спис.ПолучитьЗначение(12,ЛеваяСтрока));
			ТЗ.КоличествоКолонок(Макс(ТЗ.КоличествоКолонок(),Спис.РазмерСписка()));
   			НС=ТЗ.НоваяСтрока();
    		ТЗ.Заполнить(Спис,НС,НС);
	КонецЦикла; 
	
КонецПроцедуры    
Показать
6. jmw 21.09.10 10:04 Сейчас в теме
А зачем вообще ЛеваяСтрока ? - Однозначно убрать!

Писать нужно красиво!
Выдели в модуле весь текст обработки и нажми Ctrl+Shift+F
7. ilonnaa 21.09.10 10:28 Сейчас в теме
Вот обновленный код, значительно уменьшился)
Функция РазобратьСтроку(Стр)    //Отделяет в строке столбцы
	СтрРазб = Стр;
	Рзд		= "	";
	Сп 		= СоздатьОбъект("СписокЗначений");
	Если Лев(СтрРазб,1) = Рзд Тогда
		СтрРазб = Сред(СтрРазб, 2);    
	КонецЕсли;             
	Инд = Найти(СтрРазб, Рзд);
	Пока Инд <> 0 Цикл
		ТекСтр = Сред(СтрРазб, 1, Инд - 1);
		Сп.ДобавитьЗначение(СокрЛП(ТекСтр));
		СтрРазб = Сред(СтрРазб, Инд + 1);
		Инд = Найти(СтрРазб, Рзд);
	КонецЦикла;
	Возврат Сп;
КонецФункции

Процедура ПрайсИзcsv()        //получает из *.csv или *.txt данные и раскладывает их
	Перем ИмяПути,ИмяФайла;
	ИмяФайла = ""; 
	ИмяПути=""; 
	Если ФС.ВыбратьФайл(0,ИмяФайла, ИмяПути, "Открыть файл","*.csv",,) <> 1 Тогда 
		Возврат; 
	КонецЕсли; 
	ТекстДок = СоздатьОбъект("Текст");   
	ТекстДок.Открыть(ИмяПути + ИмяФайла); 
	НомерИмпортированнойСтроки = 0;
	//	ТЗ=СоздатьОбъект("ТаблицаЗначений");
	Для НомСтроки = 1 По 1 Цикл     //заполняет заголовки в таблице
		Стр = ТекстДок.ПолучитьСтроку(НомСтроки);
		СЗ = РазобратьСтроку(Стр); 
		ТекСтрока = ТекстДок.ПолучитьСтроку(НомСтроки); 
		Спис = СоздатьОбъект("СписокЗначений");
		Спис = РазобратьСтроку(ТекСтрока);      
		ЛеваяСтрока="";
		Для  н = 1 по спис.размерсписка() Цикл
			Тз.новаяколонка(СокрЛП(Спис.ПолучитьЗначение(н,ЛеваяСтрока)),,,СокрЛП(Спис.ПолучитьЗначение(н,ЛеваяСтрока)));
		КонецЦикла;
		
	КонецЦикла;
	Для НомСтроки = 2 По ТекстДок.КоличествоСтрок() Цикл    //заполняем таблицу значениями
		Стр = ТекстДок.ПолучитьСтроку(НомСтроки);
		СЗ = РазобратьСтроку(Стр); 
		ТекСтрока = ТекстДок.ПолучитьСтроку(НомСтроки); 
		Спис = СоздатьОбъект("СписокЗначений");
		Спис = РазобратьСтроку(ТекСтрока);      
		//получаем данные
		ТЗ.КоличествоКолонок(Макс(ТЗ.КоличествоКолонок(),Спис.РазмерСписка()));
		НС=ТЗ.НоваяСтрока();
		ТЗ.Заполнить(Спис,НС,НС);
	КонецЦикла; 
	
КонецПроцедуры   
Показать
Pablo112; +1 Ответить
8. Kurya 13 21.12.11 13:56 Сейчас в теме
Спис = СоздатьОбъект("СписокЗначений");
Поставь перед циклом. Будет значительно быстрее. Если строк мало - то это незаметно, а вот если много...
Вообще старайся СоздатьОбъект() в циклы не ставить. Лучше один раз создай, а потом если необходимо просто очищай.

ЗЫ: В данном коде Спис = СоздатьОбъект("СписокЗначений"); вообще не нужно. У тебя и так функция РазобратьСтроку возвращает СписокЗначений
9. varelchik 21.12.11 14:48 Сейчас в теме
А зачем все так сложно?
Берем 1С++
и все
ЗагрузитьВнешнююКомпоненту("1cpp.dll");
ИмяФайла = ""; 
ИмяПути=""; 
Если ФС.ВыбратьФайл(0,ИмяФайла, ИмяПути, "Открыть файл","*.csv",,) <> 1 Тогда 
   Возврат; 
КонецЕсли; 
ИТЗ=СоздатьОбъект("ИндексированнаяТаблица");
ИТЗ.ИзФайла(ИмяПути + ИмяФайла);
ИТЗ.ВыбратьСТроки();
ПОка ИТЗ.ПОлучитьСтроку()=1 Цикл
.. тута работаем с полями таблицы
КонецЦикла;
Показать
10. Devushka 33 25.01.12 06:19 Сейчас в теме
1С++ конечно хорошо, но надо в коде 1С
11. varelchik 10.02.12 10:08 Сейчас в теме
(10) Devushka,
А зачем скажите осложнять себе жизнь?
12. serega3333 10.02.12 11:42 Сейчас в теме
где csv там и текстовый файл можно сделать. прочитали построчно, разбили в массив - быстрее и удобнее
13. varelchik 14.02.12 12:49 Сейчас в теме
(12) serega3333,
Ага конечно.
А если файлик с количеством строк свыше 100 тыш?
Долго играться будете с ним.
14. Lyolik 8 17.06.12 13:54 Сейчас в теме
СЗ = РазобратьСтроку(Стр); - это,для чего нужно? СЗ нигде не используется. По-моему тоже лишнее.
15. ilonnaa 18.06.12 09:27 Сейчас в теме
(14) Lyolik, да это точно) потом в рабочей версии это исправлено, специально искал) но тут уже не писал, там потому что этот код оброс целым лесом всякой фигни))
16. wtlz 246 11.02.15 12:39 Сейчас в теме
Правда, для 8.2)

Текст = Новый ЧтениеТекста(ПутьКФайлуЗагрузки);
	
	ТЗ = Новый ТаблицаЗначений;
	ПерваяСтрока = Истина;
	Стр = Текст.ПрочитатьСтроку();
	Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки
		мсвСтрока = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр, ";");
		Если ПерваяСтрока Тогда
			Для каждого КолонкаМСВ Из мсвСтрока Цикл
				ИмяКолонки = КолонкаМСВ;
				ИмяКолонки = СтрЗаменить(ИмяКолонки, Символ(32), "");
				ИмяКолонки = СтрЗаменить(ИмяКолонки, "(", "");
				ИмяКолонки = СтрЗаменить(ИмяКолонки, ")", "");
				
				КолонкаТЗ = ТЗ.Колонки.Добавить(ИмяКолонки);
			КонецЦикла;
			ПерваяСтрока = Ложь;
		Иначе
			строкаТЗ = ТЗ.Добавить();			
			ИндексКолонки = 0;
			Для каждого Колонка Из ТЗ.Колонки Цикл
				строкаТЗ[Колонка.Имя] = мсвСтрока[ИндексКолонки];
				ИндексКолонки = ИндексКолонки + 1;
			КонецЦикла;	
			
		КонецЕсли;
		Стр = Текст.ПрочитатьСтроку();
	КонецЦикла;
Показать
MsDjuice; +1 Ответить
18. Chameleon1980 28.09.16 08:53 Сейчас в теме
17. DigitMan 28.09.16 03:27 Сейчас в теме
Универсальная загрузка/импорт из *.csv без 1с++
в таблицу значений с названиями колонок из файла.

тз.ВыбратьСтроку() можно удалить либо закомментировать (добавил для проверки результатов импорта).

Перем сп;

Функция РазобратьСтроку(Стр)
	Стр = СтрЗаменить(Стр,";""",";");
	Стр = СтрЗаменить(Стр,""";",";");
	Стр = """"+СтрЗаменить(Стр,";",""",""");
	сп.УдалитьВсе();
	сп.ИзСтрокиСРазделителями(Стр);
	Возврат Сп; 
КонецФункции 

Процедура Сформировать() 
	Перем ИмяПути,ИмяФайла; 
	ИмяФайла = ""; 
	ИмяПути=""; 
	сп = СоздатьОбъект("СписокЗначений");
	тз = СоздатьОбъект("ТаблицаЗначений");
	
	Если ФС.ВыбратьФайл(0,ИмяФайла, ИмяПути, "Открыть файл","*.csv|*.csv",,) <> 1 Тогда 
		Возврат; 
	КонецЕсли; 
	Т = СоздатьОбъект("Текст");
	Т.Открыть(ИмяПути + ИмяФайла);
	
	Для К = 1 По Т.КоличествоСтрок() Цикл
		Если К > Т.КоличествоСтрок() Тогда Прервать; КонецЕсли;
		Стр = Т.ПолучитьСтроку(К);
		Если ПустоеЗначение(Стр) = 1 Тогда Продолжить; КонецЕсли;
		сп = РазобратьСтроку(Стр);
		Если К = 1 Тогда
			//Создадим колонки
			Для М=1 По сп.РазмерСписка() Цикл
				тз.НоваяКолонка(сп.ПолучитьЗначение(М));
			КонецЦикла;
		Иначе
			//Заполним таблицу
			тз.НоваяСтрока();
			Для М=1 По тз.КоличествоКолонок() Цикл
				тз.УстановитьЗначение(тз.НомерСтроки,М,сп.ПолучитьЗначение(М));
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	
	тз.ВыбратьСтроку();
	//ДАЛЕЕ ОБРАБАТЫВАЕМ ТАБЛИЦУ ПО СВОЕМУ УСМОРТЕНИЮ
	
КонецПроцедуры
Показать
19. evn-zorin 28 28.04.18 07:55 Сейчас в теме
(17)
Перем ИмяПути,ИмяФайла;
ИмяФайла = "";
ИмяПути="";
сп = СоздатьОбъект("СписокЗначений");
тз = СоздатьОбъект("ТаблицаЗначений");

Если ФС.ВыбратьФайл(0,ИмяФайла, ИмяПути, "Открыть файл","*.csv|*.csv",,) <> 1 Тогда
Возврат;
КонецЕсли;
Т = СоздатьОбъект("Текст");
Т.Открыть(ИмяПути + ИмяФайла);

Для К = 1 По Т.КоличествоСтрок() Цикл
Если К > Т.КоличествоСтрок() Тогда Прервать; КонецЕсли;
Стр = Т.ПолучитьСтроку(К);
Если ПустоеЗначение(Стр) = 1 Тогда Продолжить; КонецЕсли;
сп = РазобратьСтроку(Стр);
Если К = 1 Тогда
//Создадим колонки
Для М=1 По сп.РазмерСписка() Цикл
тз.НоваяКолонка(сп.ПолучитьЗначение(М));
КонецЦикла;
Иначе
//Заполним таблицу
тз.НоваяСтрока();
Для М=1 По тз.КоличествоКолонок() Цикл
тз.УстановитьЗначение(тз.НомерСтроки,М,сп.ПолучитьЗначение(М));
КонецЦикла;
КонецЕсли;
КонецЦикла;

тз.ВыбратьСтроку();
//ДАЛЕЕ ОБРАБАТЫВАЕМ ТАБЛИЦУ ПО СВОЕМУ УСМОРТЕНИЮ
Показать

код совсем не рабочий, это для какой конфигурации?
21. jONES1979 22.12.18 09:24 Сейчас в теме
(19) это походу семёрочный был код. Я тоже сейчас накололся.
20. Slypower 1 28.04.18 09:40 Сейчас в теме
Совсем не рабочий - это как вы решили? Если не умеет использовать, то дело не в коде.
Используйте универсальную загрузку: из этой статьи
22. пользователь 23.06.22 15:51
Сообщение было скрыто модератором.
...
23. пользователь 24.06.22 16:18
Сообщение было скрыто модератором.
...
Оставьте свое сообщение
Вакансии
Программист с опытом реализации проектов через 1С:Конвертацию данных
Санкт-Петербург
зарплата от 1 300 руб.
Временный (на проект)

Инженер 1С
Ессентуки
зарплата от 120 000 руб. до 144 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 100 000 руб. до 250 000 руб.
Полный день

Программист 1С
Краснознаменск (Московская обл.)
зарплата от 150 000 руб. до 250 000 руб.
Полный день

Специалист техподдержки
Краснознаменск (Московская обл.)
зарплата от 50 000 руб. до 100 000 руб.
Полный день