Имя: Пароль:
1C
1C 7.7
v7: Построение дерева категорий 1с77
,
0 BalBess
 
22.06.16
07:59
Подскажите уважаемые, может есть у кого , поиском не нашел
Мне надо выгрузить список категорий из справочника в таблицу значений
Главное условие, чтобы была ссылка на ID родительской категории. Для построения дерева.
1 BalBess
 
22.06.16
08:01
Дело в том, что у категории нет какого-либо уникального ID, т.е. нужно будет присваивать какой-то уникальный ID
И еще трудность в том, что заранее не известна глубина вложенности
2 Mikeware
 
22.06.16
08:06
чиво?
зы. ид есть всегда
3 BalBess
 
22.06.16
08:09
вот то что пока накидал, и больше ничего в голову не лезет ((


        ТабЗнач = СоздатьОбъект("ТаблицаЗначений");

        ТабЗнач.НоваяКолонка("Id");
        ТабЗнач.НоваяКолонка("Parent_Id");
        ТабЗнач.НоваяКолонка("Уровень");
        ТабЗнач.НоваяКолонка("Категория");

        СпрКатегорииТоваров=СоздатьОбъект("Справочник.Номенклатура");
        СпрКатегорииТоваров.ИспользоватьРодителя(Группа);
        СпрКатегорииТоваров.ВключатьПодчиненные(1);
        СпрКатегорииТоваров.ВыбратьЭлементы(1);
    
        Ид = 1;
        Парент_Ид = 0;
        
        Пока СпрКатегорииТоваров.ПолучитьЭлемент() = 1 Цикл
            Если СпрКатегорииТоваров.ЭтоГруппа() = 0 Тогда
                Продолжить;
            КонецЕсли;
            Если СпрКатегорииТоваров.ПометкаУдаления()=1 Тогда
                Продолжить;
            КонецЕсли;
            
            ТабЗнач.НоваяСтрока();
            ТабЗнач.Категория = СпрКатегорииТоваров.ТекущийЭлемент();
            ТабЗнач.Уровень = СпрКатегорииТоваров.Уровень();
            
            ТабЗнач.Id = Ид; //?????
            ТабЗнач.Parent_Id = Парент_Ид; //???????????
            
            Ид = Ид + 1;
            
            //
            //  ????
            //
            
//            Сообщить("" + ТабЗнач.Уровень + " - " + СпрКатегорииТоваров.Наименование);
        КонецЦикла;
4 BalBess
 
22.06.16
08:11
(2) ну ИД есть (код), но он не уникальный, т.е. уникальный в пределах подчинения
и совершенно не "презентабельный". Там и буквы и цифры, кому что в голову прийдет, при заведении категории
5 Mikeware
 
22.06.16
08:30
(4) а ид и не должен быть  "презентабельным". он должен быть однозначно идентифицирующим.
например,как "полный код".
к еще есть и уникальный ид у каждого элемента (включая группы).
До него можно тоже добраться, даже штатными языковыми средствами.
6 BalBess
 
22.06.16
08:40
(5) "полный код" - идет со слешами, если только слеши убрать.. надо будет попробовать
и про "внутренний" ИД тоже почитаю, спасибо
7 Mikeware
 
22.06.16
08:43
(6) чем мешают слеши?
8 fbear
 
22.06.16
08:50
ЗначениеВСтрокуВнутр(<Элемент>) отличный же идентификатор
9 Mikeware
 
22.06.16
08:51
(8) не длинноват? :-)
10 ShoGUN
 
22.06.16
08:52
(6) Огласите весь список требований к идентификатору. Слэши совершенно не мешают, если конечно не хочется непременно числовой идентификатор.
11 BalBess
 
22.06.16
09:05
(7) (8) (9) (10) - идентификатор будет индексом в массиве (на сайте) для построения дерева каталога, чем он короче и проще, тем быстрее будет экспорт, да и сайт будет быстрее работать
Слеши там недопустимы
12 Mikeware
 
22.06.16
09:08
(11) открой для себя 1с++, и функцию ЗначениеВСтрокуБД()
13 Mikeware
 
22.06.16
09:09
(11) и его длина на скорость будет влиять очень мало.
14 BalBess
 
22.06.16
09:11
Представляете себе индекс массива:
{"B","0","0","33","0","0","     10275   "} - ЗначениеВСтрокуВнутр(<Элемент>)

000000000000001/00000000000005/000000000000009/000000000000003 - ПолныйКод()

(13) может и так, буду пробовать
15 Ёпрст
 
22.06.16
09:39
если религия не позволяет, то на вот
http://my1c-archive.narod.ru/knowhow/get_id.html
16 Mikeware
 
22.06.16
09:40
(14) объем большой, а скорость та же.
17 Ёпрст
 
22.06.16
09:51
Можно так еще

Функция глПолучитьОбъектИД(Объект) Экспорт
// Функция получает ИД объекта
// Объект - объект метаданных
    Перем Сп,Стр;
    Сп=СоздатьОбъект("СписокЗначений");
    Сп.ДобавитьЗначение("",Объект);
    Сп.ПолучитьЗначение(1,Стр);
    Возврат Число(Стр);
КонецФункции   // глПолучитьИДОбъекта
18 Ёпрст
 
22.06.16
09:51
Или так, самый короткий из штатных

СтрокаДействийФормы=Объект;
Сообщить(СтрокаДействийФормы);

©РупорАбсурда или Абрахамс, не вспомню ужо, кто первый нашел
19 BalBess
 
22.06.16
10:09
(15) - (18)  все это хорошо, только поле parent_id на сайте число ((

parent_id INT(10) UNSIGNED NOT NULL DEFAULT '0'

менять структуру таблицы я боюсь, нарушу что-нибудь
придется что-то изобретать, алгоритм который будет на ходу присваивать ИД и parent_id
20 Ёпрст
 
22.06.16
10:15
Ё...
в (17) число, если че
21 Ёпрст
 
22.06.16
10:16
и в клюшках, ид - это число, если че, только в другой системе счисления приведенный к строке
22 BalBess
 
22.06.16
10:26
(20) (21) понял, будем копать, спасибо
23 Mikeware
 
22.06.16
10:28
(21) если нет УРБД
24 SiAl-chel
 
22.06.16
10:28
(22) в (21) - правда, система счисления 36-ричная.
25 Mikeware
 
22.06.16
10:31
(22) а чего тут копать? _StrToId() и _IdToStr()
26 BalBess
 
22.06.16
10:48
(17) больше всего понравилась, а она точно выдает уникальные номера для каждого элемента? Если таких элементов несколько тысяч?
(25) - честно говоря не разобрался
пробую так:
Сообщить("" + _StrToId(СпрКатегорииТоваров.ТекущийЭлемент()));

выдает то нули, то отрицательные значения
27 Mikeware
 
22.06.16
10:52
(26) ей нужно скармливать (15) или (17) или (12)
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан