Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
24 ноя 2024, 10:07

вывод результата в запросе с циклом

Автор ldmitriy, 16 мар 2011, 07:59

0 Пользователей и 2 гостей просматривают эту тему.

ldmitriy

Доброго времени суток, хотел задать следующий вопрос, предприятие выпускает опоры, которые в свою очередь делятся ешё на детали, в запросе необходимо найти всё делали что входят в опору сгруппировать их и посчитать вес по каждой. сам вопрос заключается в следующем, в запросе можно выбрать 2 и более опоры, как сделать так чтобы в результате выполнения запроса с несколькими опорами в макет выводились все найденные делали по всем запрашиваемым опорам а не только по первой. заранее благодарен, не судите строго, месяц только работаю...

Процедура КнопкаСформироватьНажатие(Кнопка)
   Перем Итого;
   Итого=0;
   ТаблицаТаблицаВыбор = ЭлементыФормы.ТаблицаВыбор.Значение.Выгрузить();
   ТабДок = Новый ТабличныйДокумент;
   ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РасчетПоВесу";
   Макет = ПолучитьМакет("Комплект");
   ОбластьШапка = Макет.ПолучитьОбласть("ШапкаВерх");
   ОбластьШапка.Параметры.Дата = ТекущаяДата();
   ТабДок.Вывести(ОбластьШапка);
   
   Для Каждого СтрокаТабличнойЧасти Из ТаблицаВыбор Цикл
      ОбластьВыбор=Макет.ПолучитьОбласть("Выбор");
      ОбластьВыбор.Параметры.НаименованиеПродукции = СтрокаТабличнойЧасти.Опоры;   
      ОбластьВыбор.Параметры.Количество = СтрокаТабличнойЧасти.Количество;
      ТабДок.Вывести(ОбластьВыбор);   
   КонецЦикла;
   
   ОбластьШапка = Макет.ПолучитьОбласть("ШапкаНиз");
   ТабДок.Вывести(ОбластьШапка);
   РезультатПоиска = Справочники.ВидыНоменклатуры.НайтиПоКоду("000000002");
   Для Каждого СтрокаТабличнойЧасти Из ТаблицаВыбор Цикл
      ЗапросОпоры = Новый Запрос;
      ЗапросОпоры.УстановитьПараметр("Материал", РезультатПоиска );
      ЗапросОпоры.УстановитьПараметр("Номенклатура", СтрокаТабличнойЧасти.Опоры  );
      ЗапросОпоры.Текст =    "ВЫБРАТЬ
      |   Металлопрокат.Номенклатура КАК НоменклатураМарка,
      |   СУММА(Металлопрокат.Количество * ЕдиницыИзмерения.Вес * Марки.Количество * Пакеты.Количество) КАК Вес
      |ИЗ
      |   РегистрСведений.КомплектующиеНоменклатуры КАК Пакеты
      |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних КАК ПакетыОсновныеСпецификацииСрезПоследних
      |         ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Марки
      |            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних КАК МаркиСпецификацииНоменклатурыСрезПоследних
      |               ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Металлопрокат
      |                  ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
      |                  ПО Металлопрокат.Номенклатура = ЕдиницыИзмерения.Владелец
      |               ПО МаркиСпецификацииНоменклатурыСрезПоследних.СпецификацияНоменклатуры = Металлопрокат.Ссылка
      |            ПО Марки.Номенклатура = МаркиСпецификацииНоменклатурыСрезПоследних.Номенклатура
      |         ПО (Марки.Ссылка = ПакетыОсновныеСпецификацииСрезПоследних.СпецификацияНоменклатуры)
      |      ПО Пакеты.Комплектующая = ПакетыОсновныеСпецификацииСрезПоследних.Номенклатура
      |ГДЕ
      |   Пакеты.Номенклатура = &Номенклатура
      |   И ЕдиницыИзмерения.Ссылка = Металлопрокат.ЕдиницаИзмерения
      |   И Металлопрокат.Номенклатура.ВидНоменклатуры = &Материал
      |
      |СГРУППИРОВАТЬ ПО
      |   Металлопрокат.Номенклатура
      |
      |ОБЪЕДИНИТЬ ВСЕ
      |
      |   ВЫБРАТЬ
      |   Металлопрокат.Номенклатура,
   //   | проверить сумму (позиции.кол-во)
      |   СУММА(Металлопрокат.Количество * ЕдиницыИзмерения.Вес * Позиции.Количество * Марки.Количество * Пакеты.Количество) КАК Вес
      |ИЗ
      |   РегистрСведений.КомплектующиеНоменклатуры КАК Пакеты
      |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних КАК ПакетыОсновныеСпецификацииСрезПоследних
      |         ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Марки
      |            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних КАК МаркиСпецификацииНоменклатурыСрезПоследних
      |               ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Позиции
      |                  ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних КАК ПозицииСпецификацииНоменклатурыСрезПоследних
      |                     ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Металлопрокат
      |                        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
      |                        ПО Металлопрокат.Номенклатура = ЕдиницыИзмерения.Владелец
      |                     ПО ПозицииСпецификацииНоменклатурыСрезПоследних.СпецификацияНоменклатуры = Металлопрокат.Ссылка
      |                  ПО Позиции.Номенклатура = ПозицииСпецификацииНоменклатурыСрезПоследних.Номенклатура
      |               ПО МаркиСпецификацииНоменклатурыСрезПоследних.СпецификацияНоменклатуры = Позиции.Ссылка
      |            ПО Марки.Номенклатура = МаркиСпецификацииНоменклатурыСрезПоследних.Номенклатура
      |         ПО (Марки.Ссылка = ПакетыОсновныеСпецификацииСрезПоследних.СпецификацияНоменклатуры)
      |      ПО Пакеты.Комплектующая = ПакетыОсновныеСпецификацииСрезПоследних.Номенклатура
      |ГДЕ
      |   Пакеты.Номенклатура = &Номенклатура
      |
      |СГРУППИРОВАТЬ ПО
      |   Металлопрокат.Номенклатура";
      
      ЗапросОпоры=ЗапросОпоры.Выполнить().Выгрузить();
      ЗапросОпоры.Свернуть("НоменклатураМарка", "Вес");
      ОбластьМеталл = Макет.ПолучитьОбласть("Металл");

      Для Каждого Строка Из ЗапросОпоры Цикл
         
               ЕСЛИ НЕ ЗначениеЗаполнено (Строка.Вес)  ТОГДА
      Иначе
            ОбластьМеталл.Параметры.СпецификацииНоменклатуры = Строка.НоменклатураМарка;
            ОбластьМеталл.Параметры.ВесПоМеталлу = Строка.Вес * СтрокаТабличнойЧасти.Количество;
            ТабДок.Вывести(ОбластьМеталл);
            Итого = Итого + Строка.Вес * СтрокаТабличнойЧасти.Количество;
         КонецЕсли;
      КонецЦикла;
      ОбластьИтого = Макет.ПолучитьОбласть("Итого");
      ОбластьИтого.Параметры.СуммаПоВесу = Итого;
      ТабДок.Вывести(ОбластьИтого);
   КонецЦикла;
   ТабДок.Показать();
