Задание:
Есть файл 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 Тогда ОбходДерева(тСтр,номГр.Ссылка); КонецЕсли; КонецЦикла; КонецПроцедуры &Насервере Процедура ОбходНаСервере() тДерево = РеквизитФормыВЗначение("Дерево"); ОбходДерева(тДерево); КонецПроцедуры &НаКлиенте Процедура СоздатьПапкиКаталогаНоменклатуры(Команда) ОбходНаСервере(); КонецПроцедуры #конецОбласти