8.х нужна помощь с условием

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Dmitrij, 17 сен 2008.

  1. TopicStarter Overlay
    Dmitrij
    Offline

    Dmitrij Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    844
    Симпатии:
    1
    Баллы:
    26
    Делаю внешнию обработку в Астор ресторан чтоб печаталось меню
    в программе есть справочник меню откуда я и беру наименование блюда и есть регистр сведений технологические карты где хранятся данные что входит в состав блюда
    не могу сообразить как написать условие чтоб в цикле когда вышло наименования блюда ниже в печатной форме выходил его состав :unsure:
  2. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    С Астор не работал, но приблизительно могу посоветовать следующее.
    Наименования из справочника перебираешь вероятно в цикле при печати.
    Допустим, так:
    Код:
    Для каждого ТекСтр из СписокБлюд Цикл
    СоставБлюда = ВернутьСостав(ТекСтр).Выбрать(); // ВернутьСостав() - функция.
    ...
    КонецЦикла;
    ...
    Функция ВернутьСостав(Блюдо)
    <запрос к регистру>
    Возврат Запрос.Выполнить();
    КонецФункции;
    
    И полученную выборку загружаешь в макет.
  3. TopicStarter Overlay
    Dmitrij
    Offline

    Dmitrij Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    844
    Симпатии:
    1
    Баллы:
    26
    Подскажите где ошибка что то не правильно делаю вот код:
    Код:
    	Пока ВыборкаДетали.Следующий() Цикл
    Если ВыборкаДетали.Меню.ЭтоГруппа Тогда
    ОбластьГруппа.Параметры.Заполнить(ВыборкаДетали);
    ТабДок.Вывести(ОбластьГруппа);
    Иначе
    ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
    СоставБлюда = ВернутьСостав(ВыборкаДетали).Выбрать();
    ОбластьДетальныхЗаписей.Параметры.Счетчик = Счетчик;
    ТабДок.Вывести(ОбластьДетальныхЗаписей);
    КонецЕсли;
    КонецЦикла;
    
    Функция ВернутьСостав(Блюда)
    Запрос = Новый Запрос;
    Запрос.Текст = 	
    "ВЫБРАТЬ
    |	ТехнологическиеКарты.Номенклатура,
    |	ТехнологическиеКарты.Ингредиент,
    |	ТехнологическиеКарты.Единица,
    |	ТехнологическиеКарты.КоличествоНетто
    |ИЗ
    |	РегистрСведений.ТехнологическиеКарты КАК ТехнологическиеКарты";
    Результат = Запрос.Выполнить();
    Макет = ПолучитьМакет("Меню");
    ТабДок = новый ТабличныйДокумент;
    
    ОбластьДетальныхИнгредиентов = Макет.ПолучитьОбласть("Ингредиент");
    ВыборкаИнгр = Результат.Выбрать();
    Пока ВыборкаИнгр.Следующий() Цикл
    ОбластьДетальныхИнгредиентов.Параметры.Заполнить(ВыборкаИнгр);
    ТабДок.Вывести(ОбластьДетальныхИнгредиентов);
    КонецЦикла;
    Возврат Запрос.Выполнить();
    КонецФункции 
    
    
    
  4. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    Моя идея не была понята..
    Эмм. попытаюсь донести снова.

    Функцию мы используем в моем случае для получения таблицы значений/выборки по конкретному блюду.
    Вызываем ее из процедуры и получаем значение в процедуре же: для чего вы процедуру из функции возвращаем только запрос.выполнить(). В моем случае заполнять параметры детальных записей(состав блюда) предполагалось заполнять в процедуре.
    Код:
    	Пока ВыборкаДетали.Следующий() Цикл
    Если ВыборкаДетали.Меню.ЭтоГруппа Тогда
    ОбластьГруппа.Параметры.Заполнить(ВыборкаДетали);
    ТабДок.Вывести(ОбластьГруппа);
    Иначе
    ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
    //далее мы получаем состав блюда и должны вывести его в макет
    СоставБлюда = ВернутьСостав(ВыборкаДетали).Выбрать();
    //НО ты ничего не делаешь для этого!!! ты присвоил Счетчик и..
    ОбластьДетальныхЗаписей.Параметры.Счетчик = Счетчик;
    //вывел строку в макет
    ТабДок.Вывести(ОбластьДетальныхЗаписей);
    КонецЕсли;
    КонецЦикла;
    
    
    Далее функция:
    Код:
    Функция ВернутьСостав(Блюда)
    Запрос = Новый Запрос;
    //текст - это хорошо. но мы же должны получить состав для конкретного блюда? или..?????
    //я не наблюдаю параметра запроса. Ты фактически получил ВСЕ технологические карты. Зачем?
    Запрос.Текст = 	
    "ВЫБРАТЬ
    |	ТехнологическиеКарты.Номенклатура,
    |	ТехнологическиеКарты.Ингредиент,
    |	ТехнологическиеКарты.Единица,
    |	ТехнологическиеКарты.КоличествоНетто
    |ИЗ
    |	РегистрСведений.ТехнологическиеКарты КАК ТехнологическиеКарты";
    Результат = Запрос.Выполнить();
    //это что? ты в функции работаешь с макетом??? 
    Макет = ПолучитьМакет("Меню");
    ТабДок = новый ТабличныйДокумент;
    
    ОбластьДетальныхИнгредиентов = Макет.ПолучитьОбласть("Ингредиент");
    ВыборкаИнгр = Результат.Выбрать();
    Пока ВыборкаИнгр.Следующий() Цикл
    ОбластьДетальныхИнгредиентов.Параметры.Заполнить(ВыборкаИнгр);
    ТабДок.Вывести(ОбластьДетальныхИнгредиентов);
    КонецЦикла;
    Возврат Запрос.Выполнить();
    КонецФункции
    
    Что я хотел донести.
    ТабДок ты создаешь в основной процедуре, где обрабатываешь блюда.
    Макет получаешь там же.
    Основные записи выводишь там же.
    Детали(состав блюда) можешь выводить как в осн.проц. так и в функции. Я рассматривал первый вариант.
    Соответственно, в функции необходимо для запроса описать параметр:
    Код:
    Запрос.УстановитьПараметр("Блюдо", Блюда); //где Блюда - параметр, передаваемый в функцию
    
    В самом запросе добавить условие отбора по блюду:
    Код:
    | ГДЕ <Условие>
    
    Дальше вернуть результат запроса в осн. процедуру:
    Код:
    Возврат Запрос.Выполнить();
    
    И уже в осн.процедуре вывести в макет:
    Код:
    Пока СоставБлюда.Следующий() Цикл //ингр-тов же несколько!!!
    ОбластьДетальныхИнгредиентов.Параметры.Заполнить(СоставБлюда);
    ТабДок.Вывести(ОбластьДетальныхИнгредиентов);
    КонецЦикла;
    
    Ты же намутил... :unsure:
  5. TopicStarter Overlay
    Dmitrij
    Offline

    Dmitrij Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    844
    Симпатии:
    1
    Баллы:
    26
    Блюд тоже может быть несколько
  6. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    И?? Ты к каждому блюду подбираешь состав?

    В моем случае описывается запрос состава по одному блюду, но ты его можешь использовать и в цикле! Получив предварительно выборку нужных или всех блюд. Абсолютно до фонаря в данном случае.

    З.Ы. Ответ пиши без комментов моих, загромождаешь страницу..
  7. TopicStarter Overlay
    Dmitrij
    Offline

    Dmitrij Опытный в 1С

    Регистрация:
    6 май 2008
    Сообщения:
    844
    Симпатии:
    1
    Баллы:
    26
    Все равно что то не то :unsure:
    вроде сделал все как советовали
    Код:
    	Запрос.Текст = 
    "ВЫБРАТЬ
    |	Меню.Ссылка КАК Меню,
    |	Меню.Представление КАК Представление,
    |	ИсторияЦенСрезПоследних.Цена,
    |	Меню.Единица КАК Единица,
    |	1 КАК Объем,
    |	ТехКартаТовара.ТехКарта.ВыходБлюда КАК ВыходБлюда,
    |	ИсторияЦенСрезПоследних.Категория
    |ИЗ
    |	Справочник.Меню КАК Меню
    |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ИсторияЦен.СрезПоследних(
    |				&Дата,
    |				Категория = &Категория
    |					И Фирма = &Фирма) КАК ИсторияЦенСрезПоследних
    |		ПО Меню.Номенклатура = ИсторияЦенСрезПоследних.Номенклатура
    |			И Меню.Единица = ИсторияЦенСрезПоследних.ЕдиницаИзмерения
    |		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |			ДатыКарт.Товар КАК Товар,
    |			МАКСИМУМ(ТехнологическаяКарта.Ссылка) КАК ТехКарта
    |		ИЗ
    |			(ВЫБРАТЬ
    |				спрНоменклатура.Ссылка КАК Товар,
    |				МАКСИМУМ(ТехнологическаяКарта.Дата) КАК ДатаТехКарты
    |			ИЗ
    |				Справочник.Номенклатура КАК спрНоменклатура
    |					ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ТехнологическаяКарта КАК ТехнологическаяКарта
    |					ПО спрНоменклатура.Ссылка = ТехнологическаяКарта.Номенклатура
    |			ГДЕ
    |				ТехнологическаяКарта.Проведен
    |				И (ТехнологическаяКарта.Фирма = &Фирма
    |						ИЛИ ТехнологическаяКарта.Фирма = &ПустаяФирма)
    |			
    |			СГРУППИРОВАТЬ ПО
    |				спрНоменклатура.Ссылка) КАК ДатыКарт
    |				ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ТехнологическаяКарта КАК ТехнологическаяКарта
    |				ПО ДатыКарт.Товар = ТехнологическаяКарта.Номенклатура
    |					И ДатыКарт.ДатаТехКарты = ТехнологическаяКарта.Дата
    |		ГДЕ
    |			ТехнологическаяКарта.Проведен
    |			И (ТехнологическаяКарта.Фирма = &Фирма
    |					ИЛИ ТехнологическаяКарта.Фирма = &ПустаяФирма)
    |		
    |		СГРУППИРОВАТЬ ПО
    |			ДатыКарт.Товар) КАК ТехКартаТовара
    |		ПО Меню.Номенклатура = ТехКартаТовара.Товар
    |ГДЕ
    |	Меню.ПометкаУдаления = ЛОЖЬ
    |	И Меню.НеПродавать = ЛОЖЬ
    |	И Меню.Номенклатура В ИЕРАРХИИ(&Группа)
    |	И Меню.Номенклатура = &блюда
    |
    |СГРУППИРОВАТЬ ПО
    |	Меню.Ссылка,
    |	Меню.Представление,
    |	ИсторияЦенСрезПоследних.Цена,
    |	Меню.Единица,
    |	ИсторияЦенСрезПоследних.Категория,
    |	ТехКартаТовара.ТехКарта.ВыходБлюда
    |
    |УПОРЯДОЧИТЬ ПО
    |	Меню.Наименование
    |ИТОГИ ПО
    |	Меню ТОЛЬКО ИЕРАРХИЯ";
    
    Запрос.УстановитьПараметр("Дата", Дата);
    Запрос.УстановитьПараметр("Категория", Категория);
    Запрос.УстановитьПараметр("Фирма", Фирма);
    Запрос.УстановитьПараметр("ПустаяФирма", Справочники.Организации.ПустаяСсылка());
    Запрос.УстановитьПараметр("Блюда", Блюда);
    
    Результат = Запрос.Выполнить();
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
    ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
    ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
    ОбластьДетальныхИнгредиентов = Макет.ПолучитьОбласть("Ингредиент");
    ОбластьГруппа = Макет.ПолучитьОбласть("Группа");
    
    ТабДок.Очистить();
    ТабДок.Вывести(ОбластьШапкаТаблицы);
    
    ВыборкаДетали = Результат.Выбрать();
    
    Счетчик = 0;
    Пока ВыборкаДетали.Следующий() Цикл
    Если ВыборкаДетали.Меню.ЭтоГруппа Тогда
    ОбластьГруппа.Параметры.Заполнить(ВыборкаДетали);
    ТабДок.Вывести(ОбластьГруппа);
    Иначе
    ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
    СоставБлюда = ВернутьСостав(ВыборкаДетали).Выбрать();
    ТабДок.Вывести(ОбластьДетальныхЗаписей);
    Пока СоставБлюда.Следующий() Цикл
    ОбластьДетальныхИнгредиентов.Параметры.Заполнить(СоставБлюда);
    ТабДок.Вывести(ОбластьДетальныхИнгредиентов);
    КонецЦикла;
    
    
    КонецЕсли;
    КонецЦикла;
    
    ТабДок.Вывести(ОбластьПодвалТаблицы);
    ТабДок.Вывести(ОбластьПодвал);
    ТабДок.Защита = Истина;
    ТабДок.ОтображатьСетку = Ложь;
    ТабДок.Показать("Меню");
    КонецПроцедуры
    
    Функция ВернутьСостав(Блюда)
    Запрос = Новый Запрос;
    
    Запрос.Текст = 	
    "ВЫБРАТЬ
    |	ТехнологическиеКарты.Номенклатура,
    |	ТехнологическиеКарты.Ингредиент,
    |	ТехнологическиеКарты.Единица,
    |	ТехнологическиеКарты.КоличествоНетто
    |ИЗ
    |	РегистрСведений.ТехнологическиеКарты КАК ТехнологическиеКарты";
    
    Результат = Запрос.Выполнить();
    Ингредиент = Результат.Выбрать();
    Возврат Запрос.Выполнить();
    КонецФункции 
    
    
  8. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    Мда..

    Первое.
    Код:
    СоставБлюда = ВернутьСостав(ВыборкаДетали).Выбрать();
    
    
    
    Неверно передаешь параметр функции. Тебе надо передать Ссылку на ОДНО блюдо. Судя по твоему мега запросу, ты передаешь туда выборку из рез. запроса - это неверно.

    Второе.
    Функция. Ты так и не усек то, о чем я говорил.
    У тебя там должно быть нечто вроде такого:
    Код:
            "ВЫБРАТЬ
    |    ТехнологическиеКарты.Номенклатура,
    |    ТехнологическиеКарты.Ингредиент,
    |    ТехнологическиеКарты.Единица,
    |    ТехнологическиеКарты.КоличествоНетто
    |ИЗ
    |    РегистрСведений.ТехнологическиеКарты КАК ТехнологическиеКарты
    |ГДЕ
    |   ТехнологическиеКарты.{БЛЮДО} = &Блюда";
    Запрос.УстановитьПараметр("Блюда", Блюда);
    ...
    
    
    
    Вместо {БЛЮДО} необходимо указать имя реквизита Блюдо(я не знаю, что у тебя им является.
  9. Мастер_миража
    Offline

    Мастер_миража Опытный в 1С

    Регистрация:
    22 сен 2008
    Сообщения:
    148
    Симпатии:
    0
    Баллы:
    26
    в меню для программистов 1с включай запрос :unsure:
  10. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    Рейтинг набираешь?
  11. Мастер_миража
    Offline

    Мастер_миража Опытный в 1С

    Регистрация:
    22 сен 2008
    Сообщения:
    148
    Симпатии:
    0
    Баллы:
    26
Похожие темы
  1. Dillan
    Ответов:
    2
    Просмотров:
    2.109
  2. MuHyC
    Ответов:
    9
    Просмотров:
    435
Загрузка...

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