Задание:

Есть файл Excell , где клиент расписал будущее дерево каталога справочника номенклатура.

Нужно в 1С по этому файлу сделать дерево каталога.

Разработка:

1 С экселем работать не будем, сразу переведем его в csv.

2 создадим на форме реквизит "дерево" с типом "деревоЗначений".

3 Напишем процедуру, с помощью которой мы будем выбирать файл csv и создавать дерево значений из него

&НаКлиенте
Процедура СоздатьДеревоГрупп1С(Команда)
ДиалогФыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); //!!!!!!!!!!!!
ДиалогФыбораФайла.Фильтр="csv файл с разделтелями (*.csv)|*.csv|";

ДиалогФыбораФайла.Заголовок = "Выберите файл";
ДиалогФыбораФайла.ИндексФильтра = 0;
описаниеОповещения = Новый ОписаниеОповещения("ГрузимИзФайла", ЭтотОбъект);
    
    ДиалогФыбораФайла.Показать(описаниеОповещения);	

КонецПроцедуры

&НаКлиенте
Процедура ГрузимИзФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт // вызываем диалог выбора файла
    
    Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда
      //  Сообщить("Файл выбран!");
//работаем с файлом
    Имяфайла=ВыбранныеФайлы[0];		
// Пишем в реестр
    сообщить(имяФайла); // вызываем дальнейшую процедуру обработки
	
// читаем файл	
ЗагружаемыйФайл = Новый ТекстовыйДокумент; 
ЗагружаемыйФайл.Прочитать(ИмяФайла);

	СоздаемДеревоПапок1с(ЗагружаемыйФайл);

    Иначе
        Сообщить("Файл не выбран!");
    КонецЕсли;
    

КонецПроцедуры

&наСервере
Процедура СоздаемДеревоПапок1с(ЗагружаемыйФайл)
тДерево = РеквизитФормыВЗначение("Дерево");	

// чтение 

Для НомерСтроки=1 по ЗагружаемыйФайл.КоличествоСтрок() Цикл
// получить стрoку с указанным номером и преобразуем её в массив 
Строка = ЗагружаемыйФайл.ПолучитьСтроку(НомерСтроки); 
МассивКол = РазложитьСтрокуВМассивПодстрок(Строка,";");// 
Для НомерЭлМассива=0 по МассивКол.количество()-1 цикл
	
	Если СтрДлина(массивКол[НомерЭлМассива])>0 тогда
	Каталог=сокрЛП(массивКол[НомерЭлМассива]); // найдено не пустое значение
	//смотрим вложенность каталога
	Если НомерЭлМассива=0 тогда // это новый корневой родитель
		нстр=тДерево.строки.добавить();
		нстр.каталог=каталог;
		//прервать;
	КонецЕсли;
	// влож 1
	Если НомерЭлМассива=1 тогда 
		нстр1=нстр.строки.добавить();
		нстр1.каталог=каталог;
		//прервать;
	КонецЕсли;
	// влож 2
	Если НомерЭлМассива=2 тогда 
		нстр2=нстр1.строки.добавить();
		нстр2.каталог=каталог;
		//прервать;
	КонецЕсли;
	// влож 3
	Если НомерЭлМассива=3 тогда 
		нстр3=нстр2.строки.добавить();
		нстр3.каталог=каталог;
		//прервать;
	КонецЕсли;
	// влож 4
	Если НомерЭлМассива=4 тогда 
		нстр4=нстр3.строки.добавить();
		нстр4.каталог=каталог;
		//прервать;
	КонецЕсли;
	// влож 5
	Если НомерЭлМассива=5 тогда 
		нстр5=нстр4.строки.добавить();
		нстр5.каталог=каталог;
		//прервать;
	КонецЕсли;
	// влож 6
	Если НомерЭлМассива=6 тогда 
		нстр6=нстр5.строки.добавить();
		нстр6.каталог=каталог;
		//прервать;
	КонецЕсли;
	// влож 7
	Если НомерЭлМассива=7 тогда 
		нстр7=нстр6.строки.добавить();
		нстр7.каталог=каталог;
		//прервать;
	КонецЕсли;
	// влож 8
	Если НомерЭлМассива=8 тогда 
		нстр8=нстр7.строки.добавить();
		нстр8.каталог=каталог;
		//прервать;
	КонецЕсли;
	// влож 9
	Если НомерЭлМассива=9 тогда 
		нстр9=нстр8.строки.добавить();
		нстр9.каталог=каталог;
		//прервать;
	КонецЕсли;
	// влож 10
	Если НомерЭлМассива=10 тогда
		нстр10=нстр9.строки.добавить();
		нстр10.каталог=каталог;
		//прервать;
	КонецЕсли;
	Если НомерЭлМассива=11 тогда
		нстр11=нстр10.строки.добавить();
		нстр11.каталог=каталог;
		//прервать;
	КонецЕсли;
	Если НомерЭлМассива=12 тогда
		нстр12=нстр11.строки.добавить();
		нстр12.каталог=каталог;
		//прервать;
	КонецЕсли;
	Если НомерЭлМассива=13 тогда
		нстр13=нстр12.строки.добавить();
		нстр13.каталог=каталог;
		//прервать;
	КонецЕсли;
	Если НомерЭлМассива=14 тогда 
		нстр14=нстр13.строки.добавить();
		нстр14.каталог=каталог;
		//прервать;
	КонецЕсли;
	Если НомерЭлМассива=15 тогда 
		нстр15=нстр14.строки.добавить();
		нстр15.каталог=каталог;
		//прервать;
	КонецЕсли;
	
	
	
конецЕсли;


	конецЦикла;


конецЦикла;	

ЗначениеВРеквизитФормы(тДерево,"дерево");
конецПроцедуры

Не стал я заморачиваться с оптимизацией кода, сделал до 15 уровня вложенности. Если кому нужно, можно оптимизировать с помощью команды "выполнить"

Описание:
Выполнить (Execute)
Синтаксис:
Выполнить(<Строка>)
Параметры: <Строка>

Строка, содержащая текст исполняемого кода.
Описание:
Позволяет выполнить фрагмент кода, который передается ему в качестве строкового значения.

В результате получил нужное дерево:

Чтобы из него создать группы в спр номенклатура выполняем вот такую процедуру:

&НаСервере
Процедура ОбходДерева(дерево,родитель=неопределено)
Для Каждого тСтр Из Дерево.Строки Цикл
	
Сообщить(тСтр.Каталог+", Родитель="+?(тстр.Родитель=неопределено,"",тстр.Родитель.каталог));//+Дерево.каталог);
// создаем папку номенклатуры
номГр=справочники.Номенклатура.СоздатьГруппу();
номГр.Наименование=сокрЛП(тСтр.Каталог);
если Родитель<>неопределено тогда // есть родитель
	номГр.Родитель=родитель;
конецЕсли;
номГр.Записать();
//конец создаем папку номенклатуры


Если тСтр.Строки.Количество()>0 Тогда
ОбходДерева(тСтр,номГр.Ссылка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры

&Насервере
Процедура ОбходНаСервере()
тДерево = РеквизитФормыВЗначение("Дерево");
ОбходДерева(тДерево);	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьПапкиКаталогаНоменклатуры(Команда)
ОбходНаСервере();
КонецПроцедуры
#конецОбласти

Добавить комментарий


Защитный код
Обновить