Имя: Пароль:
1C
1С v8
Как узнать родителя в Excel для конкретной строки.
0 AlexKulikov
 
16.01.17
11:21
Добрый день, уважаемые форумчане.
Столкнулся со следующей проблемой, а именно:
Есть файл Excel в нем указана номенклатура по группам, в таком виде:

Дуб
Светлый дуб
  Заказ светлого дуба №1
   Доска светлого дуба (кривая)
   Горбыль из светлого дуба
   Молот инквизитора из светлого дуба, освященный
  Заказ светлого дуба №2
   Светлый дуб для забора
   Ламинат из светлого дуба


Собственно вопрос, с помощью следующего кода
<code>
Лист.Rows(НС).OutlineLevel
</code>

Где НС - это номер строки, я могу узнать какой уровень родителя у каждой строки,
по моему примеру это будет для группы Дуб - уровень 1, для светлого дуба - 2, для заказов - 3, и для строк - 4.
А как понять какая именно строка к какой группе относится, где посмотреть имя родителя для каждой строки.

Очень надеюсь на Вашу помощь, с уважением Алексей.
1 vicof
 
16.01.17
11:33
5 секунд гугления, Алексей, 5 секунд. Это быстрее, чем создавать тему.
http://www.cyberforum.ru/vba/thread592172.html

С уважением, Александр.
2 AlexKulikov
 
19.01.17
14:59
Добрый день, уважаемые форумчане. Помогите пожалуйста, тупому барану загрузить номенклатуру по иерархии правильно.

Когда я первый раз гружу номенклатуру из excel Файла, у меня группы встают так как надо.
Но если я начинаю грузить его повторно, то опять начинают создаваться новые группы. И я не могу понять, где я ошибаюсь.

<code>
&НаСервере
Процедура ЗагрузитьНаСервере()
    
    Попытка    
        Эксель = Новый COMОбъект("Excel.Application");
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    
    НомерЛиста = 1;
    Книга = Эксель.Workbooks.Open(Объект.ИмяФайла);
    КоличествоЛистов = Книга.Sheets.Count;
    Лист = Книга.WorkSheets(НомерЛиста);
    ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
    ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
    
    //Поставщик = Лист.Cells(3,2).Value;
    
    
    ТаблицаНоменклатур  = Новый ТаблицаЗначений;
    
    ТипЧисло = Новый ОписаниеТипов("Число");
    
    ТаблицаНоменклатур.Колонки.Добавить("Номенклатура");
    ТаблицаНоменклатур.Колонки.Добавить("НоменклатураКод");
    ТаблицаНоменклатур.Колонки.Добавить("Цена");
    ТаблицаНоменклатур.Колонки.Добавить("ЕденицаИзмерения");
    ТаблицаНоменклатур.Колонки.Добавить("УровеньИерархии",ТипЧисло);
    ТаблицаНоменклатур.Колонки.Добавить("ИмяРодителя");
    
    МассивРодителей = Новый Массив;
    ТекущийУровень = 1;
    МассивРодителей.Вставить(1, "Верхний");
    Для НС = 11 по ВсегоСтрок Цикл // НС указываем с какой строки начинать обработку
            
        НоваяСтрока = ТаблицаНоменклатур.Добавить();
        НоваяСтрока.Номенклатура = СокрЛП(Эксель.Cells(НС, 2).Text);
        НоваяСтрока.НоменклатураКод = СокрЛП(Эксель.Cells(НС, 3).Text);
        НоваяСтрока.Цена = СокрЛП(Эксель.Cells(НС, 5).Text);
        НоваяСтрока.ЕденицаИзмерения = СокрЛП(Эксель.Cells(НС, 6).Text);
        НоваяСтрока.УровеньИерархии = СокрЛП(Лист.Rows(НС).OutlineLevel);
        ТекущийУровень = Число(НоваяСтрока.УровеньИерархии);
        Если ТекущийУровень = 1  Тогда
            НоваяСтрока.ИмяРодителя = НоваяСтрока.Номенклатура;
            МассивРодителей.Установить(1,НоваяСтрока.ИмяРодителя);
        Иначе

            Если МассивРодителей.Количество() <= ТекущийУровень Тогда
                НоваяСтрока.ИмяРодителя = МассивРодителей[ТекущийУровень - 1];
                МассивРодителей.Вставить(ТекущийУровень,НоваяСтрока.Номенклатура);
                
            Иначе
                ИскомаяСтрока = МассивРодителей.Получить(ТекущийУровень);
                НоваяСтрока.ИмяРодителя = МассивРодителей[ТекущийУровень - 1];
                МассивРодителей.Установить(ТекущийУровень,НоваяСтрока.Номенклатура);
            КонецЕсли;    
            
            
        КонецЕсли;
        
    КонецЦикла;
    
    
    Отбор = Новый Структура;
    ОтбрЗначение  = 1;
    Отбор.Вставить("УровеньИерархии", ОтбрЗначение);
    
    НайденныеСтроки = ТаблицаНоменклатур.НайтиСтроки(Отбор);    
    Для Каждого ТекСтрока Из НайденныеСтроки Цикл
        ТекСтрока.ИмяРодителя = "";
    КонецЦикла;    
    
    ТестСправочник = Справочники.Номенклатура.НайтиПоНаименованию("Полотна");
    
    
    Эксель.Application.Quit();
    
    
    НовыйДокументУстановкиЦенНоменклатуры = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    НовыйДокументУстановкиЦенНоменклатуры.Дата = ТекущаяДата();
        
    
    МассивРодителейДляСправочникаНоменклатур = Новый Массив;
    ТекущийУровень = 1;
    МассивРодителейДляСправочникаНоменклатур.Вставить(1, "Верхний");
    
    
    Для каждого Элемента Из  ТаблицаНоменклатур Цикл
        
        // ищу наоменклатуру по наоименованию в справочнике
        СправочникНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(Элемента.Номенклатура);
        
        Если  Не ЗначениеЗаполнено(СправочникНоменклатура) Тогда
            Если ПустаяСтрока(Элемента.Цена) Тогда
                
                НоваяГруппаСправочникаНоменклатуры =  Справочники.Номенклатура.СоздатьГруппу();
                НоваяГруппаСправочникаНоменклатуры.Наименование = Элемента.Номенклатура;
                УровеньРодителя = Элемента.УровеньИерархии;
                
                Родитель = Справочники.Номенклатура.ПустаяСсылка();
                Если УровеньРодителя  =  1 Тогда
                    НоваяГруппаСправочникаНоменклатуры.Родитель = Родитель;
                    НоваяГруппаСправочникаНоменклатуры.Записать();
                    Ссылка = НоваяГруппаСправочникаНоменклатуры.Ссылка;
                    МассивРодителейДляСправочникаНоменклатур.Установить(УровеньРодителя,Ссылка);
                Иначе        
                    Если МассивРодителейДляСправочникаНоменклатур.Количество() <= УровеньРодителя Тогда
                        Родитель = МассивРодителейДляСправочникаНоменклатур[УровеньРодителя - 1];
                        НоваяГруппаСправочникаНоменклатуры.Родитель = Родитель;
                        НоваяГруппаСправочникаНоменклатуры.Записать();
                        Ссылка = НоваяГруппаСправочникаНоменклатуры.Ссылка;
                        МассивРодителейДляСправочникаНоменклатур.Вставить(УровеньРодителя,Ссылка);
                    Иначе
                        Родитель = МассивРодителейДляСправочникаНоменклатур[УровеньРодителя - 1];
                        НоваяГруппаСправочникаНоменклатуры.Родитель = Родитель;
                        НоваяГруппаСправочникаНоменклатуры.Записать();
                        Ссылка = НоваяГруппаСправочникаНоменклатуры.Ссылка;
                        МассивРодителейДляСправочникаНоменклатур.Установить(УровеньРодителя,Ссылка);
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
        Иначе
            Если ПустаяСтрока(Элемента.Цена) Тогда
                СуперТестОпределинияРодителя = ОпределенияРодителяВСправочникеНоменклатураПоИмени(СправочникНоменклатура);
                    
                НоваяГруппаСправочникаНоменклатуры =  Справочники.Номенклатура.СоздатьГруппу();
                НоваяГруппаСправочникаНоменклатуры.Наименование = Элемента.Номенклатура;
                УровеньРодителя = 0;
                УровеньРодителя = Элемента.УровеньИерархии;
                Родитель = Справочники.Номенклатура.ПустаяСсылка();
                
                Если СуперТестОпределинияРодителя.Наименование <>  Элемента.ИмяРодителя Тогда
                    Если УровеньРодителя  =  1 Тогда
                        НоваяГруппаСправочникаНоменклатуры.Родитель = Родитель;
                        НоваяГруппаСправочникаНоменклатуры.Записать();
                        Ссылка = НоваяГруппаСправочникаНоменклатуры.Ссылка;
                        МассивРодителейДляСправочникаНоменклатур.Установить(УровеньРодителя,Ссылка);
                    Иначе        
                        Если МассивРодителейДляСправочникаНоменклатур.Количество() <= УровеньРодителя Тогда
                            Родитель = МассивРодителейДляСправочникаНоменклатур[УровеньРодителя - 1];
                            НоваяГруппаСправочникаНоменклатуры.Родитель = Родитель;
                            НоваяГруппаСправочникаНоменклатуры.Записать();
                            Ссылка = НоваяГруппаСправочникаНоменклатуры.Ссылка;
                            МассивРодителейДляСправочникаНоменклатур.Вставить(УровеньРодителя,Ссылка);
                        Иначе
                            Родитель = МассивРодителейДляСправочникаНоменклатур[УровеньРодителя - 1];
                            НоваяГруппаСправочникаНоменклатуры.Родитель = Родитель;
                            НоваяГруппаСправочникаНоменклатуры.Записать();
                            Ссылка = НоваяГруппаСправочникаНоменклатуры.Ссылка;
                            МассивРодителейДляСправочникаНоменклатур.Установить(УровеньРодителя,Ссылка);
                        КонецЕсли;
                    КонецЕсли;
                Иначе
                    Если УровеньРодителя  =  1 Тогда
                        МассивРодителейДляСправочникаНоменклатур.Установить(УровеньРодителя,СправочникНоменклатура);
                    Иначе
                        Если МассивРодителейДляСправочникаНоменклатур.Количество() <= УровеньРодителя Тогда
                            МассивРодителейДляСправочникаНоменклатур.Вставить(УровеньРодителя,СправочникНоменклатура);
                        Иначе
                            МассивРодителейДляСправочникаНоменклатур.Установить(УровеньРодителя,СправочникНоменклатура);
                        КонецЕсли;
                        
                    КонецЕсли;    
                КонецЕсли;    
                
            КонецЕсли;
            
        КонецЕсли;    
    КонецЦикла;    
        
КонецПроцедуры

</code>


<code>
&НаСервере
Функция ОпределенияРодителяВСправочникеНоменклатураПоИмени(СправочникНоменклатураГруппа)
    
    ИскомыйРод = "";
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Номенклатура", СправочникНоменклатураГруппа);
    Запрос.Текст = "ВЫБРАТЬ
    |    Номенклатура.Родитель
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.Ссылка = &Номенклатура";
    РезультатЗапроса = Запрос.Выполнить();
    ТаблицаРезультатаЗапроса = РезультатЗапроса.Выгрузить();
    Для каждого элемента Из  ТаблицаРезультатаЗапроса Цикл
        ИскомыйРод = Элемента.Родитель;
    КонецЦикла;
    
    Возврат ИскомыйРод;    
    
КонецФункции

</code>
3 DrZombi
 
гуру
19.01.17
15:19
(2) Раздели код на 2 части:
1. Чтение Екселя и помещение его в Древо, либо в ТЗ
2. Чтение ТЗ или Древа и запись его в БД

Будет проще понимать :)
4 DrZombi
 
гуру
19.01.17
15:20
+(2) Код громоздок и не читаемый, лениво