Имя: Пароль:
1C
 
Дублируется вывод результата
,
0 myr4ik07
 
19.12.14
14:07
Привет, помогите с логикой, с запроса получаю остатки номенклатуры в разрезе складов + к номенклатуре их штрихкоды

ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    МассивШК = Новый Массив;  
    
    Пока ВыборкаНоменклатура.Следующий() Цикл  
        Если Результат.Пустой() Тогда        
            Прервать;                          
        КонецЕсли;                            
        
        ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура);
        ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень());
        
        ВыборкаШтрихкод = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        
        Пока ВыборкаШтрихкод.Следующий() Цикл
            МассивШК.Добавить(ВыборкаШтрихкод.Штрихкод);
        КонецЦикла;
        ВыборкаШтрихкод.Сбросить();
        
        Пока ВыборкаШтрихкод.Следующий() Цикл
            ОбластьШтрихкод.Параметры.Заполнить(ВыборкаШтрихкод);
            
            ВыборкаДетальныеЗаписи = ВыборкаШтрихкод.Выбрать();
            
            Если ЗначениеЗаполнено(МассивШК) И НЕ МассивШК.Количество() > 1 Тогда
                ТабДок.Вывести(ОбластьШтрихкод, ВыборкаШтрихкод.Уровень());
                
            ИначеЕсли ЗначениеЗаполнено(МассивШК) Тогда  
                СписокШК = "";
                Для Каждого Эл Из МассивШК Цикл
                    СписокШК = СписокШК + ?(СписокШК = "", Эл, " ; " + Эл);
                КонецЦикла;
                ОбластьШтрихкод.Параметры.ШтрихКод = СписокШК;
                ТабДок.Вывести(ОбластьШтрихкод, ВыборкаШтрихкод.Уровень());    
                МассивШК.Очистить();
            КонецЕсли;
    
            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
                ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());
            КонецЦикла;    
        КонецЦикла;
    КонецЦикла;    

в результате обхода

Номенклатура1
   Штрихкод1; Штрихкод2 и т.д.
      Склад1
      Склад2
      Склад1
      Склад2

а хотелось бы

Номенклатура1
   Штрихкод1; Штрихкод2 и т.д.
      Склад1
      Склад2

без второго обхода по второму штрихкоду
1 myr4ik07
 
19.12.14
14:09
пропустил написать, что в итоге запрос перебираю такой выборкой
2 GreatOne
 
19.12.14
14:19
лучше покажи запрос...
3 vicof
 
19.12.14
14:21
(2) Лучше на это не смотреть :))
4 myr4ik07
 
19.12.14
14:23
(2)
"ВЫБРАТЬ
    |    ТоварыНаСкладахОстатки.Склад,
    |    ПРЕДСТАВЛЕНИЕ(ТоварыНаСкладахОстатки.Склад),
    |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    |    ПРЕДСТАВЛЕНИЕ(ТоварыНаСкладахОстатки.Номенклатура),
    |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
    |    ВЫБОР
    |        КОГДА Штрихкоды.Штрихкод ЕСТЬ NULL
    |            ТОГДА ""Штрихкод отсутствует""
    |        ИНАЧЕ Штрихкоды.Штрихкод
    |    КОНЕЦ КАК Штрихкод
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки(
    |            ,
    |            Номенклатура В
    |                (ВЫБРАТЬ
    |                    ПоступлениеТоваровУслугТовары.Номенклатура
    |                ИЗ
    |                    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
    |                ГДЕ
    |                    ПоступлениеТоваровУслугТовары.Ссылка = &Выбор)) КАК ТоварыНаСкладахОстатки
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
    |        ПО ТоварыНаСкладахОстатки.Номенклатура = Штрихкоды.Владелец
    |
    |УПОРЯДОЧИТЬ ПО
    |    КоличествоОстаток УБЫВ
    |ИТОГИ
    |    СУММА(КоличествоОстаток)
    |ПО
    |    Номенклатура,
    |    Штрихкод";
5 myr4ik07
 
19.12.14
14:33
смотрю отладчиком вот этот цикл получает два и более раз вывода остатков для каждого штрихкода

Пока ВыборкаШтрихкод.Следующий() Цикл
            ОбластьШтрихкод.Параметры.Заполнить(ВыборкаШтрихкод);
            
            ВыборкаДетальныеЗаписи = ВыборкаШтрихкод.Выбрать();
            
            Если ЗначениеЗаполнено(МассивШК) И НЕ МассивШК.Количество() > 1 Тогда
                ТабДок.Вывести(ОбластьШтрихкод, ВыборкаШтрихкод.Уровень());
                
            ИначеЕсли ЗначениеЗаполнено(МассивШК) Тогда  
                СписокШК = "";
                Для Каждого Эл Из МассивШК Цикл
                    СписокШК = СписокШК + ?(СписокШК = "", Эл, " ; " + Эл);
                КонецЦикла;
                ОбластьШтрихкод.Параметры.ШтрихКод = СписокШК;
                ТабДок.Вывести(ОбластьШтрихкод, ВыборкаШтрихкод.Уровень());    
                МассивШК.Очистить();
            КонецЕсли;
            
            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
                ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());
            КонецЦикла;    
        КонецЦикла;
6 myr4ik07
 
19.12.14
14:34
из этого и получается если например 3 штрихкода присвоеных одной номенклатуре тогда будет
Номенклатура1
   Штрихкод1; Штрихкод2; Штрихкод3
      Склад1
      Склад2
      Склад1
      Склад2
      Склад1
      Склад2
три раза получу остатки
7 myr4ik07
 
19.12.14
14:34
три раза будет указан один и тот же склад
8 myr4ik07
 
19.12.14
14:35
вот не хватает смекалки как переписать или добавить условие, что бы даже если 3 штрихкода или больше всеровно склады не дублировались в остатках
9 GreatOne
 
19.12.14
14:48
не трать время, сделай для каждой номенклатуры отдельную функцию по поиску штрихкодов и убери это из запроса.

Пока ВыборкаНоменклатура.Следующий() Цикл  
       ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура);
        ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень());
        
        ВыборкаШтрихкод = ПолучитьШтрихКоды(ВыборкаНоменклатура.Номенклатура);
10 myr4ik07
 
19.12.14
14:59
(9) а какаим образом штрихкод "будет знать", что он владелец номенклатуры?
не очень понятно ....
уберу выше выборку, будет выборка толко детальных записей что ли?
11 myr4ik07
 
19.12.14
15:00
(9) или типа код так запрос выше оставляю, а потом вторым запросом (функции поиска штрих-кода) в параметр поиска буду передавать значение т.е. номенклатуру или что имеет ввиду?
12 тарам пам пам
 
19.12.14
15:04
(9), за запрос в цикле не зря на экзамене на специалиста по шапке бьют.
13 myr4ik07
 
19.12.14
15:04
(9) да и то, что вы предлагаете убрать, глядя по отладчику никак не влияет на дубляж...
14 myr4ik07
 
19.12.14
15:05
(12) так у меня и нет запроса в цикле, а вот товарищ, как я понял запрос и предлагает
15 myr4ik07
 
19.12.14
15:06
или это я себе придумал, что предлагает ))) извините коль чо
16 GreatOne
 
19.12.14
15:06
(12) экзамен на спеца сдают те, кто хоть как-то к нему готов=)

(13) Выведи запросом по остаткам номенклатуру+остаток на складе. Отдельно прилепи в макет штрихкоды, полученные сторонней функцией. Ну или попроси в (12), чтобы грамотное решение написал
17 myr4ik07
 
19.12.14
15:09
(16) ааааа ) понял, вариант )))
18 myr4ik07
 
19.12.14
15:10
(16) заранее за совет спасибо, пробую ...
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.