Имя: Пароль:
1C
1C 7.7
v7: Как определить структуру групп
0 Злопчинский
 
26.04.14
16:47
Грузим инфу из файла обмена.
есть инфа по структуре групп, например:
ЧЕХОЛ/ALCATEL/Alcatel OT-4007D Pixi/СИЛИКОН
.
как быстро и ПРАВИЛЬНО определить - имеется ли такая структура групп? как вообще кузявее подойти к решению такой задачи?
1 Злопчинский
 
26.04.14
16:47
От, елы палы...
"Как я не люлюня" читать "Как я не люблю обмены"
2 Злопчинский
 
26.04.14
16:50
тупо: отобрать запросом группы: в обходе результатов построить ПолноеНаименвание группы и искать группу из файла в этом множестве?
3 Torquader
 
26.04.14
16:59
(2) Ну, проще всего найти символы / (которые, кстати, в имени тоже быть могут) и проверить всё по каталогу.
P.S. проще было выгружать не полный путь, а имена всех родителей, разделённые запятыми, чтобы потом не заниматься "гаданием на кофейной гуще".
4 Wobland
 
26.04.14
17:11
(3) ээ.. а потом раздумывать, где у меня в файле элемент, где группа, а где другие данные?
5 Злопчинский
 
26.04.14
17:15
(3) ЧЕХОЛ/ALCATEL/Alcatel OT-4007D Pixi/СИЛИКОН
- это и есть имена всех родителей, разделенные слэшем.
в именах групп слешей нет.
.
вот как раз и интересует что есть в вашем понятии "...и проверить всё по каталогу..." - каким образом? (например группа СИЛИКОН может быть дочкой группы IPHONE 5S (т.е. в общем случае имя группы - не уникально, уникальна иерархия групп)
6 Wobland
 
26.04.14
17:17
а есть же что-то в этих ваших семёрках, которое полный путь возвращается?
7 Wobland
 
26.04.14
17:17
(6) *возвращает
8 Злопчинский
 
26.04.14
17:24
Че вы уперлись в этот полный путь? - ЕСТЬ!
вот этот полный путь: ЧЕХОЛ/ALCATEL/Alcatel OT-4007D Pixi/СИЛИКОН
это имена четырех групп, каждая последующая (слева направо) вложена в предыдущую...
9 Злопчинский
 
26.04.14
17:54
хм.. получил чорным запросом с пробегом по результату - перечень всех иерархий групп...
.
однакож.. если в группе нету элементов - такую группу не видно...
.
как в запрос включить все группы справочника..?
10 ifso
 
26.04.14
17:55
ЭтоГруппа для элемента, не?
11 Злопчинский
 
26.04.14
17:58
(10) угу, только что делать если в группе нет элементов?
12 Злопчинский
 
26.04.14
17:59
елы-палы, КонецЦикла или Ёпрст как-то вроде показывали хитрый финт (иля путаю)
13 ifso
 
26.04.14
18:06
(11) выбираешь все элементы, у которых ЭтоГруппа=1
есть в группе элементы или нет фиолетово
14 Torquader
 
26.04.14
18:06
(9) Где не видно ?
Если вы выбираете элементы и указываете полный путь, то почему потом нельзя проверить наличие этого полного пути ?
То есть мы выбираем из базы все элементы (у которых ЭтоГруппа()=1) и выводим для них полный путь (а не для их родителей) - получаем ТЗ, в которую можно засунуть читаемый полный путь.
15 Злопчинский
 
26.04.14
18:10
(13) (14) тупой выборкой - проблем нет.
а вот запросом - хрен вам с редиской.
16 ifso
 
26.04.14
18:13
(15) типа и функция запросная не спасет?
17 Злопчинский
 
26.04.14
18:13
прямым запросом все группы выбрать - не вопрос, только блин и для скуля писать, и для дбфа... да еще когда слаб в этих прямых запросах (надо уже сеть как-нить повтыкать)  (а потом пробежаться по ним с получкением полного пути ибо в запросе всякими транзитивными замфканиями и прочеими штуками - чтобы сразу из зхапроса получить все иерархии - я не умею...)
.
плюнул нафиг тупой выборокой выбрал, все равно на ожидаемых объемах задержка минимальная будет
18 Злопчинский
 
26.04.14
18:14
(16) может и спасет, ноя пока не дотумкиваю как... весь вопрос - как в запрос впихнуть группу, в которой нет элементов...
19 ifso
 
26.04.14
18:18
(18) Забудь про группы. Нет групп. Т.е. совсем. Есть элементы с признаком ЭтоГруппа=1
20 Torquader
 
26.04.14
18:19
(17) Прямой запрос данную выборку не ускорит, так как мы просто перебираем весь справочник, выбирая только группы.
Вопрос в другом - использовать ли функцию для получения полного наименования или получать его потом, когда мы загрузим все данные в таблицу значений.
21 Злопчинский
 
26.04.14
18:20
(19) во ты блин какой умный... ;-) попробуй чорным запросом получить в результатах запроса элемент (=группу), в которой нет элементов-записей.
.
текст запроса в студию.
.
а то я реально может туплю
22 Злопчинский
 
