8.х Две функции суммы в конструкторе запросов

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем MyNameNoName, 16 июл 2013.

  1. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте.
    Пока в конструкторе запросов одна функция сумма все считается корректно.
    А как добавляю вторую функцию сумму в итоге результаты считаются неправильно, намного больше, в разы больше становятся числа.
    Код:
    "ВЫБРАТЬ
    |    СписанныеТовары.Номенклатура.Наименование КАК НоменклатураНаименование,
    |    СписанныеТовары.Номенклатура.Артикул КАК НоменклатураАртикул,
    |    СУММА(СписанныеТовары.Количество) КАК Количество,
    |    СУММА(ПотребностиЗаказовНаПроизводство.Количество) КАК КоличествоЗаказы
    |ИЗ
    |    РегистрСведений.СписанныеТовары КАК СписанныеТовары
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПотребностиЗаказовНаПроизводство КАК ПотребностиЗаказовНаПроизводство
    |        ПО СписанныеТовары.Номенклатура = ПотребностиЗаказовНаПроизводство.Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    |    СписанныеТовары.Номенклатура.Наименование,
    |    СписанныеТовары.Номенклатура.Артикул";
    
    В чем ошибка?
  2. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    где то лишние записи появляются, сделайте пакетный запрос, первые 2 пакета - подсчет соответствующих сумм, а результаты уже обЪединяйте
  3. Annie
    Offline

    Annie Опытный в 1С Команда форума

    Регистрация:
    10 фев 2010
    Сообщения:
    949
    Симпатии:
    23
    Баллы:
    29
    Можно еще попробовать
    Код:
    "ВЫБРАТЬ РАЗЛИЧНЫЕ... "
    Но в надежности таблетки не уверена
  4. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    не совсем понятно про что речь идет. У меня суммы отдельно суммируются корректно, а в одном конструкторе не работает.
  5. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    вы пакетный запрос представляете? щас попробую на ваших данных пример набросать
  6. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    ну примерно как-то так наверное
    Код:
    "ВЫБРАТЬ
    |   СписанныеТовары.Номенклатура.Наименование КАК НоменклатураНаименование,
    |   СписанныеТовары.Номенклатура.Артикул КАК НоменклатураАртикул,
    |   СУММА(СписанныеТовары.Количество) КАК Количество
    |ПОМЕСТИТЬ тСписанныеТовары
    |ИЗ
    |   РегистрСведений.СписанныеТовары КАК СписанныеТовары
    |СГРУППИРОВАТЬ ПО
    |    СписанныеТовары.Номенклатура.Наименование,
    |    СписанныеТовары.Номенклатура.Артикул
    |;
    | //////////////////////////////
    |ВЫБРАТЬ
    |   ПотребностиЗаказовНаПроизводство.Номенклатура.Наименование КАК НоменклатураНаименование,
    |   ПотребностиЗаказовНаПроизводство.Номенклатура.Артикул КАК НоменклатураАртикул,
    |   СУММА(ПотребностиЗаказовНаПроизводство.Количество) КАК КоличествоЗаказы
    |ПОМЕСТИТЬ тПотребностиЗаказов
    |ИЗ
    |   РегистрНакоплений.ПотребностиЗаказовНаПроизводство КАК ПотребностиЗаказовНаПроизводство
    |СГРУППИРОВАТЬ ПО
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Наименование,
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Артикул
    |;
    | //////////////////////////////
    |
    |ВЫБРАТЬ
    |    тСписанныеТовары.НоменклатураНаименование КАК НоменклатураНаименование,
    |    тСписанныеТовары.НоменклатураАртикул КАК НоменклатураАртикул,
    |    тСписанныеТовары.Количество,
    |    тПотребностиЗаказов.КоличествоЗаказов
    |ИЗ
    |    тСписанныеТовары КАК тСписанныеТовары
    |	    ЛЕВОЕ СОЕДИНЕНИЕ тПотребностиЗаказов КАК тПотребностиЗаказов
    |	    ПО тСписанныеТовары.НоменклатураНаименование = тПотребностиЗаказов.НоменклатураНаименование
    на коленке делала, может чего не работает, доведите сами до боеготовности
  7. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Еще вопросик ибо не совсем понимаю:
    Код:
    Процедура КнопкаСформироватьНажатие(Кнопка)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    СписанныеТовары.Номенклатура.Наименование КАК НоменклатураНаименование,
    |    СписанныеТовары.Номенклатура.Артикул КАК НоменклатураАртикул,
    |    СУММА(СписанныеТовары.Количество) КАК Количество,
    |    СУММА(ПотребностиЗаказовНаПроизводство.Количество) КАК КоличествоЗаказы
    |ИЗ
    |    РегистрСведений.СписанныеТовары КАК СписанныеТовары
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПотребностиЗаказовНаПроизводство КАК ПотребностиЗаказовНаПроизводство
    |        ПО СписанныеТовары.Номенклатура = ПотребностиЗаказовНаПроизводство.Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    |    СписанныеТовары.Номенклатура.Наименование,
    |    СписанныеТовары.Номенклатура.Артикул";
    
    Таблица = Запрос.Выполнить().Выгрузить();
    
    Макет = ЭтотОбъект.ПолучитьМакет("Макет");
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.ЭкземпляровНаСтранице = 0;
    
    Область = Макет.ПолучитьОбласть("Заголовок");
    Табдок.Вывести(Область);
    
    Область = Макет.ПолучитьОбласть("Строка");
    Для каждого Элемент из Таблица Цикл
    Область.Параметры.НоменклатураНаименование = Элемент.НоменклатураНаименование;
    Область.Параметры.НоменклатураАртикул = Элемент.НоменклатураАртикул;
    Область.Параметры.Количество = Элемент.Количество;
    Область.Параметры.КоличествоЗаказы = Элемент.КоличествоЗаказы;
    ТабДок.Вывести(Область);
    КонецЦикла;
    
    ТабДок.Показать();
    
    КонецПроцедуры
    
    Теперь вместо одного запроса становится 3.
    Как их в код добавить. Т.е. для каждого запроса будет свой код:
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст =
    //код
    Таблица = Запрос.Выполнить().Выгрузить();
    
    Или нет?
  8. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Спасибо, думаю сам разберусь. Полез читать инфу.
  9. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    если вы посмотрите внимательно на запрос. то первые 2 пакета образуют временные таблицы, которые используются в третьем пакете. Итоговая выборка - это именно третий пакет. Это один Запрос и обрабатывать его надо соответствующе, используя поля третьего пакета.

    в принципе в ваш код запрос должен вполне вписаться
  10. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Немного подправил получилось
    Код:
    Процедура КнопкаСформироватьНажатие(Кнопка)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    
    "ВЫБРАТЬ
    |   СписанныеТовары.Номенклатура.Наименование КАК НоменклатураНаименование,
    |   СписанныеТовары.Номенклатура.Артикул КАК НоменклатураАртикул,
    |   СУММА(СписанныеТовары.Количество) КАК Количество
    |ПОМЕСТИТЬ тСписанныеТовары
    |ИЗ
    |   РегистрСведений.СписанныеТовары КАК СписанныеТовары
    |СГРУППИРОВАТЬ ПО
    |    СписанныеТовары.Номенклатура.Наименование,
    |    СписанныеТовары.Номенклатура.Артикул
    |;
    |ВЫБРАТЬ
    |   ПотребностиЗаказовНаПроизводство.Номенклатура.Наименование КАК НоменклатураНаименование,
    |   ПотребностиЗаказовНаПроизводство.Номенклатура.Артикул КАК НоменклатураАртикул,
    |   СУММА(ПотребностиЗаказовНаПроизводство.Количество) КАК КоличествоЗаказы
    |ПОМЕСТИТЬ тПотребностиЗаказов
    |ИЗ
    |   РегистрНакопления.ПотребностиЗаказовНаПроизводство КАК ПотребностиЗаказовНаПроизводство
    |СГРУППИРОВАТЬ ПО
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Наименование,
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Артикул
    |;
    |ВЫБРАТЬ
    |    тСписанныеТовары.НоменклатураНаименование КАК НоменклатураНаименование,
    |    тСписанныеТовары.НоменклатураАртикул КАК НоменклатураАртикул,
    |    тСписанныеТовары.Количество,
    |    тПотребностиЗаказов.КоличествоЗаказов
    |ИЗ
    |    тСписанныеТовары КАК тСписанныеТовары
    |   	 ЛЕВОЕ СОЕДИНЕНИЕ тПотребностиЗаказов КАК тПотребностиЗаказов
    |   	 ПО тСписанныеТовары.НоменклатураНаименование = тПотребностиЗаказов.НоменклатураНаименование";
    
    
    Таблица = Запрос.Выполнить().Выгрузить();
    
    Макет = ЭтотОбъект.ПолучитьМакет("Макет");
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.ЭкземпляровНаСтранице = 0;
    
    Область = Макет.ПолучитьОбласть("Заголовок");
    Табдок.Вывести(Область);
    
    Область = Макет.ПолучитьОбласть("Строка");
    Для каждого Элемент из Таблица Цикл
    Область.Параметры.НоменклатураНаименование = Элемент.НоменклатураНаименование;
    Область.Параметры.НоменклатураАртикул = Элемент.НоменклатураАртикул;
    Область.Параметры.Количество = Элемент.Количество;
    Область.Параметры.КоличествоЗаказы = Элемент.КоличествоЗаказы;
    ТабДок.Вывести(Область);
    КонецЦикла;
    
    ТабДок.Показать();
    
    КонецПроцедуры
    
    ругается на тПотребностиЗаказов.КоличествоЗаказов




    Идея ясна что-то не могу понять в 3-ем запросе явно что-то не то.
  11. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Вам нужно левое соединение делать и по наименованию и по артикулу, иначе у вас появляется лишняя степень свободы, из за которой количество записей увеличивается. Попробуйте посмтреть результат запроса при левом соединении без группировок и суммирования, просто отобрав поля, увидите в чем проблема
  12. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Исправил, и правда количество записей в квадрат увеличилось.
    Код:
    "ВЫБРАТЬ
    |   СписанныеТовары.Номенклатура.Наименование КАК НоменклатураНаименование,
    |   СписанныеТовары.Номенклатура.Артикул КАК НоменклатураАртикул,
    |   СУММА(СписанныеТовары.Количество) КАК Количество
    |ПОМЕСТИТЬ тСписанныеТовары
    |ИЗ
    |   РегистрСведений.СписанныеТовары КАК СписанныеТовары
    |СГРУППИРОВАТЬ ПО
    |    СписанныеТовары.Номенклатура.Наименование,
    |    СписанныеТовары.Номенклатура.Артикул
    |;
    |ВЫБРАТЬ
    |   ПотребностиЗаказовНаПроизводство.Номенклатура.Наименование КАК НоменклатураНаименование,
    |   ПотребностиЗаказовНаПроизводство.Номенклатура.Артикул КАК НоменклатураАртикул,
    |   СУММА(ПотребностиЗаказовНаПроизводство.Количество) КАК КоличествоЗаказы
    |ПОМЕСТИТЬ тПотребностиЗаказов
    |ИЗ
    |   РегистрНакопления.ПотребностиЗаказовНаПроизводство КАК ПотребностиЗаказовНаПроизводство
    |СГРУППИРОВАТЬ ПО
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Наименование,
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Артикул
    |;
    |ВЫБРАТЬ
    |    тСписанныеТовары.НоменклатураНаименование КАК НоменклатураНаименование,
    |    тСписанныеТовары.НоменклатураАртикул КАК НоменклатураАртикул,
    |    тСписанныеТовары.Количество,
    |    тПотребностиЗаказов.КоличествоЗаказы
    |ИЗ
    |    тСписанныеТовары КАК тСписанныеТовары
    |   	 ЛЕВОЕ СОЕДИНЕНИЕ тПотребностиЗаказов КАК тПотребностиЗаказов
    |   	 ПО тСписанныеТовары.НоменклатураНаименование = тПотребностиЗаказов.НоменклатураНаименование";
    
  13. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Спасибо, теперь работает!
  14. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Есть еще один нюанс в вашем запросе, а именно в данном случае не стоит соединять номенклатуру по наименованию (если это не делается специально),
    может оказаться так что в базе найдутся номенклатуры у которых одинаковые наименования, например одна нормально заполненная и вторая помеченная на удаление как введенная не верно. По одной у вас ведется учет по другой нет, но при соединении по наименованию учтутся обе.
    В таком случае соединять нужно по "СписанныеТовары.Номенклатура" или "СписанныеТовары.Номенклатура.Ссылка"
  15. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    +1 в таком случае и по наименованию и по артикулу совпадение сразу будет
  16. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Выводит корректно, но только то что есть в регистре сведений СписанныеТовары. А как сделать так чтобы выводить номенклатуру еще и из регистра накопления ПотребностиЗаказовНаПроизводство?
    Т.е. если в СписанныеТовары нет позиции из ПотребностиЗаказовНаПроизводство то эта позиция не выведится, хотя мне она нужна тоже.
    Код:
    "ВЫБРАТЬ
    |    СписанныеТовары.Номенклатура.Наименование КАК НоменклатураНаименование,
    |    СписанныеТовары.Номенклатура.Артикул КАК НоменклатураАртикул,
    |    СУММА(СписанныеТовары.Количество) КАК Количество
    |ПОМЕСТИТЬ тСписанныеТовары
    |ИЗ
    |    РегистрСведений.СписанныеТовары КАК СписанныеТовары
    |
    |СГРУППИРОВАТЬ ПО
    |    СписанныеТовары.Номенклатура.Наименование,
    |    СписанныеТовары.Номенклатура.Артикул
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Наименование КАК НоменклатураНаименование,
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Артикул КАК НоменклатураАртикул,
    |    СУММА(ПотребностиЗаказовНаПроизводство.Количество) КАК КоличествоЗаказы
    |ПОМЕСТИТЬ тПотребностиЗаказов
    |ИЗ
    |    РегистрНакопления.ПотребностиЗаказовНаПроизводство КАК ПотребностиЗаказовНаПроизводство
    |
    |СГРУППИРОВАТЬ ПО
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Наименование,
    |    ПотребностиЗаказовНаПроизводство.Номенклатура.Артикул
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    тСписанныеТовары.НоменклатураНаименование КАК НоменклатураНаименование,
    |    тСписанныеТовары.НоменклатураАртикул КАК НоменклатураАртикул,
    |    тСписанныеТовары.Количество,
    |    тПотребностиЗаказов.КоличествоЗаказы
    |ИЗ
    |    тСписанныеТовары КАК тСписанныеТовары
    |        ПОЛНОЕ СОЕДИНЕНИЕ тПотребностиЗаказов КАК тПотребностиЗаказов
    |        ПО тСписанныеТовары.НоменклатураАртикул = тПотребностиЗаказов.НоменклатураАртикул
    |            И тСписанныеТовары.НоменклатураНаименование = тПотребностиЗаказов.НоменклатураНаименование";
    
    Какой тип полное соединение использовать?
  17. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Вот так работает
    Код:
    |ВЫБРАТЬ
    |    тСписанныеТовары.НоменклатураНаименование КАК НоменклатураНаименование,
    |    тСписанныеТовары.НоменклатураАртикул КАК НоменклатураАртикул,
    |    тСписанныеТовары.Количество,
    |    тПотребностиЗаказов.КоличествоЗаказы,
    |    тПотребностиЗаказов.НоменклатураНаименование КАК НоменклатураНаименование1,
    |    тПотребностиЗаказов.НоменклатураАртикул КАК НоменклатураАртикул1
    |ИЗ
    |    тСписанныеТовары КАК тСписанныеТовары
    |        ПОЛНОЕ СОЕДИНЕНИЕ тПотребностиЗаказов КАК тПотребностиЗаказов
    |        ПО тСписанныеТовары.НоменклатураАртикул = тПотребностиЗаказов.НоменклатураАртикул
    |            И тСписанныеТовары.НоменклатураНаименование = тПотребностиЗаказов.НоменклатураНаименование";
    
    Только как бы сжать НоменклатураНаименование1 и НоменклатураАртикул1?
  18. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Я то при выводе информации в печатную форму функцией свяжу НоменклатураНаименование и НоменклатураНаименование1 но это же не дело.
  19. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Например так
    ЕСТЬNULL(тСписанныеТовары.НоменклатураНаименование,тПотребностиЗаказов.НоменклатураНаименование) КАК НоменклатураНаименование
  20. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    Код:
    "ВЫБРАТЬ
    | СписанныеТовары.Номенклатура КАК Номенклатура,
    | СУММА(СписанныеТовары.Количество) КАК Количество
    |ПОМЕСТИТЬ тСписанныеТовары
    |ИЗ
    | РегистрСведений.СписанныеТовары КАК СписанныеТовары
    |
    |СГРУППИРОВАТЬ ПО
    | СписанныеТовары.Номенклатура
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ПотребностиЗаказовНаПроизводство.Номенклатура КАК Номенклатура,
    | СУММА(ПотребностиЗаказовНаПроизводство.Количество) КАК КоличествоЗаказы
    |ПОМЕСТИТЬ тПотребностиЗаказов
    |ИЗ
    | РегистрНакопления.ПотребностиЗаказовНаПроизводство КАК ПотребностиЗаказовНаПроизводство
    |
    |СГРУППИРОВАТЬ ПО
    | ПотребностиЗаказовНаПроизводство.Номенклатура
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ВЫБОР КОГДА тСписанныеТовары.Номенклатура = null ТОГДА
    | тПотребностиЗаказов.Номенклатура.Наименование ИНАЧЕ тСписанныеТовары.Номенклатура.Наименование КОНЕЦ КАК НоменклатураНаименование,
    | ВЫБОР КОГДА тСписанныеТовары.Номенклатура = null ТОГДА
    | тПотребностиЗаказов.Номенклатура.Артикул ИНАЧЕ тСписанныеТовары.Номенклатура.Артикул КОНЕЦ КАК НоменклатураАртикул,
    | тСписанныеТовары.Количество,
    | тПотребностиЗаказов.КоличествоЗаказы
    |ИЗ
    | тСписанныеТовары КАК тСписанныеТовары
    | ПОЛНОЕ СОЕДИНЕНИЕ тПотребностиЗаказов КАК тПотребностиЗаказов
    | ПО тСписанныеТовары.Номенклатура = тПотребностиЗаказов.Номенклатура";
    оффтоп: только у меня так форум тормозит.... тема открывалась 20 минут и сообщение отправлялось еще 5 (((

Поделиться этой страницей