Имя: Пароль:
1C
1С v8
facepalm.jpg
0 Amiralnar
 
01.09.11
14:21
А КАК ЧАСТО ВЫ ЭТО НАБЛЮДАЕТЕ?

Функция ЗапросБезПлатежей()
   ЗапросКонтр = Новый Запрос;
   ЗапросКонтр.Текст =
     "ВЫБРАТЬ
     |    ПродажиОбороты.Контрагент КАК Контрагент,
     |    ПродажиОбороты.Номенклатура КАК Номенклатура,
     |    ПродажиОбороты.Регистратор КАК Регистратор,
     |    СУММА(ВЫБОР
     |            КОГДА ПродажиОбороты.КоличествоОборот > 0
     |                ТОГДА ПродажиОбороты.КоличествоОборот
     |            ИНАЧЕ 0
     |        КОНЕЦ) КАК ПродажиКоличество,
     |    СУММА(ВЫБОР
     |            КОГДА ПродажиОбороты.КоличествоОборот < 0
     |                ТОГДА ПродажиОбороты.КоличествоОборот
     |            ИНАЧЕ 0
     |        КОНЕЦ) КАК ВозвратыКоличество,
     |    СУММА(ВЫБОР
     |            КОГДА ПродажиОбороты.СтоимостьОборот > 0
     |                ТОГДА ПродажиОбороты.СтоимостьОборот
     |            ИНАЧЕ 0
     |        КОНЕЦ) КАК ПродажиСумма,
     |    СУММА(ВЫБОР
     |            КОГДА ПродажиОбороты.СтоимостьОборот < 0
     |                ТОГДА ПродажиОбороты.СтоимостьОборот
     |            ИНАЧЕ 0
     |        КОНЕЦ) КАК ВозвратыСумма
     |ИЗ
     |    РегистрНакопления.Продажи.Обороты(
     |            &ДатаНач,
     |            &ДатаКон,
     |            Регистратор,
     |            Организация = &Организация";
   Если ЗначениеЗаполнено(Номенклатура) Тогда
       ЗапросКонтр.Текст = ЗапросКонтр.Текст +
     "                И Номенклатура В ИЕРАРХИИ (&ВыбНоменклатура)";
   КонецЕсли;
   ЗапросКонтр.Текст = ЗапросКонтр.Текст +  
     ") КАК ПродажиОбороты
     |
     |СГРУППИРОВАТЬ ПО
     |    ПродажиОбороты.Контрагент
     |    ,ПродажиОбороты.Номенклатура,
     |    ПродажиОбороты.Регистратор
     |ИТОГИ
     |    СУММА(ПродажиКоличество),
     |    СУММА(ВозвратыКоличество),
     |    СУММА(ПродажиСумма),
     |    СУММА(ВозвратыСумма)
     |ПО
     //|    ОБЩИЕ,
     |    Контрагент";
     //|    Номенклатура ТОЛЬКО ИЕРАРХИЯ,
     //|    Регистратор";
     
   ЗапросКонтр.УстановитьПараметр("Организация", Организация);
   ЗапросКонтр.УстановитьПараметр("ДатаНач", НачалоДня(ДатаНач));
   Если ЗначениеЗаполнено(ДатаКон) Тогда
       ЗапросКонтр.УстановитьПараметр("ДатаКон", КонецДня(ДатаКон));
   Иначе
       ЗапросКонтр.УстановитьПараметр("ДатаКон", КонецДня(ТекущаяДата()));
   КонецЕсли;
   ЗапросКонтр.УстановитьПараметр("ВыбНоменклатура", Номенклатура);
   
   Рез = ЗапросКонтр.Выполнить().Выгрузить();
   Сч = 0;
   Пока Сч < Рез.Количество() Цикл
       ТекСтрока = Рез.Получить(Сч);
       Если ЗначениеЗаполнено(ТекСтрока.Контрагент) = Ложь Тогда
           Рез.Удалить(ТекСтрока);
           Продолжить;
       КонецЕсли;
       Если ТекСтрока.Контрагент.ПринадлежитЭлементу(ГруппаСотрудники) Тогда
           Рез.Удалить(ТекСтрока);
           Продолжить;
       КонецЕсли;
       Сч = Сч + 1;
   КонецЦикла;
   Рез.Свернуть("Контрагент");
   СписокКонтр = Рез.ВыгрузитьКолонку("Контрагент");
   Если ТолькоПеремещения Тогда
       СписокКонтр.Очистить();
   КонецЕсли;
   СписокКонтр.Добавить(СкладОтправитель);
   
   Если ПоСотрудникам Тогда
       СписокКонтр.Очистить();
       СписокКонтр.Добавить(ГруппаСотрудники);
   КонецЕсли;
   
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ";
   Для Каждого СтрокаГрупп Из Группировки Цикл
       Если СтрокаГрупп.Включить = Ложь Тогда
           Продолжить;
       КонецЕсли;
       Если СтрокаГрупп.Наименование = "Номенклатура" Тогда
           Запрос.Текст = Запрос.Текст +
           "
           |    ВложенныйЗапрос.Номенклатура КАК Номенклатура,";
       ИначеЕсли СтрокаГрупп.Наименование = "Контрагенты" Тогда
           Запрос.Текст = Запрос.Текст +
           "
           |    ВложенныйЗапрос.Контрагент КАК Контрагенты,";
       ИначеЕсли СтрокаГрупп.Наименование = "Документ" Тогда
           Запрос.Текст = Запрос.Текст +
           "
           |    ВложенныйЗапрос.Регистратор КАК Документ,";
       КонецЕсли;
   КонецЦикла;
   Запрос.Текст = Запрос.Текст +
   "
   |    СУММА(ВложенныйЗапрос.ПродажиКоличество) КАК ПродажиКоличество,
   |    СУММА(ВложенныйЗапрос.ВозвратыКоличество) КАК ВозвратыКоличество,
   |    СУММА(ВложенныйЗапрос.ПродажиСумма) КАК ПродажиСумма,
   |    СУММА(ВложенныйЗапрос.ВозвратыСумма) КАК ВозвратыСумма
   |ИЗ
   |    (ВЫБРАТЬ
   |        ПродажиОбороты.Контрагент КАК Контрагент,
   |        ПродажиОбороты.Номенклатура КАК Номенклатура,
   |        ПродажиОбороты.Регистратор КАК Регистратор,
   |        ВЫБОР
   |            КОГДА ПродажиОбороты.КоличествоОборот > 0
   |                ТОГДА ПродажиОбороты.КоличествоОборот
   |            ИНАЧЕ 0
   |        КОНЕЦ КАК ПродажиКоличество,
   |        ВЫБОР
   |            КОГДА ПродажиОбороты.КоличествоОборот < 0
   |                ТОГДА ПродажиОбороты.КоличествоОборот
   |            ИНАЧЕ 0
   |        КОНЕЦ КАК ВозвратыКоличество,
   |        ВЫБОР
   |            КОГДА ПродажиОбороты.СтоимостьОборот > 0
   |                ТОГДА ПродажиОбороты.СтоимостьОборот
   |            ИНАЧЕ 0
   |        КОНЕЦ КАК ПродажиСумма,
   |        ВЫБОР
   |            КОГДА ПродажиОбороты.СтоимостьОборот < 0
   |                ТОГДА ПродажиОбороты.СтоимостьОборот
   |            ИНАЧЕ 0
   |        КОНЕЦ КАК ВозвратыСумма
   |    ИЗ
   |        РегистрНакопления.Продажи.Обороты(
   |                &ДатаНач,
   |                &ДатаКон,
   |                Регистратор,
   |                Организация = &Организация
   |                    И Контрагент В ИЕРАРХИИ (&СписокКонтрагентов)) КАК ПродажиОбороты
   |    
   |    ОБЪЕДИНИТЬ ВСЕ
   |    
   |    ВЫБРАТЬ
   |        ВложенныйЗапрос.Контрагент,
   |        ВложенныйЗапрос.Номенклатура,
   |        ВложенныйЗапрос.Ссылка,
   |        ВложенныйЗапрос.Количество,
   |        ВложенныйЗапрос.КоличествоВозврат,
   |        ВложенныйЗапрос.Сумма,
   |        ВложенныйЗапрос.СуммаВозврат
   |    ИЗ
   |        (ВЫБРАТЬ
   |            ВЫБОР
   |                КОГДА ПеремещениеТоваровТовары.Ссылка.СкладОтправитель = &СкладОтправитель
   |                    ТОГДА ПеремещениеТоваровТовары.Ссылка.СкладОтправитель
   |                ИНАЧЕ ПеремещениеТоваровТовары.Ссылка.СкладПолучатель
   |            КОНЕЦ КАК Контрагент,
   |            ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура,
   |            ПеремещениеТоваровТовары.Ссылка КАК Ссылка,
   |            ВЫБОР
   |                КОГДА ПеремещениеТоваровТовары.Ссылка.СкладОтправитель = &СкладОтправитель
   |                        И ПеремещениеТоваровТовары.Ссылка.СкладПолучатель = &СкладПолучатель
   |                    ТОГДА ПеремещениеТоваровТовары.Количество
   |                ИНАЧЕ 0
   |            КОНЕЦ КАК Количество,
   |            ВЫБОР
   |                КОГДА ПеремещениеТоваровТовары.Ссылка.СкладОтправитель = &СкладПолучатель
   |                        И ПеремещениеТоваровТовары.Ссылка.СкладПолучатель = &СкладОтправитель
   |                    ТОГДА -ПеремещениеТоваровТовары.Количество
   |                ИНАЧЕ 0
   |            КОНЕЦ КАК КоличествоВозврат,
   |            ВЫБОР
   |                КОГДА ПеремещениеТоваровТовары.Ссылка.СкладОтправитель = &СкладОтправитель
   |                        И ПеремещениеТоваровТовары.Ссылка.СкладПолучатель = &СкладПолучатель
   |                    ТОГДА ПеремещениеТоваровТовары.Количество * ЦеныНоменклатурыСрезПоследних.Цена
   |                ИНАЧЕ 0
   |            КОНЕЦ КАК Сумма,
   |            ВЫБОР
   |                КОГДА ПеремещениеТоваровТовары.Ссылка.СкладОтправитель = &СкладПолучатель
   |                        И ПеремещениеТоваровТовары.Ссылка.СкладПолучатель = &СкладОтправитель
   |                    ТОГДА -ПеремещениеТоваровТовары.Количество * ЦеныНоменклатурыСрезПоследних.Цена
   |                ИНАЧЕ 0
   |            КОНЕЦ КАК СуммаВозврат
   |        ИЗ
   |            Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
   |                ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаКон, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
   |                ПО ПеремещениеТоваровТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
   |        ГДЕ
   |            ПеремещениеТоваровТовары.Ссылка.Организация = &Организация
   |            И ПеремещениеТоваровТовары.Ссылка.СкладОтправитель В(&СписокСкладов)
   |            И ПеремещениеТоваровТовары.Ссылка.СкладПолучатель В(&СписокСкладов)
   |            И ПеремещениеТоваровТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон) КАК ВложенныйЗапрос) КАК ВложенныйЗапрос
   |            И ПеремещениеТоваровТовары.Ссылка.ПометкаУдаления = ЛОЖЬ
   |            И ПеремещениеТоваровТовары.Ссылка.Проведен = ИСТИНА
   |";
   //Запрос.Текст = Запрос.Текст +
   //"
   //|    СУММА(ВЫБОР
   //|            КОГДА ПродажиОбороты.КоличествоОборот > 0
   //|                ТОГДА ПродажиОбороты.КоличествоОборот
   //|            ИНАЧЕ 0
   //|        КОНЕЦ) КАК ПродажиКоличество,
   //|    СУММА(ВЫБОР
   //|            КОГДА ПродажиОбороты.КоличествоОборот < 0
   //|                ТОГДА ПродажиОбороты.КоличествоОборот
   //|            ИНАЧЕ 0
   //|        КОНЕЦ) КАК ВозвратыКоличество,
   //|    СУММА(ВЫБОР
   //|            КОГДА ПродажиОбороты.СтоимостьОборот > 0
   //|                ТОГДА ПродажиОбороты.СтоимостьОборот
   //|            ИНАЧЕ 0
   //|        КОНЕЦ) КАК ПродажиСумма,
   //|    СУММА(ВЫБОР
   //|            КОГДА ПродажиОбороты.СтоимостьОборот < 0
   //|                ТОГДА ПродажиОбороты.СтоимостьОборот
   //|            ИНАЧЕ 0
   //|        КОНЕЦ) КАК ВозвратыСумма
   //|ИЗ
   //|    РегистрНакопления.Продажи.Обороты(
   //|            &ДатаНач,
   //|            &ДатаКон,
   //|            Регистратор";
   Запрос.Текст = Запрос.Текст +
   "
   |ГДЕ
   |";
       ЕстьУсловия = 0;
       //Если ЗначениеЗаполнено(Организация) Тогда
       //    Запрос.Текст = Запрос.Текст +
       //"                Организация = &Организация";
       //    ЕстьУсловия = 1;
       //КонецЕсли;
       Если (СписокКонтр.Количество() <> 0) Тогда
           Запрос.Текст = Запрос.Текст +
       "                    Контрагент В ИЕРАРХИИ (&СписокКонтрагентов)";
           ЕстьУсловия = 1;
       КонецЕсли;
       Если (ЕстьУсловия = 0) И (ЗначениеЗаполнено(Номенклатура)) Тогда
           Запрос.Текст = Запрос.Текст +
       "                    Номенклатура В ИЕРАРХИИ (&ВыбНоменклатура)";
           ЕстьУсловия = 1;
       ИначеЕсли ЗначениеЗаполнено(Номенклатура) Тогда
           Запрос.Текст = Запрос.Текст +
       "                  И Номенклатура В ИЕРАРХИИ (&ВыбНоменклатура)";
       КонецЕсли;
       //Иначе
       //    Запрос.Текст = Запрос.Текст +
       //"                    ) КАК ПродажиОбороты";
       //КонецЕсли;
   Запрос.Текст = Запрос.Текст +
   "    
   |    СГРУППИРОВАТЬ ПО";
   ВключеныГруппы = 0;
   Для Каждого СтрокаГрупп Из Группировки Цикл
       Если СтрокаГрупп.Включить = Ложь Тогда
           Продолжить;
       КонецЕсли;
       Если ВключеныГруппы = 1 Тогда
           Запрос.Текст = Запрос.Текст + ", ";
       КонецЕсли;
       Если СтрокаГрупп.Наименование = "Контрагенты" Тогда
           Запрос.Текст = Запрос.Текст +
           "  ВложенныйЗапрос.Контрагент";
       ИначеЕсли СтрокаГрупп.Наименование = "Номенклатура" Тогда
           Запрос.Текст = Запрос.Текст +
           "  ВложенныйЗапрос.Номенклатура";
       ИначеЕсли СтрокаГрупп.Наименование = "Документ" Тогда
           Запрос.Текст = Запрос.Текст +
           "  ВложенныйЗапрос.Регистратор";
       КонецЕсли;
       ВключеныГруппы = 1;
   КонецЦикла;
   ВключеныУпорядочивания = 0;
   Для Каждого СтрокаГрупп Из Группировки Цикл
       Если СтрокаГрупп.Включить = Ложь Тогда
           Продолжить;
       КонецЕсли;
       Если ВключеныУпорядочивания = 1 Тогда
           Запрос.Текст = Запрос.Текст + ", ";
       Иначе
           Запрос.Текст = Запрос.Текст +
           "
           |УПОРЯДОЧИТЬ ПО";
       КонецЕсли;
       Если СтрокаГрупп.Наименование = "Контрагенты" Тогда
           Запрос.Текст = Запрос.Текст +
           "  Контрагент.Наименование";
       ИначеЕсли СтрокаГрупп.Наименование = "Номенклатура" Тогда
           Запрос.Текст = Запрос.Текст +
           "  Номенклатура.Наименование";
       ИначеЕсли СтрокаГрупп.Наименование = "Документ" Тогда
           Запрос.Текст = Запрос.Текст +
           "  Регистратор.Дата";
       КонецЕсли;
       ВключеныУпорядочивания = 1;
   КонецЦикла;
   //Запрос.Текст = Запрос.Текст +
   //"
   //|
   //|УПОРЯДОЧИТЬ ПО
   //|    Регистратор
   Запрос.Текст = Запрос.Текст +
   "
   |ИТОГИ
   |    СУММА(ПродажиКоличество),
   |    СУММА(ВозвратыКоличество),
   |    СУММА(ПродажиСумма),
   |    СУММА(ВозвратыСумма)
   |ПО
   |    ОБЩИЕ,";
   ВключеныГруппы = 0;
   Для Каждого СтрокаГрупп Из Группировки Цикл
       Если СтрокаГрупп.Включить = Ложь Тогда
           Продолжить;
       КонецЕсли;
       Если ВключеныГруппы = 1 Тогда
           Запрос.Текст = Запрос.Текст + ", ";
       КонецЕсли;
       Запрос.Текст = Запрос.Текст +
       "  " + СокрЛП(СтрокаГрупп.Наименование);
       Если СтрокаГрупп.Тип = "Иерархия" Тогда
           Запрос.Текст = Запрос.Текст + " ИЕРАРХИЯ";
       ИначеЕсли СтрокаГрупп.Тип = "ТолькоИерархия" Тогда
           Запрос.Текст = Запрос.Текст + " ТОЛЬКО ИЕРАРХИЯ";
       КонецЕсли;
       ВключеныГруппы = 1;
   КонецЦикла;
   Запрос.УстановитьПараметр("СкладОтправитель", СкладОтправитель);
   Запрос.УстановитьПараметр("СкладПолучатель", СкладПолучатель);
   СписокСкладов = Новый Массив;
   СписокСкладов.Добавить(СкладОтправитель);
   СписокСкладов.Добавить(СкладПолучатель);
   Запрос.УстановитьПараметр("СписокСкладов", СписокСкладов);
   Запрос.УстановитьПараметр("ТипЦен", ТипЦен);
   Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ДатаНач));
   Если ЗначениеЗаполнено(ДатаКон) Тогда
       Запрос.УстановитьПараметр("ДатаКон", КонецДня(ДатаКон));
   Иначе
       Запрос.УстановитьПараметр("ДатаКон", КонецДня(ТекущаяДата()));
   КонецЕсли;
   Если ЗначениеЗаполнено(Организация) Тогда
       Запрос.УстановитьПараметр("Организация", Организация);
   КонецЕсли;
   Если ЗначениеЗаполнено(Номенклатура) Тогда
       Запрос.УстановитьПараметр("ВыбНоменклатура", Номенклатура);
   КонецЕсли;
   Запрос.УстановитьПараметр("СписокКонтрагентов", СписокКонтр);
   Результат = Запрос.Выполнить();
   Возврат Результат;
КонецФункции
1 Grusswelle
 
01.09.11
14:22
(0) И чо?
2 Amiralnar
 
01.09.11
14:22
Через плечо. Построитель наше фсё.
3 forforumandspam
 
01.09.11
14:25
(1) Присоединяюсь.
4 Wingless
 
01.09.11
14:28
(2) Сделаем свой построитель, с преферансом и куртизанками!

Для Каждого СтрокаГрупп Из Группировки Цикл
       Если СтрокаГрупп.Включить = Ложь Тогда
           Продолжить;
       КонецЕсли;
       Если СтрокаГрупп.Наименование = "Номенклатура" Тогда
           Запрос.Текст = Запрос.Текст +
           "
           |    ВложенныйЗапрос.Номенклатура КАК Номенклатура,";
       ИначеЕсли СтрокаГрупп.Наименование = "Контрагенты" Тогда
           Запрос.Текст = Запрос.Текст +
           "
           |    ВложенныйЗапрос.Контрагент КАК Контрагенты,";
       ИначеЕсли СтрокаГрупп.Наименование = "Документ" Тогда
           Запрос.Текст = Запрос.Текст +
           "
           |    ВложенныйЗапрос.Регистратор КАК Документ,";
       КонецЕсли;
   КонецЦикла;

Шедевр.
5 forforumandspam
 
