Имя: Пароль:
1C
 
СКД: вывести различные значения группы горизонтально, в виде колонок?
,
0 lenkavovka
 
23.07.20
10:21
Всем привет!
Простейший запрос штрихкодов:

ВЫБРАТЬ
    СпрНоменклатура.Ссылка КАК Ссылка,
    СпрНоменклатура.Артикул КАК Артикул,
    СпрНоменклатура.Код КАК Код,
    ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
ИЗ
    РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
        ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
        ПО ШтрихкодыНоменклатуры.Номенклатура = СпрНоменклатура.Ссылка

Сложность в том, что штрихкодов может быть у каждой номенклатуры до десяти. Соответственно в отчёте на каждую номенклатуру получаем до десяти строк, по количеству штрихкодов.
Пользователь просит вывести эти штрихкоды в 10 колонок, напротив каждой строки номенклатуры все возможные значения штрикодов.

Есть ли решения средствами СКД без обработки результатов запроса в коде?
Приходит мысль сделать жуткий запрос, что-то типа такого:
ВЫБРАТЬ
    ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
    МИНИМУМ(ШтрихкодыНоменклатуры.Штрихкод) КАК Штрихкод
ПОМЕСТИТЬ ВТ_Штрихкоды1
ИЗ
    РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры

СГРУППИРОВАТЬ ПО
    ШтрихкодыНоменклатуры.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
    МИНИМУМ(ШтрихкодыНоменклатуры.Штрихкод) КАК Штрихкод
ПОМЕСТИТЬ ВТ_Штрихкоды2
ИЗ
    РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
ГДЕ
    НЕ ШтрихкодыНоменклатуры.Номенклатура В
                (ВЫБРАТЬ
                    ВТ_Штрихкоды1.Штрихкод
                ИЗ
                    ВТ_Штрихкоды1)

СГРУППИРОВАТЬ ПО
    ШтрихкодыНоменклатуры.Номенклатура
    
    ...................................


Потом соответственно через соединение получить колонки Штрихкод1, Штрихкод2... Штрихкод10.

Но, может, есть более изящное решение?
1 lenkavovka
 
23.07.20
10:34
2 mikecool
 
23.07.20
10:40
использовать группировку колонок
3 lenkavovka
 
23.07.20
10:59
(2) Хм. Ткните ссылкой, если не сложно.
4 mikecool
 
23.07.20
11:37
(3) некуда тыкать, вывод - в таблицу, в группировку колонок добавляешь свое поле и профит
5 lenkavovka
 
23.07.20
12:11
(4) Вот так? https://ibb.co/6Nxt0cJ
Но ведь так мы получим несколько тысяч колонок, потому что каждой номенклатуре принадлежит от 1 до 10-ти различных (уникальных во всё справочнике) штрихкодов...
6 mistеr
 
23.07.20
12:57
(5) Выведи в одной колонке, через запятую.
7 mistеr
 
23.07.20
12:57
(5) Зачем там вообще штрихкоды?
8 lenkavovka
 
23.07.20
15:55
(6), (7) для анализа избыточности. Через запятую не устроит пользователей, большой объём нужно анализировать регулярно.
9 mistеr
 
23.07.20
17:49
(8) Пользователи анализируют штрихкоды глазами и с чем-то сверяют?!!

Кажется, я понял, о какой избыточности речь.
10 lenkavovka
 
23.07.20
18:55
(9) Наводят порядок на складе. Автоматизировать это нельзя, на роботов бюджета в текущем квартале не выделяли:)

В общем, пришлось делать отчёт на основе набора данных - объекта, в котором в процессор компоновки данных передаётся таблица значений, полученная из такой фнукции:

Функция ПолучитьТаблицуШтрихкодов()
    
    Запрос = Новый Запрос("ВЫБРАТЬ
                          |    СпрНоменклатура.Ссылка КАК Номенклатура,
                          |    СпрНоменклатура.Артикул КАК Артикул,
                          |    СпрНоменклатура.Код КАК Код,
                          |    ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
                          |ИЗ
                          |    РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
                          |        ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
                          |        ПО ШтрихкодыНоменклатуры.Номенклатура = СпрНоменклатура.Ссылка");
    
    Результат = Запрос.Выполнить().Выгрузить();
    
    ТаблицаШтрихкоды = Новый ТаблицаЗначений;
    ТаблицаШтрихкоды.Колонки.Добавить("Номенклатура");
    ТаблицаШтрихкоды.Колонки.Добавить("Артикул");
    ТаблицаШтрихкоды.Колонки.Добавить("Код");
    ТаблицаШтрихкоды.Колонки.Добавить("Штрихкод1");
    
    Для Каждого СтрокаРезультата Из Результат Цикл
        
        НайденнаяСтрокаТаблицы = ТаблицаШтрихкоды.Найти(СтрокаРезультата.Номенклатура, "Номенклатура");
        
        Если НайденнаяСтрокаТаблицы = Неопределено Тогда
            
            НоваяСтрока = ТаблицаШтрихкоды.Добавить();
            НоваяСтрока.Номенклатура = СтрокаРезультата.Номенклатура;
            НоваяСтрока.Артикул = СтрокаРезультата.Артикул;
            НоваяСтрока.Код = СтрокаРезультата.Код;
            НоваяСтрока.Штрихкод1 = СтрокаРезультата.Штрихкод;
            
        Иначе
            
            Сч = 2;
            ШтрихкодЗаписан = Ложь;
            
            Пока НЕ ШтрихкодЗаписан Цикл
                
                Если ТаблицаШтрихкоды.Колонки.Найти("Штрихкод" + Сч) = Неопределено Тогда
                    
                    ТаблицаШтрихкоды.Колонки.Добавить("Штрихкод" + Сч);
                    
                КонецЕсли;
                
                Если Строка(НайденнаяСтрокаТаблицы["Штрихкод" + Сч]) = "" Тогда
                
                    НайденнаяСтрокаТаблицы["Штрихкод" + Сч] = СтрокаРезультата.Штрихкод;
                    
                    ШтрихкодЗаписан = Истина;
                    
                КонецЕсли;
            
                Сч = Сч + 1;
                
            КонецЦикла;
        КонецЕсли;
        
    КонецЦикла;

    Возврат ТаблицаШтрихкоды;
    
    
КонецФункции