Имя: Пароль:
1C
1С v8
Массив выбрать только уникальные записи
,
0 Roma1314704
 
19.05.18
13:54
День добрый. Есть массив значений номенклатуры в т.ч.есть наименование и код родителя товара верхнего уровня. Задача как выбрать только уникальные наименование категорий и код категории? Ведь к примеру из 20 наименований товара уникальными может быть к примеру 4 родительские категории с соотвествующим кодом. Вопрос как перебрать массив и выбрать только не повторяющиеся?
1 b_ru
 
19.05.18
14:08
ТЗ.Свернуть() например.
2 b_ru
 
19.05.18
14:10
Хотя если у тебя именно массив номенклатуры, то очевидно

ВЫБРАТЬ РАЗЛИЧНЫЕ
  спр.Родитель.Наименование КАК Наименование,
  спр.Родитель.Код КАК Код
ИЗ
  Справочник.Номенклатура КАК спр
ГДЕ
  спр.Ссылка В (&МойМассив)
3 Cyberhawk
 
19.05.18
14:30
(0) "как перебрать массив и выбрать только не повторяющиеся" // Откуда выбрать?
4 Roma1314704
 
19.05.18
14:36
&НаСервере
Функция ПолучитьМассивДанных()
    
    МассивДанных = Новый Массив;    
    Запрос = Новый Запрос;
    Запрос.Текст =
"ВЫБРАТЬ
|        Товар.Код КАК Код,
|        Товар.Наименование КАК Наименование,
|        Товар.Ссылка,
|        РегистрЦен.ЦенаПродажиРозетка КАК ЦенаПродажи,
|        Товар.Бренд КАК Бренд,
|        Товар.ХарактеристикаXML КАК ОписаниеТовара,
|        Товар.СсылкаФотоТовара1 Как СсылкаФотоТовара1,
|        Товар.СсылкаФотоТовара2 Как СсылкаФотоТовара2,
|        Товар.СсылкаФотоТовара3 Как СсылкаФотоТовара3,
|        Товар.СсылкаФотоТовара4 Как СсылкаФотоТовара4,
|        Товар.ТоварXml КАК ТоварXml,
|        Товар.СсылкаНаСайт Как СсылкаНаСайт,
|        ЕСТЬNULL(Остатки.КоличествоОстаток,0) КАК ОстатокТовара
|
|    ИЗ
|        Справочник.Номенклатура КАК Товар
|        ЛЕВОЕ СОЕДИНЕНИЕ
|            РегистрНакопления.ОстаткиПоСкладам.Остатки КАК Остатки
|        ПО (Товар.Ссылка = Остатки.Номенклатура И Остатки.Склад = &Склад)
|        ЛЕВОЕ СОЕДИНЕНИЕ
|            РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК РегистрЦен ПО (Товар.Ссылка = РегистрЦен.Номенклатура)
|
|    ГДЕ
|        ТоварXml = &Истина";
            
    Запрос.УстановитьПараметр("Истина", Истина);
    Запрос.УстановитьПараметр("Склад", Справочники.Склады.НайтиПоНаименованию("Основной склад"));

    
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        НоваяЗапись = Новый Структура("Код,Ссылка, Наименование, Бренд, ОписаниеТовара, Характеристика, ЗначениеХарактеристики, ЦенаПродажи, СсылкаНаСайт, Категория, РодительскаяКатегорияКод,РодительскаяКатегория,СсылкаФотоТовара1,СсылкаФотоТовара2, СсылкаФотоТовара3, СсылкаФотоТовара4, ОстатокТовара, Доступность");
        НоваяЗапись.Код = Строка(ВыборкаДетальныеЗаписи.Код);
        НоваяЗапись.Ссылка = ВыборкаДетальныеЗаписи.Ссылка;
        НоваяЗапись.Наименование = Строка(ВыборкаДетальныеЗаписи.Наименование);
        НоваяЗапись.ЦенаПродажи = Строка(ВыборкаДетальныеЗаписи.ЦенаПродажи);
        НоваяЗапись.СсылкаНаСайт = Строка(ВыборкаДетальныеЗаписи.СсылкаНаСайт);
            Товар = ВыборкаДетальныеЗаписи.Ссылка;
            РодительВерхнегоУровня = ВернутьРодителя(Товар);
            КодРодительВерхнегоУровня = ВернутьКодРодителя(Товар);
        НоваяЗапись.РодительскаяКатегория = Строка(РодительВерхнегоУровня);
        НоваяЗапись.РодительскаяКатегорияКод = Строка(КодРодительВерхнегоУровня);
        НоваяЗапись.СсылкаФотоТовара1 = Строка(ВыборкаДетальныеЗаписи.СсылкаФотоТовара1);
        НоваяЗапись.СсылкаФотоТовара2 = Строка(ВыборкаДетальныеЗаписи.СсылкаФотоТовара2);
        НоваяЗапись.СсылкаФотоТовара3 = Строка(ВыборкаДетальныеЗаписи.СсылкаФотоТовара3);
        НоваяЗапись.СсылкаФотоТовара4 = Строка(ВыборкаДетальныеЗаписи.СсылкаФотоТовара4);
        НоваяЗапись.ОстатокТовара = Строка(ВыборкаДетальныеЗаписи.ОстатокТовара);
        НоваяЗапись.ОписаниеТовара = Строка(ВыборкаДетальныеЗаписи.ОписаниеТовара);
        НоваяЗапись.Бренд = Строка(ВыборкаДетальныеЗаписи.Бренд);
        Если Строка(ВыборкаДетальныеЗаписи.ОстатокТовара > 0) Тогда
            НоваяЗапись.Доступность = "true";
            Иначе
            НоваяЗапись.Доступность = "false" ;
        КонецЕсли;
        МассивДанных.Добавить(НоваяЗапись);
        
        
    КонецЦикла;
    
    Возврат МассивДанных;
    