КонецПроцедуры

cska-fanat-kz

Пишу замечания все подряд, как в голову приходили:
1. Области получайте один раз в самом начале процедуры
2. Запрос в цикле не есть хорошо. Очень медленно будет работать.
У вас и так там куча соединений. Что вам стоит добавить еще одно по которому вы цикл крутите? При невозможности добавляйте условие что-то типа "Опора В (&СписокОпор)" и в этот параметр выгружайте колонку из вашей ТЗ.
3. Зачем столько уровней? КомплектующиеНоменклатуры, СпецификацииНоменклатуры, ОсновныеСпецификацииНоменклатуры... Это самописно или что-то типовое? По логике вполне хватает пары уровней: Справочник Опоры и КомплектующиеОпор (последнее либо РегистрСведений, либо подчиненный справочник, либо ТЧ справочника Опоры)
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

ldmitriy

Спасибо буду разбираться...
Уровней столько из-за вложенности, там ситуация такая, что опоры делятся на пакеты, те на марки, те на позиции и те на металлопрокат и по всем надо считать кол-во и перемножать, т.к. например в опоре может быть 6 пакетов, а у тех ещё по 2-3 марки, а посути это и есть подч. таблица исх.компл и регистр сведений.

cska-fanat-kz

Зачем в запросе нужно Объединение?
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

