Завис на формирование отчета. Подтолкните пожалуйста, куда дальше копать

1. user973528 17.01.19 11:22 Сейчас в теме
Формируются отчет по Меню блюд, в каждом блюде есть рацион питания (Взрослый, детский) нужно этот рацион питания сопоставить с продуктом в печатной форме. Никак этого сделать не получается

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


Для Каждого Блюдо Из Ссылка.Рационы Цикл

Область.Параметры.Диета = Блюдо.Рацион.Наименование;

Номер = Номер+1;

КонецЦикла;


Пытался сделать таким образом, но добавляет какую то ерунду, везде ставит ошибочно "Детское и взрослое"

Пример печатной формы во вложении, сама форма документа выглядит так

Уже 2 часа пытаюсь шаманить, никак не выходит подтянуть
Прикрепленные файлы:
Вознаграждение за ответ
Показать полностью
Найденные решения
5. 1serger 8 17.01.19 17:56 Сейчас в теме +0.42 $m
Номер = 1;
Для Каждого Блюдо Из Ссылка.Рационы Цикл
Область.Параметры.Диета = Блюдо.Рацион.Наименование;
Номер = Номер+1;
КонецЦикла;


Вы уверены, что это правильно?: перебираются все рационы из документа (не выборки запроса), а в итоге подставляется один-последний! Должны быть либо условия отбора... Может не Ссылка.Рацион, а (к примеру) ВыборкаБлюда.Блюдо.Рацион. (примерно, поскольку структуры справочника нет).

Для Каждого Блюдо Из ВыборкаБлюда.Блюдо.Рацион Цикл
Область.Параметры.Диета = Блюдо.Рацион.Наименование;
Номер = Номер+1;
КонецЦикла;
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Rus_Tiger 2 17.01.19 11:29 Сейчас в теме
Без исходной конфы с данными сложновато будет.... Тут столько кода, нужно отладкой проходить, да и запрос не из одной-двух таблиц состоит.
4. user973528 17.01.19 11:35 Сейчас в теме
(2) Вот есть такое дело
Прикрепленные файлы:
3. user973528 17.01.19 11:30 Сейчас в теме
Конфигурация
Медицина. Диетическое питание, редакция 2.0 (2.0.8.287)
5. 1serger 8 17.01.19 17:56 Сейчас в теме +0.42 $m
Номер = 1;
Для Каждого Блюдо Из Ссылка.Рационы Цикл
Область.Параметры.Диета = Блюдо.Рацион.Наименование;
Номер = Номер+1;
КонецЦикла;


Вы уверены, что это правильно?: перебираются все рационы из документа (не выборки запроса), а в итоге подставляется один-последний! Должны быть либо условия отбора... Может не Ссылка.Рацион, а (к примеру) ВыборкаБлюда.Блюдо.Рацион. (примерно, поскольку структуры справочника нет).

Для Каждого Блюдо Из ВыборкаБлюда.Блюдо.Рацион Цикл
Область.Параметры.Диета = Блюдо.Рацион.Наименование;
Номер = Номер+1;
КонецЦикла;
6. user973528 18.01.19 09:36 Сейчас в теме
(5)
Для Каждого Блюдо Из ВыборкаБлюда.Блюдо.Рацион Цикл
Область.Параметры.Диета = Блюдо.Рацион.Наименование;
Номер = Номер+1;
КонецЦикла;


Попробовал

ВыборкаБлюда = ВыборкаПриемаПищи.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
				Область = Макет.ПолучитьОбласть("Строка|" + ПостфиксОбластей);
				Пока ВыборкаБлюда.Следующий() Цикл
					Номер = 1;
					Для Каждого Блюдо Из ВыборкаБлюда.Блюдо.Рационы Цикл 
						Область.Параметры.Диета = Блюдо.Рацион.Наименование; 
							Номер = Номер+1; 
					КонецЦикла;


Тоже самое, подставляет последнее значение
7. 1serger 8 18.01.19 09:57 Сейчас в теме
Вот к этому вёл:

