Есть запрос, в одном пакете получаю поставщиков по номенклатуре и наименования номенклатуры поставщиков, а в другом пакете потребности номенклатуры. Потребности выводятся и все хорошо,но надо присоединять столбцы с поставщиками,т.е. нужно узнать максимальное количество поставщиков по каждой номенклатуре. Подскажите пожалуйста,как правильно выводить,желательно с примерами.
ВЫБРАТЬ
НоменклатураПоставщиков.Номенклатура КАК Номенклатура,
НоменклатураПоставщиков.ВариантИсполнения КАК ВариантИсполнения,
НоменклатураПоставщиков.Поставщик КАК Поставщик,
НоменклатураПоставщиков.НоменклатураПоставщика КАК НоменклатураПоставщика,
НоменклатураПоставщиков.ВариантИсполненияПоставщика КАК ВариантИсполненияПоставщика
ИЗ
РегистрСведений.НоменклатураПоставщиков КАК НоменклатураПоставщиков
ИТОГИ ПО
ВариантИсполнения,
НоменклатураПоставщика,
ВариантИсполненияПоставщика,
Номенклатура
;
(1)В таком виде по моему в таком виде это будет не читабельно для пользователя и геморойно для программиста. Просто представьте что найдется десяток или больше поставщиков. Выводите в одной ячейке в многострочный сразу
Команда присоединить позволяет работать с ячейками на макете, то есть вы получаете (область ячейки|область макета) и идентифицируете ее по номеру связывая по номенклатуре, вот здесь смотрите пример https://forum.mista.ru/topic.php?id=529453
ТаблицаСНомПоставщика = ЗапросНомПоставщика.Выполнить().Выгрузить();
Пока Выборка.Следующий() Цикл //Основной запрос
Отбор = Новый Структура("Номенклатура",Выборка.Номенклатура);
МассивПоставщиков = ТаблицаСНомПоставщика.НайтиСтроки(Отбор); //Находим в таблице всех поставщиков по номенклатуре.
Для каждого стр из МассивПоставщиков Цикл
//стр.Поставщик
КонецЦикла;
КонецЦикла:
(10) Не правильная конструкция. если присмотреться.
У них было ТаблНомПост = РезультатЗапросаПост.Выполнить().Выгрузить();
А надо было ТаблНомПост = Запрос.Выполнить().Выгрузить();
Процедура ВывестиГруппировку(ВхМакет, ВхЗапрВыб, ВхТипГр, ВхНомГр, ВхТаблГр, ВхУровень, ВхТаблДок, ВхТаблПакетныйЗаказПоставщику = Неопределено)
РезультатыЗапросаПост = ПолучитьДанные();
РезультатЗапросаПост = РезультатыЗапросаПост[2];
ТаблНомПост = РезультатЗапросаПост.Выгрузить();
_ДнейВМесяце = 30;
Если ВхУровень >= 5 Тогда // максимум 5 уровней (0-4)
Возврат;
КонецЕсли;
_ИмяСекции = ?(ВхТипГр = "Строки", "Гр" + ВхУровень, "ГрИтоги");
_ИмяГр = ВхТаблГр[ВхНомГр].ИмяИзмерения;
_ВыводитьИтогиПоГруппировке = ВхТаблГр[ВхНомГр].ВыводитьИтоги;
_ТипИзмерения = ВхТаблГр[ВхНомГр].ТипИзмерения;
Пока ВхЗапрВыб.Следующий() Цикл
// "_ИмяСекции|Начало"
Если ВхТипГр = "Итоги" Тогда
Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Начало");
ВхТаблДок.Вывести(Область, ВхУровень);
Иначе
_ЗначениеГр = ВхЗапрВыб[_ИмяГр]; // значение группировки по имени
Если ВхНомГр = (ВхТаблГр.Количество() - 1) И _ИмяГр = "ВариантИсполнения" Тогда // последняя группировка ("ВариантИсполнения")
Если глПустоеЗначение(_ЗначениеГр) Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Начало");
Если ТипЗнч(_ЗначениеГр) = Тип("СправочникСсылка.Номенклатура") Тогда
Если _ЗначениеГр.ЭтоГруппа Тогда
Область.Параметры.ЗначениеГрСтр = ВРЕГ(глНоменклатураСтр(_ЗначениеГр));
Иначе
Если мИспользоватьАртикулы Тогда
Область.Параметры.Артикул = _ЗначениеГр.Артикул;
КонецЕсли;
Область.Параметры.ЗначениеГрСтр = глНоменклатураСтр(_ЗначениеГр, Ложь) + ", " + _ЗначениеГр[ИспользуемыеЕдиницыИзмерения];
// для номенклатуры (элементов -> итоги будем выводить при условии, что тип измерения выбран как "Иерархия")
Если _ТипИзмерения = ТипИзмеренияПостроителяОтчета.Иерархия Тогда
_ВыводитьИтогиПоГруппировке = Истина;
КонецЕсли;
КонецЕсли;
Иначе
Если мИспользоватьАртикулы
И ТипЗнч(_ЗначениеГр) = Тип("СправочникСсылка.ВариантыИсполнения") Тогда
Область.Параметры.Артикул = _ЗначениеГр.Артикул;
КонецЕсли;
Область.Параметры.ЗначениеГрСтр = _ЗначениеГр;
КонецЕсли;
Область.Параметры.Расшифровка = _ЗначениеГр;
ВхТаблДок.Вывести(Область, ВхУровень);
КонецЕсли;
// "_ИмяСекции|ВертикальныйРазделитель"
Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|ВертикальныйРазделитель1");
ВхТаблДок.Присоединить(Область);
Если _ИмяГр = "Номенклатура" или _ИмяГр = "ВариантИсполнения" тогда
Отбор=Новый Структура("Номенклатура",ВхЗапрВыб.Номенклатура);
МассивПост=ТаблНомПост.НайтиСтроки(Отбор);
Для Каждого стр из МассивПост цикл
Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "Номенклатура" И НЕ ВхЗапрВыб.РазрешитьНесколькоВариантовИсполнения
Тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.НоменклатураПоставщика;
иначе Если _ИмяГр = "ВариантИсполнения" тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.ВариантИсполненияПоставщика;
КонецЕсли;
КонецЕсли;
ВхТаблДок.Присоединить(Область);
КонецЦикла;
КонецЕсли;
(13) Попробуйте запустить отчет в режиме замер производительности. Там где больше обращений и будет зацикливание.
Просто по коду не понятно где.
Вам нужно было выводить максимум 3 поставщика, но по коду этого нет и теоретически может быть больше и возможно последующий код зацикливается.
Так же можно в разных местах выставить счетчики. Если счетчик превысит 10000 значений там и зацикливание (выдать сообщение).
Просто по выборке по определению не может быть зацикливания. И таблица ограничена количеством строк.
(14) ааа,я поняла, короче есть номенклатура Без ВИ, а есть С ВИ
и по ней тоже надо делать отбор
СтруктураОтбора = Новый Структура("Номенклатура,ВариантИсполнения", ВхЗапрВыб.Номенклатура, ВхЗапрВыб.ВариантИсполнения);
МассивПост=ТаблНомПост.НайтиСтроки(Отбор);
Хотела так,но выходит ошибка Ошибка при вызове метода контекста (НайтиСтроки)
МассивПост=ТаблНомПост.НайтиСтроки(Отбор);
по причине:
Несоответствие типов (параметр номер '1')
(15) Посмотрите, есть ли в таблице такая колонка "ВариантИсполнения", возможно по другому называется.
Посмотреть можно также в самом запросе на соответствующей вкладке.
(18)Да,да Спасибо
Смотрите,а как сейчас объяснить,что он должен если несколько поставщиков для одной номенклатуры присоединять справа,шапку то у меня цепляет,а остальное нет
(19) Не совсем понятно что имеется ввиду, если как в начале. Всегда выводите трех поставщиков (можно проверить максимум, но это уже следующий этап).
И всегда присоединяйте три значения, если значения два (определяется счетчиком), то выводите пустые яйчеки.
Счетчик=ТаблНомПост[3].Поставщик;
пока Счетчик<>0 Цикл
Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "Номенклатура" тогда
Отбор=Новый Структура("Номенклатура",ВхЗапрВыб.Номенклатура);
МассивПост=ТаблНомПост.НайтиСтроки(Отбор);
Для Каждого стр из МассивПост цикл
//Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "Номенклатура" И НЕ ВхЗапрВыб.РазрешитьНесколькоВариантовИсполнения
Тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.НоменклатураПоставщика;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если _ИмяГр = "ВариантИсполнения" тогда
СтруктураОтбора = Новый Структура("Номенклатура,ВариантИсполнения", ВхЗапрВыб.Номенклатура, ВхЗапрВыб.ВариантИсполнения);
МассивПост=ТаблНомПост.НайтиСтроки(СтруктураОтбора);
Для Каждого стр из МассивПост цикл
//Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "ВариантИсполнения" тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.ВариантИсполненияПоставщика;
КонецЕсли;
//ВхТаблДок.Присоединить(Область);
КонецЦикла;
КонецЕсли;
ВхТаблДок.Присоединить(Область);
Счетчик=Счетчик-1;
КонецЦикла;
Показать
Все добавляет 3 ,но данные только одного поставщика везде
Счетчик=ТаблНомПост[3].Поставщик;
пока Счетчик<>0 Цикл
Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "Номенклатура" тогда
Отбор=Новый Структура("Номенклатура",ВхЗапрВыб.Номенклатура);
МассивПост=ТаблНомПост.НайтиСтроки(Отбор);
Для Каждого стр из МассивПост цикл
//Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "Номенклатура" И НЕ ВхЗапрВыб.РазрешитьНесколькоВариантовИсполнения
Тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.НоменклатураПоставщика;
ВхТаблДок.Присоединить(Область);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если _ИмяГр = "Номенклатура" или _ИмяГр = "ВариантИсполнения" тогда
СтруктураОтбора = Новый Структура("Номенклатура,ВариантИсполнения", ВхЗапрВыб.Номенклатура, ВхЗапрВыб.ВариантИсполнения);
МассивПост=ТаблНомПост.НайтиСтроки(СтруктураОтбора);
Для Каждого стр из МассивПост цикл
//Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "Номенклатура" Тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.НоменклатураПоставщика;
ВхТаблДок.Присоединить(Область);
КонецЕсли;
Если _ИмяГр = "ВариантИсполнения" тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.ВариантИсполненияПоставщика;
ВхТаблДок.Присоединить(Область);
КонецЕсли;
//ВхТаблДок.Присоединить(Область);
КонецЦикла;
КонецЕсли;
ВхТаблДок.Присоединить(Область);
Счетчик=Счетчик-1;
КонецЦикла;
Сч = 1;
Для Каждого стр из МассивПост цикл
//Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "Номенклатура" И НЕ ВхЗапрВыб.РазрешитьНесколькоВариантовИсполнения
Тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.НоменклатураПоставщика;
ВхТаблДок.Присоединить(Область);
Сч = Сч + 1;
КонецЕсли;
Если Сч = 3 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Показать
Так как вывод яйчеек идет здесь, иначе не было бы столько колонок.
Счетчик=ТаблНомПост[3].Поставщик;
пока Счетчик<>0 Цикл
Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "ОснПоставщик" тогда
СтруктураОтбора = Новый Структура("Номенклатура,ВариантИсполнения", ВхЗапрВыб.Номенклатура, ВхЗапрВыб.ВариантИсполнения);
МассивПост=ТаблНомПост.НайтиСтроки(СтруктураОтбора);
Сч=1;
Для Каждого стр из МассивПост цикл
//Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "ОснПоставщик" Тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.Поставщик;
ВхТаблДок.Присоединить(Область);
Сч=Сч+1;
КонецЕсли;
Если Сч = 3 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если _ИмяГр = "Номенклатура" тогда
Отбор=Новый Структура("Номенклатура",ВхЗапрВыб.Номенклатура);
МассивПост=ТаблНомПост.НайтиСтроки(Отбор);
Сч1=1;
Для Каждого стр из МассивПост цикл
//Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "Номенклатура" И НЕ ВхЗапрВыб.РазрешитьНесколькоВариантовИсполнения
Тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.НоменклатураПоставщика;
ВхТаблДок.Присоединить(Область);
Сч1=Сч1+1;
КонецЕсли;
Если Сч1 = 3 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
// ВхТаблДок.Присоединить(Область);
КонецЕсли;
Если _ИмяГр = "Номенклатура" или _ИмяГр = "ВариантИсполнения" тогда
СтруктураОтбора = Новый Структура("Номенклатура,ВариантИсполнения", ВхЗапрВыб.Номенклатура, ВхЗапрВыб.ВариантИсполнения);
МассивПост=ТаблНомПост.НайтиСтроки(СтруктураОтбора);
Сч2=1;
Для Каждого стр из МассивПост цикл
//Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "Номенклатура" Тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.НоменклатураПоставщика;
ВхТаблДок.Присоединить(Область);
Сч2=Сч2+1
Иначе
Если
_ИмяГр = "ВариантИсполнения" тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.ВариантИсполненияПоставщика;
ВхТаблДок.Присоединить(Область);
Сч2=Сч2+1
КонецЕсли;
КонецЕсли;
Если Сч2 = 3 Тогда
Прервать;
КонецЕсли;
//ВхТаблДок.Присоединить(Область);
КонецЦикла;
//ВхТаблДок.Присоединить(Область);
КонецЕсли;
//ВхТаблДок.Присоединить(Область);
Счетчик=Счетчик-1;
КонецЦикла;
Показать
Вот так? Ерунда выходит,вообще не выходят данные,только шапка выходит
(29) Надо пересмотреть общую картину вывода. Я не совсем понимаю что у вас делается, а анализировать куски кода очень проблематично. А весь код, это надо время.
(30)Сейчас вот такой код и в итоге получается вот так.
Счетчик=ТаблНомПост[3].Поставщик;
пока Счетчик<>0 Цикл
Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "ОснПоставщик" тогда
СтруктураОтбора = Новый Структура("Номенклатура,ВариантИсполнения", ВхЗапрВыб.Номенклатура, ВхЗапрВыб.ВариантИсполнения);
МассивПост=ТаблНомПост.НайтиСтроки(СтруктураОтбора);
Сч=1;
Для Каждого стр из МассивПост цикл
//Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "ОснПоставщик" Тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.Поставщик;
ВхТаблДок.Присоединить(Область);
Сч=Сч+1;
КонецЕсли;
Если Сч = 3 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если _ИмяГр = "Номенклатура" тогда
Отбор=Новый Структура("Номенклатура",ВхЗапрВыб.Номенклатура);
МассивПост=ТаблНомПост.НайтиСтроки(Отбор);
Сч1=1;
Для Каждого стр из МассивПост цикл
//Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "Номенклатура" И НЕ ВхЗапрВыб.РазрешитьНесколькоВариантовИсполнения
Тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.НоменклатураПоставщика;
ВхТаблДок.Присоединить(Область);
Сч1=Сч1+1;
КонецЕсли;
Если Сч1 = 3 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
// ВхТаблДок.Присоединить(Область);
КонецЕсли;
Если _ИмяГр = "Номенклатура" или _ИмяГр = "ВариантИсполнения" тогда
СтруктураОтбора = Новый Структура("Номенклатура,ВариантИсполнения", ВхЗапрВыб.Номенклатура, ВхЗапрВыб.ВариантИсполнения);
МассивПост=ТаблНомПост.НайтиСтроки(СтруктураОтбора);
Сч2=1;
Для Каждого стр из МассивПост цикл
//Область = ВхМакет.ПолучитьОбласть(_ИмяСекции + "|Поставщик");
Если _ИмяГр = "Номенклатура" Тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.НоменклатураПоставщика;
ВхТаблДок.Присоединить(Область);
Сч2=Сч2+1
Иначе Если
_ИмяГр = "ВариантИсполнения" тогда
Область.Параметры.ЗначениеГрСтрПостав = стр.ВариантИсполненияПоставщика;
ВхТаблДок.Присоединить(Область);
Сч2=Сч2+1
КонецЕсли;
КонецЕсли;
Если Сч2 = 3 Тогда
Прервать;
КонецЕсли;
//ВхТаблДок.Присоединить(Область);
КонецЦикла;
//ВхТаблДок.Присоединить(Область);
КонецЕсли;
//ВхТаблДок.Присоединить(Область);
Счетчик=Счетчик-1;
КонецЦикла;
Я бы не показывал каждого поставщика в отдельной колонке, а сделал бы одну колонку "поставщики" и в ресурсах для этой колонки записал бы формулу СоединитьСтроки("Поставщик"). Тогда в колонке будет выводится список поставщиков через запятую.
(33)Раз количество поставщиков ограничено 3, проще сразу в макете сделать три колонки чтоб не разъезжалось и заполнять их по наличию.
И цикл использовать
Для Счетчик = 1 По 3 Цикл
КонецЦикла
Или так
Для Счетчик = 0 По Макс(2, МассивПост.Количество() - 1) Цикл
КонецЦикла
И по Счетчик получать в какую колонку какой элемент массива выводить.
Тогда нужно писать примерно такой запрос. В консоли не проверял, могут быть ошибки) и колонку "номер поставщика" выводить в колонки таблицы
ВЫБРАТЬ
НоменклатураПоставщиков.Номенклатура КАК Номенклатура,
НоменклатураПоставщиков.ВариантИсполнения КАК ВариантИсполнения,
НоменклатураПоставщиков.Поставщик КАК Поставщик,
Количество(различные НоменклатураПоставщиков2.Поставщик) как НомерПоставщика
Поместить НомераПоставщиков
ИЗ
РегистрСведений.НоменклатураПоставщиков КАК НоменклатураПоставщиков
Левое соединение РегистрСведений.НоменклатураПоставщиков КАК НоменклатураПоставщиков2
по НоменклатураПоставщиков.Номенклатура = НоменклатураПоставщиков2.Номенклатура
И НоменклатураПоставщиков.ВариантИсполнения = НоменклатураПоставщиков2.ВариантИсполнения
И НоменклатураПоставщиков.Поставщик<=НоменклатураПоставщиков2.Поставщик
Сгруппировать по
;
ВЫБРАТЬ
НоменклатураПоставщиков.Номенклатура КАК Номенклатура,
НоменклатураПоставщиков.ВариантИсполнения КАК ВариантИсполнения,
НоменклатураПоставщиков.Поставщик КАК Поставщик,
НомераПоставщиков.НомерПоставщика,
НоменклатураПоставщиков.НоменклатураПоставщика КАК НоменклатураПоставщика,
НоменклатураПоставщиков.ВариантИсполненияПоставщика КАК ВариантИсполненияПоставщика
ИЗ
РегистрСведений.НоменклатураПоставщиков КАК НоменклатураПоставщиков
Левое Соединение НомераПоставщиков Как НомераПоставщиков
По
НоменклатураПоставщиков.Номенклатура = НомераПоставщиков.Номенклатура
И НоменклатураПоставщиков.ВариантИсполнения = НомераПоставщиков.ВариантИсполнения
И НоменклатураПоставщиков.Поставщик = НомераПоставщиков.Поставщик
ИТОГИ ПО
ВариантИсполнения,
НомерПоставщика,
НоменклатураПоставщика,
ВариантИсполненияПоставщика,
Номенклатура
;