ldmitriy

Цитата: cska-fanat-kz от 16 мар 2011, 09:05
Зачем в запросе нужно Объединение?

опять же из-за вложенности, в некоторые опорах марки ещё делятся на позиции а потом только на металлопрокат, а в некоторых сразу марки=>металлопрокат, т.е. разное кол-во вложенностей

Klyacksa

Уважаемый ldmitriy, я отказываюсь читать столько кода в таком виде. Отредактируйте, пожалуйста, свое сообщение, используя выделение кода (тег "code"). Или если редактирование уже не доступно - киньте код еще раз в удобочитаемом виде.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

ldmitriy

Процедура КнопкаСформироватьНажатие(Кнопка)
   Перем Итого;
   Итого=0;
   ТаблицаТаблицаВыбор = ЭлементыФормы.ТаблицаВыбор.Значение.Выгрузить();
   ТабДок = Новый ТабличныйДокумент;
   ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РасчетПоВесу";
   Макет = ПолучитьМакет("Комплект");
   ОбластьШапка = Макет.ПолучитьОбласть("ШапкаВерх");
   ОбластьШапка.Параметры.Дата = ТекущаяДата();
   ТабДок.Вывести(ОбластьШапка);
   
   Для Каждого СтрокаТабличнойЧасти Из ТаблицаВыбор Цикл
      ОбластьВыбор=Макет.ПолучитьОбласть("Выбор");
      ОбластьВыбор.Параметры.НаименованиеПродукции = СтрокаТабличнойЧасти.Опоры;   
      ОбластьВыбор.Параметры.Количество = СтрокаТабличнойЧасти.Количество;
      ТабДок.Вывести(ОбластьВыбор);   
   КонецЦикла;
   
   ОбластьШапка = Макет.ПолучитьОбласть("ШапкаНиз");
   ТабДок.Вывести(ОбластьШапка);
   РезультатПоиска = Справочники.ВидыНоменклатуры.НайтиПоКоду("000000002");
   Для Каждого СтрокаТабличнойЧасти Из ТаблицаВыбор Цикл
      ЗапросОпоры = Новый Запрос;
      ЗапросОпоры.УстановитьПараметр("Материал", РезультатПоиска );
      ЗапросОпоры.УстановитьПараметр("Номенклатура", СтрокаТабличнойЧасти.Опоры  );
      ЗапросОпоры.Текст =    "ВЫБРАТЬ
      |   Металлопрокат.Номенклатура КАК НоменклатураМарка,
      |   СУММА(Металлопрокат.Количество * ЕдиницыИзмерения.Вес * Марки.Количество * Пакеты.Количество) КАК Вес
      |ИЗ
      |   РегистрСведений.КомплектующиеНоменклатуры КАК Пакеты
      |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних КАК ПакетыОсновныеСпецификацииСрезПоследних
      |         ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Марки
      |            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних КАК МаркиСпецификацииНоменклатурыСрезПоследних
      |               ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Металлопрокат
      |                  ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
      |                  ПО Металлопрокат.Номенклатура = ЕдиницыИзмерения.Владелец
      |               ПО МаркиСпецификацииНоменклатурыСрезПоследних.СпецификацияНоменклатуры = Металлопрокат.Ссылка
      |            ПО Марки.Номенклатура = МаркиСпецификацииНоменклатурыСрезПоследних.Номенклатура
      |         ПО (Марки.Ссылка = ПакетыОсновныеСпецификацииСрезПоследних.СпецификацияНоменклатуры)
      |      ПО Пакеты.Комплектующая = ПакетыОсновныеСпецификацииСрезПоследних.Номенклатура
      |ГДЕ
      |   Пакеты.Номенклатура = &Номенклатура
      |   И ЕдиницыИзмерения.Ссылка = Металлопрокат.ЕдиницаИзмерения
      |   И Металлопрокат.Номенклатура.ВидНоменклатуры = &Материал
      |
      |СГРУППИРОВАТЬ ПО
      |   Металлопрокат.Номенклатура
      |
      |ОБЪЕДИНИТЬ ВСЕ
      |
      |   ВЫБРАТЬ
      |   Металлопрокат.Номенклатура,
   //   | проверить сумму (позиции.кол-во)
      |   СУММА(Металлопрокат.Количество * ЕдиницыИзмерения.Вес * Позиции.Количество * Марки.Количество * Пакеты.Количество) КАК Вес
      |ИЗ
      |   РегистрСведений.КомплектующиеНоменклатуры КАК Пакеты
      |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних КАК ПакетыОсновныеСпецификацииСрезПоследних
      |         ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Марки
      |            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних КАК МаркиСпецификацииНоменклатурыСрезПоследних
      |               ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Позиции
      |                  ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних КАК ПозицииСпецификацииНоменклатурыСрезПоследних
      |                     ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Металлопрокат
      |                        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
      |                        ПО Металлопрокат.Номенклатура = ЕдиницыИзмерения.Владелец
      |                     ПО ПозицииСпецификацииНоменклатурыСрезПоследних.СпецификацияНоменклатуры = Металлопрокат.Ссылка
      |                  ПО Позиции.Номенклатура = ПозицииСпецификацииНоменклатурыСрезПоследних.Номенклатура
      |               ПО МаркиСпецификацииНоменклатурыСрезПоследних.СпецификацияНоменклатуры = Позиции.Ссылка
      |            ПО Марки.Номенклатура = МаркиСпецификацииНоменклатурыСрезПоследних.Номенклатура
      |         ПО (Марки.Ссылка = ПакетыОсновныеСпецификацииСрезПоследних.СпецификацияНоменклатуры)
      |      ПО Пакеты.Комплектующая = ПакетыОсновныеСпецификацииСрезПоследних.Номенклатура
      |ГДЕ
      |   Пакеты.Номенклатура = &Номенклатура
      |
      |СГРУППИРОВАТЬ ПО
      |   Металлопрокат.Номенклатура";
     
      ЗапросОпоры=ЗапросОпоры.Выполнить().Выгрузить();
      ЗапросОпоры.Свернуть("НоменклатураМарка", "Вес");
      ОбластьМеталл = Макет.ПолучитьОбласть("Металл");

      Для Каждого Строка Из ЗапросОпоры Цикл
         
               ЕСЛИ НЕ ЗначениеЗаполнено (Строка.Вес)  ТОГДА
      Иначе
            ОбластьМеталл.Параметры.СпецификацииНоменклатуры = Строка.НоменклатураМарка;
            ОбластьМеталл.Параметры.ВесПоМеталлу = Строка.Вес * СтрокаТабличнойЧасти.Количество;
            ТабДок.Вывести(ОбластьМеталл);
            Итого = Итого + Строка.Вес * СтрокаТабличнойЧасти.Количество;
         КонецЕсли;
      КонецЦикла;
      ОбластьИтого = Макет.ПолучитьОбласть("Итого");
      ОбластьИтого.Параметры.СуммаПоВесу = Итого;
      ТабДок.Вывести(ОбластьИтого);
   КонецЦикла;
   ТабДок.Показать();
КонецПроцедуры


вот так?

Klyacksa

Да, так.
Как уже заметил cska-fanat-kz, получать область достаточно один раз:

   ОбластьВыбор=Макет.ПолучитьОбласть("Выбор");
   Для Каждого СтрокаТабличнойЧасти Из ТаблицаВыбор Цикл
      ОбластьВыбор.Параметры.НаименованиеПродукции = СтрокаТабличнойЧасти.Опоры;   
      ОбластьВыбор.Параметры.Количество = СтрокаТабличнойЧасти.Количество;
      ТабДок.Вывести(ОбластьВыбор);   
   КонецЦикла;


Теперь с запросом. Что-то мне подсказывает, что с объединением и количеством таблиц вы переборщили. Давайте разбираться, что где хранится.
Есть Регистр сведений "КомплектующиеНоменклатуры", где хранится связка Номенклатура(опоры)->Комплектующие(детали). так?\
А что у нас есть Спецификации номенклатуры? Исходные комплектующие? Как привызаны единицы измерения?
Опишите подробней.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск