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

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

  1. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    До этого у меня было:
    Код:
    |ВЫБРАТЬ
    |    тСписанныеТовары.НоменклатураНаименование КАК НоменклатураНаименование,
    |    тСписанныеТовары.НоменклатураАртикул КАК НоменклатураАртикул,
    |    тСписанныеТовары.Количество,
    |    тПотребностиЗаказов.КоличествоЗаказы,
    |    тПотребностиЗаказов.НоменклатураНаименование КАК НоменклатураНаименование1,
    |    тПотребностиЗаказов.НоменклатураАртикул КАК НоменклатураАртикул1
    |ИЗ
    |    тСписанныеТовары КАК тСписанныеТовары
    |        ПОЛНОЕ СОЕДИНЕНИЕ тПотребностиЗаказов КАК тПотребностиЗаказов
    |        ПО тСписанныеТовары.НоменклатураАртикул = тПотребностиЗаказов.НоменклатураАртикул
    |            И тСписанныеТовары.НоменклатураНаименование = тПотребностиЗаказов.НоменклатураНаименование";
    
    
    Для каждого Элемент из Таблица Цикл
    Если Элемент.НоменклатураНаименование <> NULL Тогда
    Область.Параметры.НоменклатураНаименование = Элемент.НоменклатураНаименование;
    Иначе
    Область.Параметры.НоменклатураНаименование = Элемент.НоменклатураНаименование1;
    КонецЕсли;
    Если Элемент.НоменклатураАртикул <> NULL Тогда
    Область.Параметры.НоменклатураАртикул = Элемент.НоменклатураАртикул;
    Иначе
    Область.Параметры.НоменклатураАртикул = Элемент.НоменклатураАртикул1;
    КонецЕсли;
    
    и все выводилось в печатную форму.
    Теперь же
    Код:
    |ВЫБРАТЬ
    |    ВЫБОР
    |        КОГДА тСписанныеТовары.НоменклатураНаименование = NULL
    |            ТОГДА тПотребностиЗаказов.НоменклатураНаименование
    |        ИНАЧЕ тСписанныеТовары.НоменклатураНаименование
    |    КОНЕЦ КАК НоменклатураНаименование,
    |    ВЫБОР
    |        КОГДА тСписанныеТовары.НоменклатураАртикул = NULL
    |            ТОГДА тПотребностиЗаказов.НоменклатураАртикул
    |        ИНАЧЕ тСписанныеТовары.НоменклатураАртикул
    |    КОНЕЦ КАК НоменклатураАртикул,
    |    тСписанныеТовары.Количество,
    |    тПотребностиЗаказов.КоличествоЗаказы,
    |    тПотребностиЗаказов.НоменклатураНаименование КАК НоменклатураНаименование1,
    |    тПотребностиЗаказов.НоменклатураАртикул КАК НоменклатураАртикул1,
    |    тПотребностиЗаказов.КоличествоЗаказы КАК КоличествоЗаказы1
    |ИЗ
    |    тСписанныеТовары КАК тСписанныеТовары
    |        ПОЛНОЕ СОЕДИНЕНИЕ тПотребностиЗаказов КАК тПотребностиЗаказов
    |        ПО тСписанныеТовары.НоменклатураАртикул = тПотребностиЗаказов.НоменклатураАртикул
    |            И тСписанныеТовары.НоменклатураНаименование = тПотребностиЗаказов.НоменклатураНаименование";
    
    у меня выводятся наименование и артикул только из первой таблицы. А очень нужно все-таки именно 2-ым методом свести данные, хоть 1-ый и рабочий.
  2. Tiger86
    Offline

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

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

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Так в том то все и дело и по вашему коду те значения которые не попали в первую таблицу не выводятся. Количество выводится, а вот наименование нет.
  4. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    А как лучше реализовать следующую возможность:
    необходимо при выводе вышеуказанного запроса сгруппировать те позиции у которых есть два и более аналогов. Я аналоги вывожу, количество где более двух аналогов тоже знаю но как это сделать? Запускать еще отдельный цикл? Т.е. нужно еще какую-то временную таблицу создать для хранения промежуточного результата?
  5. Tiger86
    Offline

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

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

    добавьте еще ппакет, в котором для каждой номенклатуры считайте количество аналогов, и в результирующую выборку добавьте результат этого пакета, связав также по номенклатуре и наложив условие на количество аналогов
  6. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Вопрос решил, но не в запросе, а в операторе ЕСЛИ.
  7. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Перед этим мне нужно все данные из третьего вашего запроса добавить в одну временную таблицу а далее работать уже с ней и подключать новый регистр?
  8. Tiger86
    Offline

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

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

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Опять же моя вечная проблема: так и не смог разобраться как к номенклатуре через конструктор запроса привязать два и более аналогов(регистр сведений не переодический). До этого я это реализовывал через функцию и там делал выборку.

    Делал так
    Код:
    Функция ПолучитьАналогКод(Код, Номер) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |	АналогиНоменклатуры.Аналог.Наименование КАК АналогНаименование,
    |	СправочникНоменклатура.Код КАК НоменклатураКод,
    |	АналогиНоменклатуры.Аналог.Артикул КАК АналогАртикул,
    |	АналогиНоменклатуры.Аналог.Код КАК АналогКод
    |ИЗ
    |	РегистрСведений.АналогиНоменклатуры КАК АналогиНоменклатуры
    |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
    |		ПО АналогиНоменклатуры.Номенклатура = СправочникНоменклатура.Ссылка
    |ГДЕ
    |	СправочникНоменклатура.Код = &Код
    |
    |СГРУППИРОВАТЬ ПО
    |	АналогиНоменклатуры.Аналог.Наименование,
    |	СправочникНоменклатура.Код,
    |	АналогиНоменклатуры.Аналог.Артикул,
    |	АналогиНоменклатуры.Аналог.Код";
    Запрос.УстановитьПараметр("Код",Код);
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    Для Значения = 1 По (Выборка.Количество() - Номер) Цикл
    Выборка.Следующий();
    КонецЦикла;
    Возврат Выборка.АналогКод;
    КонецФункции
    
    не знаю как это все в тот запрос добавить.
    Здесь Номер 0 - 1-ый аналог, 1 - 2-ой итд.
  10. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    если вам для каждой номенклатуры все аналоги надо вывести, то я бы просто в цикле таблицу с аналогами обходила, так как если у номенклатуры более 1 аналога, то у вас при соединении 2 таблиц количество одинаковых записей будет равно количеству аналогов (т.е. задвоение пойдет)
  11. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Я в принципе так и поступаю.
  12. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

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

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    может у вас есть несколько элементов спр.. Номенклатура с одинаковым кодом, но с разными артикулами? и записи задваиваются? что не так с вашим Количество на выходе? задваивает или что? как вы проверяете что не правильно считает?
  14. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

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

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

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

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    я разобрался, спасибо
    Регистр не переодический.

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