01.09.11
14:36
(4) Это тоже. В запросе получаем и номенклатуру и продажи/возвраты, а используются только контрагенты.

   ЗапросКонтр = Новый Запрос;
   ЗапросКонтр.Текст =
     "ВЫБРАТЬ
     |    ПродажиОбороты.Контрагент КАК Контрагент,
     |    ПродажиОбороты.Номенклатура КАК Номенклатура,
     |    ПродажиОбороты.Регистратор КАК Регистратор,
     |    СУММА(ВЫБОР
     |            КОГДА ПродажиОбороты.КоличествоОборот > 0
     |                ТОГДА ПродажиОбороты.КоличествоОборот
     |            ИНАЧЕ 0
     |        КОНЕЦ) КАК ПродажиКоличество,
     |    СУММА(ВЫБОР
     |            КОГДА ПродажиОбороты.КоличествоОборот < 0
     |                ТОГДА ПродажиОбороты.КоличествоОборот
     |            ИНАЧЕ 0
     |        КОНЕЦ) КАК ВозвратыКоличество,
     |    СУММА(ВЫБОР
     |            КОГДА ПродажиОбороты.СтоимостьОборот > 0
     |                ТОГДА ПродажиОбороты.СтоимостьОборот
     |            ИНАЧЕ 0
     |        КОНЕЦ) КАК ПродажиСумма,
     |    СУММА(ВЫБОР
     |            КОГДА ПродажиОбороты.СтоимостьОборот < 0
     |                ТОГДА ПродажиОбороты.СтоимостьОборот
     |            ИНАЧЕ 0
     |        КОНЕЦ) КАК ВозвратыСумма
     |ИЗ
     |    РегистрНакопления.Продажи.Обороты(
     |            &ДатаНач,
     |            &ДатаКон,
     |            Регистратор,
     |            Организация = &Организация";
   Если ЗначениеЗаполнено(Номенклатура) Тогда
       ЗапросКонтр.Текст = ЗапросКонтр.Текст +
     "                И Номенклатура В ИЕРАРХИИ (&ВыбНоменклатура)";
   КонецЕсли;
   ЗапросКонтр.Текст = ЗапросКонтр.Текст +  
     ") КАК ПродажиОбороты
     |
     |СГРУППИРОВАТЬ ПО
     |    ПродажиОбороты.Контрагент
     |    ,ПродажиОбороты.Номенклатура,
     |    ПродажиОбороты.Регистратор
     |ИТОГИ
     |    СУММА(ПродажиКоличество),
     |    СУММА(ВозвратыКоличество),
     |    СУММА(ПродажиСумма),
     |    СУММА(ВозвратыСумма)
     |ПО
     //|    ОБЩИЕ,

     |    Контрагент";
     //|    Номенклатура ТОЛЬКО ИЕРАРХИЯ,

     //|    Регистратор";

     
   ЗапросКонтр.УстановитьПараметр("Организация", Организация);
   ЗапросКонтр.УстановитьПараметр("ДатаНач", НачалоДня(ДатаНач));
   Если ЗначениеЗаполнено(ДатаКон) Тогда
       ЗапросКонтр.УстановитьПараметр("ДатаКон", КонецДня(ДатаКон));
   Иначе
       ЗапросКонтр.УстановитьПараметр("ДатаКон", КонецДня(ТекущаяДата()));
   КонецЕсли;
   ЗапросКонтр.УстановитьПараметр("ВыбНоменклатура", Номенклатура);
   
   Рез = ЗапросКонтр.Выполнить().Выгрузить();
   Сч = 0;
   Пока Сч < Рез.Количество() Цикл
       ТекСтрока = Рез.Получить(Сч);
       Если ЗначениеЗаполнено(ТекСтрока.Контрагент) = Ложь Тогда
           Рез.Удалить(ТекСтрока);
           Продолжить;
       КонецЕсли;
       Если ТекСтрока.Контрагент.ПринадлежитЭлементу(ГруппаСотрудники) Тогда
           Рез.Удалить(ТекСтрока);
           Продолжить;
       КонецЕсли;
       Сч = Сч + 1;
   КонецЦикла;
   Рез.Свернуть("Контрагент");
6 Megas
 
01.09.11
14:38
(0) Хвастаешся своим кодом? Скромнее надо быть =)