Вариант 1:
или если в одну ячейку всё, то:
////////////
СтрокаРацион="";
Для Каждого Блюдо Из ВыборкаБлюда.Блюдо.Рационы Цикл 

СтрокаРацион = СтрокаРацион+Блюдо.Рацион.Наименование;
Номер = Номер+1; 
КонецЦикла;
Область.Параметры.Диета = СтрокаРацион;
ТабДок.вывести(Область);
////////////////


Вариант 2:
/////////
Для Каждого Блюдо Из ВыборкаБлюда.Блюдо.Рационы Цикл 
Область.Параметры.Диета = Блюдо.Рацион.Наименование; 

ТабДок.вывести(Область);
Номер = Номер+1; 
КонецЦикла;
//////////


Область.Параметры.Диета должна выводиться после заполнения, или где-то учитываться, а не перезаполняться...
8. user973528 18.01.19 11:19 Сейчас в теме
(7)
Для Каждого Блюдо Из ВыборкаБлюда.Блюдо.Рационы Цикл
Область.Параметры.Диета = Блюдо.Рацион.Наименование;
ТабДок.вывести(Область);
Номер = Номер+1;
КонецЦикла;
Прикрепленные файлы:
9. senshkr 13 18.01.19 14:28 Сейчас в теме
Для Каждого Блюдо Из Ссылка.Рационы Цикл 

Область.Параметры.Диета = БЛЮДО2.БЛЮДОРАЦИОН.Наименование; 

Номер = Номер+1; 

КонецЦикла;
10. user973528 29.01.19 16:13 Сейчас в теме
(9)
БЛЮДОРАЦИОН


Не работает так
12. senshkr 13 29.01.19 19:45 Сейчас в теме
(10)
Это почему я в (9) БЛЮДО2 написал......
без двойки надо, надеюсь Вы без двойки пробовали.
13. user973528 30.01.19 09:27 Сейчас в теме
(12)
то почему я в (9) БЛЮДО2 написал......
без двойки надо, надеюсь Вы без двойки пробовали.


Конечно без двойки, тоже самое выходит.
Вроде получилось сделать вот так как писали выше

Пока ВыборкаПродуктов.Следующий() Цикл
                        Область = Макет.ПолучитьОбласть("Строка|" + ПостфиксОбластей);
                                                
                        //Если ВыборкаПродуктов.Брутто <> 0 Тогда
                        //    Область.Параметры.ПроцентОтхода = (ВыборкаПродуктов.Брутто - ВыборкаПродуктов.Нетто) / ВыборкаПродуктов.Брутто * 100
                        //КонецЕсли; 
                        
                        СтруктураПараметровЯчейки = Новый Структура;
                        СтруктураПараметровЯчейки.Вставить("Нетто", Питание_НаКлиентеНаСервере.глОкруглить(ВыборкаПродуктов.Нетто, ВыборкаПродуктов.Округление));
                        СтруктураПараметровЯчейки.Вставить("Брутто", Питание_НаКлиентеНаСервере.глОкруглить(ВыборкаПродуктов.Брутто, ВыборкаПродуктов.Округление));
                        
                        Область.Параметры.Заполнить(ВыборкаПродуктов);
                        Область.Параметры.Заполнить(ВыборкаПродуктов.Продукт);
						
						
						Номер = 1;
						
						СтрокаРацион="";
					
						
						Для Каждого Блюдо Из ВыборкаПродуктов.Блюдо.Рационы Цикл
							
						Если Блюдо.Использование = Истина Тогда
									
						СтрокаРацион = СтрокаРацион + " " + Блюдо.Рацион.Наименование;
                        
                        Область.Параметры.Диета = СтрокаРацион;
                        
                    	Номер = Номер+1;
						
					Иначе
						
						Продолжить;
						
						
					КонецЕсли;
Показать
11. user973528 29.01.19 16:14 Сейчас в теме
(9) Скорей всего надо формировать тогда запрос, объединять таблички, делать ТЗ и перебирать их
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот