Имя: Пароль:
1C
1C 7.7
v7: Загрузка справочника из excel
0 eXstyle
 
08.05.25
09:41
Здравствуйте. Есть документ excel из которого нужно загрузить группы и элементы.
пример справочника:
100 - группа 1
110 - Группа 2 у которой родитель группа 1
110.105.00 - Элемент 1 у которого родитель группа 2
120 - группа 3 у которой родитель группа 1
120.106.00 - Элемент 2 у которого родитель группа 3

200 - группа 4
210 - Группа 5 у которой родитель группа 4
210.105.00 - Элемент 1 у которого родитель группа 5
220 - группа 6 у которой родитель группа 4
220.106.00 - Элемент 2 у которого родитель группа 6


Процедура Выполнить()
     ExcelApp = СоздатьОбъект("Excel.Application");
     Спр = СоздатьОбъект("Справочник.ОсновныеСредства");

    Попытка
        Workbook = ExcelApp.Workbooks.Open("D:/os1.xlsx");
        Лист = Workbook.Sheets(1);
        
        Для НомерСтроки = 2 По Лист.UsedRange.Rows.Count Цикл  
            Название = Лист.Cells(НомерСтроки, 2).Value;
            Код = Лист.Cells(НомерСтроки, 1).Value;
    
//*********Вот как тут прописать обработку?*********        
            
КонецЦикла;
    
    
        Workbook.Close();
    Исключение

    КонецПопытки;
    ExcelApp.Quit();
КонецПроцедуры



Подскажите, пожалуйста, как правильно написать обработку.
1 Волшебник
 
08.05.25
09:43
Переходите на восьмёрку
2 Злопчинский
 
08.05.25
09:48
(0) и что именно непонятно?
Ты даже описать иерархию толком не смог.
200 - группа4 - какая нахер это четвертая группа? Это группа на том же уровне иерархии что и группа. При чем здесь счётчик групп?
3 eXstyle
 
08.05.25
09:56
(2) Группа4 - это условно название группы, а не иерархия. И вместо того, что бы с порога хамить научись внимательно читать, т.к. там расписано нормально что и куда.
4 Maniac
 
08.05.25
09:58
(1) на восьмерке - таких загрузок встроенных нет))
5 Злопчинский
 
08.05.25
09:58
Прочитал код. Если код короткий - значит группа, если длинный - элемент

Округлил числовое значение кода вниз до сотен.
Если округленное совпадает с исходным - группа первого уровня. Не совпадает - группа второго уровня.

Создал группу с исходным значение кода. Если группа первого уровня - норм. Если группа второго уровня - по округленному коду нашел группу-родитель, запихнул в родителя для группы второго уровня.

Если наткнулся на элемент - вырезал из кода элемента код группы, нашел группу-родитель, записал в родитель элемента.

Задача разовая, скорость не важна.
Хочешь красиво - можно кэшировать группу после создания, чтобы не искать ее для нижележащей иерархии. Можно с рекурсией нарисовать, можно без.

Сиди и пиши. Задавай содержательные вопросы.
6 Злопчинский
 
08.05.25
10:00
(3) там херня написана, а не нормально. Не хами учителю, выпорю. В такой задаче важны не наименования групп и элементов, а их коды и описание иерархии.
7 Злопчинский
 
08.05.25
10:01
Запихивать весь код в Попытку - так себе подход, говнокодом попахивает
8 Мультук
 
гуру
08.05.25
10:51
(0)

Начните с написания простейших функций для вашего импорта
Затем приходите с готовым кодом.

google:
1C 7.7 Функции работы со строками

google:
1C 7.7 Создать группу справочника

google:
1C 7.7 Найти группу справочника по коду


Функция НайтиКодРодителя(код)

   //Лев , Найти 

КонецФункции

Функция НайтиРодителяПоКоду(код)

КонецФункции

Функция ЭтоГруппа(код)

КонецФункции
9 Злопчинский
 
08.05.25
10:55
С ЭтоГруппа - может быть интересно ;-)
10 uno-group
 
08.05.25
11:16
если 7.7 не знаешь может быть проще  обработать сам файл excel разбив его на 2-3. Первый группы. или группы 1 уровня.
2 подгруппы. 3 элементы. Потом его можно стандартными обработками для загрузки справочника из excel загрузить.
11 Maniac
 
08.05.25
11:38
Могу предложить изврат))

Ставишь восьмерку - берешь готовую загрузку. Грузишь все.

А потом из восьмерки в семерку готовое))
12 Fedor-1971
 
08.05.25
11:38
(0) для начала определись с видом кода справочника - во всём справочнике или в пределах подчинения
потом, запиши свою эксельку в таблицу значений, отсортируй её по коду и начинай перебирать строки (чисто для твоего примера):
1-й проход создаём группы, где нет в коде точек (по уму, сначала ищем, потом создаём)
2-й проход ищем группу родитель и создаём подчинённую группу
3-й ищем родителей и пишем конечные элементы

Собственно, в твоём примере - коды в пределах подчинённости
13 Maniac
 
08.05.25
11:39
Но зато сто пудово косяков не наделаешь. Хотя бы проверить и увидеть все сможешь.
14 Chameleon1980
 
08.05.25
11:43
(11) забыл: + покупаешь поделку известного автора
15 Fedor-1971
 
08.05.25
11:45
(13) ни что не мешает вывести на форму обработки таблицу значений с колонками кодов для иерархии и потом создать элементы
16 Гость из Мариуполя
 
гуру
08.05.25
12:41
(11) Жека, не в обиду будь сказано, но в 7.7 это (загрузка справочника из Excel) было сделано много лет назад, многократно и разными людьми. Я, если память не отказывает, даже на сайте Белова  парочку подобного видел.

(0) автор, навскидку, первое попавшееся (и стоит всего ничего, сравнимо со стоимостью часа работы):
https://infostart.ru/marketplace/74800/

(и, кстати, все эти "группа1", "группа2", "группа4" - не оттуда ли, с ИС? Уж больно схожи обозначения, вплоть до... :)))
17 eXstyle
 
08.05.25
12:52
(11) - Спасибо, без этого хватает изврата=)
(16) - Нет, не оттуда. Вообще это классификатор ОС, которого нет. Вот и озадачили товарищи загрузить его=) Поэтому обозначения условное, но суть та же:
Код        | Название

100        | Группа1
110        | Подгруппа (Группа2 у которой родитель группа 1)
110.105.00 | Элемент 1

Ну и так далее. Если не совсем корректно изложил, то извиняюсь=)
(12) (15) - Вот через ТЗ и начал писать, посмотрим что выйдет=)
18 Гость из Мариуполя
 
гуру
08.05.25
13:55
Вообще это классификатор ОС
ОКОФ, что ли? хм.. мне мнилось, что в типовой бух 7.7 загрузка ОКОФ имеется из коробки. Но опять же - если память не подводит.
19 eXstyle
 
08.05.25
14:24
(18) В том то и дело что нету. Типовая конфигурация для РБ.
20 uno-group
 
08.05.25
14:56
(19) типовая типовой рознь. в бух была в торг нет или наоборот уже не помню. опять же найти и скачать для РФ 5 минут дела и скопировать отчет
21 eXstyle
 
08.05.25
14:57
Все! Всем спасибо! Все сделал через таблицу значений=)
22 Волшебник
 
08.05.25
15:36
(21) Покажи программный код
23 eXstyle
 
08.05.25
15:57
Может и криво и косо но свою задачу он выполнил.

                   Если СтрДлина(Код) = 3 Тогда
                            КД = Лев(Код,1);
                    КД= КД + "00";
                НКод = Код - КД;
                
                Если (НКод = 0) И (Спр.НайтиПоКоду(Код) = 0 )Тогда    
                    ТЗ.НоваяСтрока();
                    ТЗ.Код = Код;
                    ТЗ.Название = Название;  
                    Спр.НоваяГруппа();
                    Спр.Код = ТЗ.Код;
                    Спр.Наименование = Название;
                    Спр.Записать();
                Иначе
                    Сообщить("Группа 1 существует");
                КонецЕсли;
                
                Если (НКод > 0) И (Спр.НайтиПоКоду(Код) = 0) Тогда
                    ННКод = Лев(Код,1) + "00";
                    ТЗ.НоваяСтрока();
                    ТЗ.Код = Код;
                    ТЗ.Название = Название;
                    ТЗ.Код2 = ННКод;  
                    Спр2 = СоздатьОбъект("Справочник.ОсновныеСредства");
                    Если Спр2.НайтиПоКоду(ТЗ.Код2) = 1 Тогда                        
                    Спр.НоваяГруппа();
                    Спр.Код = ТЗ.Код;
                    Спр.Наименование = Название;  
                    Спр.Родитель = Спр2.ТекущийЭлемент();
                    Спр.Записать();
                    КонецЕсли;
                Иначе
                    Сообщить("Группа 2 существует");
               КонецЕсли;          
           КонецЕсли;
                
                Если (СтрДлина(Код) > 4) И (Спр.НайтиПоКоду(Код) = 0) Тогда
                    ННКод = Лев(Код,1) + "00";
                    ТЗ.НоваяСтрока();
                    ТЗ.Код = Код;
                    ТЗ.Название = Название;
                    ТЗ.Код3 = Лев(Код,3);  
                    Спр3 = СоздатьОбъект("Справочник.ОсновныеСредства");
                    Если Спр3.НайтиПоКоду(ТЗ.Код3) = 1 Тогда                        
                    Спр.Новый();
                    Спр.Код = ТЗ.Код;
                    Спр.Наименование = Название;  
                    Спр.Родитель = Спр3.ТекущийЭлемент();
                    Спр.Записать();
                    КонецЕсли;
                Иначе
                    Сообщить("Элемент существует");
               КонецЕсли;
24 Garykom
 
гуру
08.05.25
16:55
Нельзя полагаться на правильную сортировку строк файла эксель
Что произойдет если группа еще не создана а уже пытаемся создать элемент в этой группе?

Надо решать задачу в несколько проходов
Сначала создаем группы первого уровня, затем второго и т.д.
И уже после групп создаем элементы
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn