Имя: Пароль:
1C
1С v8
Обход результата запроса для заполнения табличной части
,
0 Serdolik55
 
05.06.12
12:44
ЦеноваяГруппа    Сумма    ЗначениеУсловия      ПроцентСкидкиНаценки  

Велосипеды    36 075,6        
Велосипеды    36 075,6    10 000             1
Велосипеды    36 075,6    20 000             5

Игрушки            21 882,3        
Игрушки            21 882,3        10 000             7
Игрушки            21 882,3    20 000             11

Коллеги, такая проблема, мне нужно обойти вот это дерево(результат запроса), так чтобы заполнить табличную часть док-та Чек ККМ по условию:
Если "Сумма" (сумма по ценовым группам) превышает "ЗначениеУсловия" тогда выставляется "ПроцентСкидкиНаценки" соответсвующий этому условию, например 36 075,6 > 20 000 тогда выставляется скидка 5%, если сумма меньше 20000, тогда 1% (см. пример).
Пишу так:


Пока Выборка.Следующий()Цикл
                                                     Если НачалоДня(ЭтотОбъект.Дата) >= НачалоДня(Выборка.ДатаОкончания) Тогда
                                                         ПараметрыОтбора = Новый Структура;
                                                         МассивНоменклатуры = ПолучитьМассивНоменклатуры(Товары.ВыгрузитьКолонку("Номенклатура"),Выборка.ЦеноваяГруппа);
                                                         Для Каждого СтрокаМассиваНоменклатуры Из МассивНоменклатуры Цикл
                                                             ПараметрыОтбора.Вставить("Номенклатура",СтрокаМассиваНоменклатуры.Ссылка);
                                                             МассивСтрок = Товары.НайтиСтроки(ПараметрыОтбора);
                                                             ВыборкаДетальныхЗаписей = Выборка.Выбрать();
                                                             Пока ВыборкаДетальныхЗаписей.Следующий()Цикл
                                                                 Для Каждого Строка Из МассивСтрок Цикл
                                                                     Если Выборка.Сумма >= ВыборкаДетальныхЗаписей.ЗначениеУсловия Тогда
                                                                       
                                                                         Строка.ПроцентАвтоматическихСкидок = ВыборкаДетальныхЗаписей.ПроцентСкидкиНаценки;
                                                                         ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(Строка,ЭтотОбъект);
                                                                                                                           КонецЕсли;
                                                                 КонецЦикла;
                                                             КонецЦикла;
                                                         КонецЦикла;
                                                     КонецЕсли;
                                                 КонецЦикла;
1 Serdolik55
 
05.06.12
12:53
Вопрос как правильно это сделать, чтобы нужная скидка подцеплялась?
2 Pashkaa
 
05.06.12
12:54
Ты напиши в чем затык в решении
3 Serdolik55
 
05.06.12
12:59
(2) Затык в том, что нужно правильно условие прописать, чтобы ставилась нужная скидка:
Вот это условие, работает только в одну сторону:
Если Выборка.Сумма >= ВыборкаДетальныхЗаписей.ЗначениеУсловия Тогда
                                                                       
                                                                         Строка.ПроцентАвтоматическихСкидок = ВыборкаДетальныхЗаписей.ПроцентСкидкиНаценки;
                                                                         ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(Строка,ЭтотОбъект);
                                                                                                                           КонецЕсли;
4 Pashkaa
 
05.06.12
13:03
Покажи запрос. Не понятно что выбираешь и какие итоги
5 Serdolik55
 
05.06.12
13:06
Если Товары.Количество()>0 Тогда
       Запрос = Новый Запрос;
       Запрос.УстановитьПараметр("ТЗтовары",Товары.Выгрузить());
       Запрос.УстановитьПараметр("Ссылка",Товары.ВыгрузитьКолонку("Номенклатура"));
       Запрос.Текст = "ВЫБРАТЬ
                      |    ТЗтовары.Номенклатура,
                      |    ТЗтовары.Количество * ТЗтовары.Цена КАК Сумма
                      |ПОМЕСТИТЬ Товары
                      |ИЗ
                      |    &ТЗтовары КАК ТЗтовары
                      |;
                      |
                      |////////////////////////////////////////////////////////////////////////////////
                      |ВЫБРАТЬ
                      |    Номенклатура.Ссылка,
                      |    Номенклатура.ЦеноваяГруппа
                      |ПОМЕСТИТЬ ЦенГруппы
                      |ИЗ
                      |    Справочник.Номенклатура КАК Номенклатура
                      |ГДЕ
                      |    Номенклатура.ПометкаУдаления = ЛОЖЬ
                      |    И Номенклатура.ЭтоГруппа = ЛОЖЬ
                      |    И Номенклатура.Ссылка В(&Ссылка)
                      |;
                      |
                      |////////////////////////////////////////////////////////////////////////////////
                      |ВЫБРАТЬ
                      |    ЦенГруппы.ЦеноваяГруппа,
                      |    СУММА(Товары.Сумма) КАК Сумма
                      |ИЗ
                      |    Товары КАК Товары
                      |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЦенГруппы КАК ЦенГруппы
                      |        ПО Товары.Номенклатура = ЦенГруппы.Ссылка
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    ЦенГруппы.ЦеноваяГруппа";
                     
                      МассивРезультатов = Запрос.ВыполнитьПакет();
                      Результат = Запрос.Выполнить().Выгрузить();
                     
                      ЗапросНаЗаполнение = Новый Запрос;
                      ЗапросНаЗаполнение.УстановитьПараметр("ТЗ",Результат);
                      ЗапросНаЗаполнение.УстановитьПараметр("ДатаСреза",ТекущаяДата());
                      ЗапросНаЗаполнение.УстановитьПараметр("Склад",ЭтотОбъект.Склад);
                      ЗапросНаЗаполнение.Текст = "ВЫБРАТЬ
                                                 |    ТЗ.ЦеноваяГруппа,
                                                 |    ТЗ.Сумма
                                                 |ПОМЕСТИТЬ ТЗ
                                                 |ИЗ
                                                 |    &ТЗ КАК ТЗ
                                                 |;
                                                 |
                                                 |////////////////////////////////////////////////////////////////////////////////
                                                 |ВЫБРАТЬ
                                                 |    ТЗ.ЦеноваяГруппа КАК ЦеноваяГруппа,
                                                 |    ТЗ.Сумма КАК Сумма,
                                                 |    СкидкиНаценкиПоЦеновымГруппамСрезПоследних.ЗначениеУсловия КАК ЗначениеУсловия,
                                                 |    СкидкиНаценкиПоЦеновымГруппамСрезПоследних.ПроцентСкидкиНаценки,
                                                 |    СкидкиНаценкиПоЦеновымГруппамСрезПоследних.ДатаОкончания КАК ДатаОкончания
                                                 |ИЗ
                                                 |    ТЗ КАК ТЗ
                                                 |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СкидкиНаценкиПоЦеновымГруппам.СрезПоследних(
                                                 |                &ДатаСреза,
                                                 |                ЦеноваяГруппа В
                                                 |                        (ВЫБРАТЬ
                                                 |                            ТЗ.ЦеноваяГруппа
                                                 |                        ИЗ
                                                 |                            ТЗ КАК ТЗ)
                                                 |                    И ПолучательСкидки = &Склад) КАК СкидкиНаценкиПоЦеновымГруппамСрезПоследних
                                                 |        ПО ТЗ.ЦеноваяГруппа = СкидкиНаценкиПоЦеновымГруппамСрезПоследних.ЦеноваяГруппа
                                                 |
                                                 |УПОРЯДОЧИТЬ ПО
                                                 |    ЗначениеУсловия
                                                 |ИТОГИ
                                                 |    МАКСИМУМ(Сумма),
                                                 |    МАКСИМУМ(ДатаОкончания)
                                                 |ПО
                                                 |    ЦеноваяГруппа";
                                                 
                                                 ПакетЗапросовНаВыполнение = ЗапросНаЗаполнение.ВыполнитьПакет();
                                                 РезультатЗапросаНаЗаполнение = ЗапросНаЗаполнение.Выполнить();
                                                 Выборка = РезультатЗапросаНаЗаполнение.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                                                 
                                                 
                                                         

                                                 Пока Выборка.Следующий()Цикл
                                                     Если НачалоДня(ЭтотОбъект.Дата) >= НачалоДня(Выборка.ДатаОкончания) Тогда
                                                         ПараметрыОтбора = Новый Структура;
                                                         МассивНоменклатуры = ПолучитьМассивНоменклатуры(Товары.ВыгрузитьКолонку("Номенклатура"),Выборка.ЦеноваяГруппа);
                                                         Для Каждого СтрокаМассиваНоменклатуры Из МассивНоменклатуры Цикл
                                                             ПараметрыОтбора.Вставить("Номенклатура",СтрокаМассиваНоменклатуры.Ссылка);
                                                             МассивСтрок = Товары.НайтиСтроки(ПараметрыОтбора);
                                                             ВыборкаДетальныхЗаписей = Выборка.Выбрать();
                                                             Пока ВыборкаДетальныхЗаписей.Следующий()Цикл
                                                                 Для Каждого Строка Из МассивСтрок Цикл
                                                                     Если Выборка.Сумма >= ВыборкаДетальныхЗаписей.ЗначениеУсловия  Тогда
                                                                         Строка.ПроцентАвтоматическихСкидок = ВыборкаДетальныхЗаписей.ПроцентСкидкиНаценки;
                                                                         ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(Строка,ЭтотОбъект);
                                                                     КонецЕсли;
                                                                 КонецЦикла;
                                                             КонецЦикла;
                                                         КонецЦикла;
                                                     КонецЕсли;
                                                 КонецЦикла;
           КонецЕсли;
6 Pashkaa
 
05.06.12
13:15
А нельзя во запросе ЗапросНаЗаполнение получить во вложенной таблице сразу диапазоны по суммам и потом соединять с накоплением по ценовой группе? Тогда в итоге циклы и переборы будут не нужны
7 Serdolik55
 
05.06.12
13:20
(6) Я думал об этом но не знаю как правильно прописать это. Можно в запросе поле ЗначениеУсловия вынести в секцию ГДЕ и написать ЗначениеУсловия Между Зн1 и Зна2? Ты об этом?
8 Pashkaa
 
05.06.12
13:24
Нет.

Нужно Соединить Регистр сам с собой с СОЕДИНЕНИЕ по ЦеновойГруппе И Регистр1.ЗначениеУсловия < Регистр2.ЗначениеУсловия

Потом Группировать по ЦеновойГруппе И по Регистр2.ЗначениеУсловия сделать МИНИМУМ(Регистр2.ЗначениеУсловия)

по итогу получишь
Регистр1.ЦеноваяГруппа
Регистр1.ЗначениеУсловия
Регистр2.ЗначениеУсловия
Регистр1.ПроцентСкидкиНаценки
9 Serdolik55
 
05.06.12
13:28
(8) Слуш, я тебя не совсем понял, можешь в мой последний запрос дополнить это?
10 Pashkaa
 
05.06.12
13:33
Писал не глядя, тк. нет тестовых данных в базе по скидкам

Запрос.Текст = "ВЫБРАТЬ
|    ТЗ.ЦеноваяГруппа,
|    ТЗ.Сумма
|ПОМЕСТИТЬ ТЗ
|ИЗ
|    &ТЗ КАК ТЗ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ТЗ.ЦеноваяГруппа КАК ЦеноваяГруппа,
|    ТЗ.Сумма КАК Сумма,
|    ТаблицаСкидок.ЗначениеУсловия КАК ЗначениеУсловия1,
|    ТаблицаСкидок.ЗначениеУсловия1 КАК ЗначениеУсловия11,
|    ТаблицаСкидок.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки1
|ИЗ
|    ТЗ КАК ТЗ
|        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|            СкидкиНаценки1.ЦеноваяГруппа КАК ЦеноваяГруппа,
|            МИНИМУМ(СкидкиНаценки1.ЗначениеУсловия) КАК ЗначениеУсловия,
|            МИНИМУМ(СкидкиНаценки2.ЗначениеУсловия) КАК ЗначениеУсловия1,
|            МИНИМУМ(СкидкиНаценки1.ПроцентСкидкиНаценки) КАК ПроцентСкидкиНаценки
|        ИЗ
|            РегистрСведений.СкидкиНаценкиПоЦеновымГруппам.СрезПоследних КАК СкидкиНаценки1
|                ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СкидкиНаценкиПоЦеновымГруппам.СрезПоследних КАК СкидкиНаценки2
|                ПО СкидкиНаценки1.ЦеноваяГруппа = СкидкиНаценки2.ЦеноваяГруппа
|                    И СкидкиНаценки1.ЗначениеУсловия < СкидкиНаценки2.ЦеноваяГруппа
|        
|        СГРУППИРОВАТЬ ПО
|            СкидкиНаценки1.ЦеноваяГруппа) КАК ТаблицаСкидок
|        ПО ТЗ.Сумма >= ТаблицаСкидок.ЗначениеУсловия
|            И ТЗ.Сумма <= ТаблицаСкидок.ЗначениеУсловия1
|ИТОГИ
|    МАКСИМУМ(Сумма)
|ПО
|    ЦеноваяГруппа";
11 Serdolik55
 
05.06.12
13:40
Спасибо, сейчас попробую
12 Pashkaa
 
05.06.12
13:44
Проверь главное вот этот кусок

ВЫБРАТЬ
|            СкидкиНаценки1.ЦеноваяГруппа КАК ЦеноваяГруппа,
|            МИНИМУМ(СкидкиНаценки1.ЗначениеУсловия) КАК ЗначениеУсловия,
|            МИНИМУМ(СкидкиНаценки2.ЗначениеУсловия) КАК ЗначениеУсловия1,
|            МИНИМУМ(СкидкиНаценки1.ПроцентСкидкиНаценки) КАК ПроцентСкидкиНаценки
|        ИЗ
|            РегистрСведений.СкидкиНаценкиПоЦеновымГруппам.СрезПоследних КАК СкидкиНаценки1
|                ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СкидкиНаценкиПоЦеновымГруппам.СрезПоследних КАК СкидкиНаценки2
|                ПО СкидкиНаценки1.ЦеноваяГруппа = СкидкиНаценки2.ЦеноваяГруппа
|                    И СкидкиНаценки1.ЗначениеУсловия < СкидкиНаценки2.ЦеноваяГруппа
|        
|        СГРУППИРОВАТЬ ПО
|            СкидкиНаценки1.ЦеноваяГруппа
13 Pashkaa
 
05.06.12
13:47
Если тут диапазоны правильные получатся тогда я вообще не вижу смысла в первом запросе. Зачем ты там объединял Ценовые группы и ТЧ документа?

Одним запросом получил всю ТЧ документа дополнил столбец со скидкой и одной строкой назад в документ загрузил + пересчет сумм
14 Serdolik55
 
05.06.12
13:59
Спасибо! Получилось!
Основная теорема систематики: Новые системы плодят новые проблемы.