26.04.14
18:21
(20) полное наименование - пофиг, потом получим. хоть прямым перебором результатов запроса - так как групп существенно меньше чем элементов.
23 Torquader
 
26.04.14
18:22
(21) Ну, join из двух одинаковых таблиц, где выбирается элемент с пометкой это группа и соединение с той же таблицей по полям Id=Parent, но с условием, что Parent=Null или, если использовать Count(), то =0
24 ДенисЧ
 
26.04.14
18:23
Суббота?
Описание для НайтиПоНаименованию() украли?
25 ifso
 
26.04.14
18:25
(21) может не стОит пытаться взглянуть на гланды через "черный ход" ?)
26 Torquader
 
26.04.14
18:26
(24) Так ему нужно проверить существование группы - а если это окажется элемент, который по имени совпадает с группой ?
27 ifso
 
26.04.14
18:27
(26) Смирно! ЭтоГруппа к осмотру! )
28 Torquader
 
26.04.14
18:30
(27) Если у нас есть Группа1/Товар1, где товар - это элемент и запись Группа1/Товар1/ТочноТовар1, то при поиске по наименованию "Группа1/Товар1", что нам вернут ?
29 ДенисЧ
 
26.04.14
18:32
(28) А вот тут на сцену вылезает транзакция и удалить(1) !
30 Torquader
 
26.04.14
18:33
(29) И группа недовольных пользователей, которые замаялись ждать отката транзакции.
31 Злопчинский
 
26.04.14
18:33
(24) не нравится мне такая идея (пока).. параноик я... в общем случае (вот блин эти общие случаи) - что мешает сущестовавать элементу с таким же наименованием как группа...?
32 ДенисЧ
 
26.04.14
18:34
(30) Группа пользователей организованной группой идёт....
В аптеку!
33 Torquader
 
26.04.14
18:37
(32) За вазелином для программиста, который это придумал.
34 Torquader
 
26.04.14
18:37
В общем, если справочник не очень большой, то что мешает его весь один раз выбрать в таблицу и уже в этой таблице сортировать, искать и создавать ?
35 Злопчинский
 
26.04.14
18:37
не, программно-то всегда извернуться можно, не вопрос... но вот хотелось бы получить чорным запросом перечень всех иерархий + эдлемент соответсвующий последней группе в иерархии...

тогда прочитав из файла структуру групп типа
ЧЕХОЛ/ALCATEL/Alcatel OT-4007D Pixi/СИЛИКОН
ищем ее в таблице/результате запроса... если не нашли - делаем усекновение и ищем ЧЕХОЛ/ALCATEL/Alcatel OT-4007D Pixi - нашли, создаем в найденной группе подгруппу СИЛИКОН
36 Злопчинский
 
26.04.14
18:38
(34) ээээ блин.... так я тоже умею.. а потом начнется распятие.. быдлокод.. не думаешь о будущих поколениях
37 ifso
 
26.04.14
18:41
(28) по "Товар1" найдет группу
38 Torquader
 
26.04.14
18:42
(36) Зато минимальное время обращения к базе - а то, что код делает потом - это уже не важно.
Просто в 1С нет InStrRev - вот из-за этого г.внокод и получается.
39 Torquader
 
26.04.14
18:43
(37) Просто, если в Группа1 Существует элемент Товар1 и вложенная группа Товар1, то найдётся та, которая в dbf-файле встретится первой.
40 КонецЦикла
 
26.04.14
18:43
Тебе нужно запихать во вспомогательную таблицу в удобном виде эту инфу и все. Один раз. И пересоздавать записи при переносах групп в группу или при создании/удалении групп. Можно чтобы не париться перед процессом просто генерить ее и все, это быстро.
41 Злопчинский
 
26.04.14
18:48
(40) это понятно. объемы небольшие, можно даже хоть при каждом запуске перевыполнять заново.

ладно, как и ожидалось фиг кт о чем помог ;-)
.
но все равно всем спасибо!
42 КонецЦикла
 
26.04.14
18:56
(41) Готовое решение редко кто дает :)
43 Torquader
 
26.04.14
19:04
Процедура мпСоздатьСтруктуруПапок(пстрПолныйПуть,пстрИмяСправочника,пспрНашаПапка)
    Если ПустаяСтрока(пстрПолныйПуть)=1 Тогда
        пспрНашаПапка=ПолучитьПустоеЗначение("Справочник."+пстрИмяСправочника);
        Возврат;
    КонецЕсли;
    лспр=СоздатьОбъект("Справочник."+пстрИмяСправочника);
    лспрРодитель=ПолучитьПустоеЗначение("Справочник."+пстрИмяСправочника);
    лстрПутьДальше=пстрПолныйПуть;
    Пока 1=1 Цикл
        лч=Найти(лстрПутьДальше,"/");
        Если лч=0 Тогда Прервать;КонецЕсли;
        лстрИмя=Лев(лстрПутьДальше,лч-1);
        лспр.ИспользоватьРодителя(лспрРодитель);
        Если лспр.НайтиПоНаименованию(лстрИмя,1,1)=0 Тогда
            лспр.НоваяГруппа();
            лспр.Родитель=лспрРодитель;
            лспр.Наименование=лстрИмя;
            лспр.Записать();
        КонецЕсли;
        лспрРодитель=лспр.ТекущийЭлемент();
        лстрПутьДальше=Сред(лстрПутьДальше,лч+1);
    КонецЦикла;
    лспр.ИспользоватьРодителя(лспрРодитель);
    Если лспр.НайтиПоНаименованию(лстрПутьДальше,1,1)=0 Тогда
        лспр.НоваяГруппа();
        лспр.Родитель=лспрРодитель;
        лспр.Наименование=лстрПутьДальше;
        лспр.Записать();
    КонецЕсли;
    пспрНашаПапка=лспр.ТекущийЭлемент();
КонецПроцедуры
44 Злопчинский
 
26.04.14
19:48
(43) спсб, но я примерно то же самое написал с обратной стороны - собрал иерархию папок в таблицу и ищу в ней. если не нашел - то создаю в "обратном" направлении...
45 mszsuz
 
26.04.14
21:02
как-то так:

Функция НайтиГруппу(Стр)
    
    СтрСР = СтрЗаменить(Стр, "/", РазделительСтрок);
    СН.ИспользоватьРодителя("");
    Для нс = 1 по СтрКоличествоСтрок(СтрСР) Цикл
        Если (СН.НайтиПоНаименованию(СтрПолучитьСтроку(СтрСР, нс), 1, 1) = 0)
         ИЛИ (СН.ЭтоГруппа() = 0) Тогда
            Возврат "";
        КонецЕсли;    
        СН.ИспользоватьРодителя(СН.ТекущийЭлемент());
    КонецЦикла;    
    
    Возврат СН.ТекущийЭлемент();

КонецФункции
46 Злопчинский
 
26.04.14
22:28
(45) ловко
Ошибка? Это не ошибка, это системная функция.