КонецФункции
5 Roma1314704
 
19.05.18
14:38
Нужно получить с этого массива только уникальные значения РодительскаяКатегория и РодительскаяКатегорияКод
6 Cyberhawk
 
19.05.18
15:23
Так у тебя массив структур - преобразовывай его в ТЗ и сворачивай ее
7 Roma1314704
 
19.05.18
17:46
ткните пальцем где глянуть как это реализовать
8 Aleksey
 
19.05.18
17:50
Процедура УдалитьПовторяющиесяЭлементы(Массив)

    ТекущийИндекс = 0;
    ВсегоЭлементов = Массив.Количество();
    Пока ТекущийИндекс < ВсегоЭлементов Цикл
        Индекс2 = ТекущийИндекс + 1;
        Пока Индекс2 < ВсегоЭлементов Цикл
            Если Массив[Индекс2] = Массив[ТекущийИндекс] Тогда
                Массив.Удалить(Индекс2);
                ВсегоЭлементов = ВсегоЭлементов - 1;
            Иначе
                Индекс2 = Индекс2 + 1;
            КонецЕсли;
        КонецЦикла;
        ТекущийИндекс = ТекущийИндекс + 1;
    КонецЦикла;

КонецПроцедуры
9 Aleksey
 
19.05.18
17:55
(7) а не проще ли еще один запрос сварганить? Или вставить в выборку еще один массив?
10 Roma1314704
 
19.05.18
17:58
Вот здесь сам не разберусь  -мне нужно выдернуть в xml код и наименование родителькой категории верхнего уровня (уникальные)
11 Roma1314704
 
19.05.18
17:59
как их перебрать и проверить на уникальность?
12 perester
 
19.05.18
18:00
Сделай из него тз, добавь колонку со значением число 1, сверни тз просуммировав по этой колонке и выбери где колонка равно 1, или запросом также
13 perester
 
19.05.18
18:02
Если просто свернуть то получится Так что уйдут только дубли, а не повторяющиеся значения, если я правильно понял, то нужны только те которые без дублей?
14 Roma1314704
 
19.05.18
18:22
Да, нужно избавиться от дублей по 2-ум колонкам
15 Roma1314704
 
19.05.18
18:34
Подскажите схему как массив в ТЗ преобразовать
16 Aleksey
 
19.05.18
23:48
(14) у тебя одна из колонок - ссылка. что ты собирался с ней делать? Она одна делает любое сочитание родителей уникальным

Так что что ты хочешь?
17 Tateossian
 
20.05.18
00:02
(8) Ужасная процедура - ее стоимость - квадратичная сложность, O(n^2). Куда проще вставлять в новое соответствие ключ, а потом трансформировать в массив - тут будет хотя бы линейная сложность.
18 Aleksey
 
20.05.18
00:12
(17) что есть квадратичная сложность?
19 Roma1314704
 
20.05.18
12:34
ТЗ.Свернуть(""РодительскаяКатегорияКод")
Получил уникальные записи

Как теперь правильно получить Название Родительской категории в соотвествии с кодом ? Не искать же в Справочнике номенклатура по коду категории соотвествующее название ?
Нужна  подсказка
20 PiotrLoginov
 
20.05.18
12:37
Рома, тебе 39 лет. Ты в 1С уже 11 лет.  Сам ты из страны, где 1С запрещена. Спрашиваешь вещи...  азы какие-то.
21 PiotrLoginov
 
20.05.18
12:38
Ответ на (0) был в (1) и (2)  Если интересует, что дальше делать с уникальными записями, заводи новую ветку.. должен же быть какой-то порядок.
22 Roma1314704
 
20.05.18
12:44
ок
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.