Помощь - Поиск - Пользователи - Календарь
Полная версия: нужна помощь с условием
1C-PRO - Форум по 1С > Форумы по платформе "1С:Предприятие 8.x" > (8.х) Конфигурирование на платформе "1С:Предприятие 8.x"
Dmitrij
Делаю внешнию обработку в Астор ресторан чтоб печаталось меню
в программе есть справочник меню откуда я и беру наименование блюда и есть регистр сведений технологические карты где хранятся данные что входит в состав блюда
не могу сообразить как написать условие чтоб в цикле когда вышло наименования блюда ниже в печатной форме выходил его состав sample.gif
LxS
С Астор не работал, но приблизительно могу посоветовать следующее.
Наименования из справочника перебираешь вероятно в цикле при печати.
Допустим, так:
Код
Для каждого ТекСтр из СписокБлюд Цикл
СоставБлюда = ВернутьСостав(ТекСтр).Выбрать(); // ВернутьСостав() - функция.
...
КонецЦикла;
...
Функция ВернутьСостав(Блюдо)
<запрос к регистру>
Возврат Запрос.Выполнить();
КонецФункции;

И полученную выборку загружаешь в макет.
Dmitrij
Подскажите где ошибка что то не правильно делаю вот код:
Код
	Пока ВыборкаДетали.Следующий() Цикл
Если ВыборкаДетали.Меню.ЭтоГруппа Тогда
ОбластьГруппа.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьГруппа);
Иначе
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
СоставБлюда = ВернутьСостав(ВыборкаДетали).Выбрать();
ОбластьДетальныхЗаписей.Параметры.Счетчик = Счетчик;
ТабДок.Вывести(ОбластьДетальныхЗаписей);
КонецЕсли;
КонецЦикла;

Функция ВернутьСостав(Блюда)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТехнологическиеКарты.Номенклатура,
| ТехнологическиеКарты.Ингредиент,
| ТехнологическиеКарты.Единица,
| ТехнологическиеКарты.КоличествоНетто
|ИЗ
| РегистрСведений.ТехнологическиеКарты КАК ТехнологическиеКарты";
Результат = Запрос.Выполнить();
Макет = ПолучитьМакет("Меню");
ТабДок = новый ТабличныйДокумент;

ОбластьДетальныхИнгредиентов = Макет.ПолучитьОбласть("Ингредиент");
ВыборкаИнгр = Результат.Выбрать();
Пока ВыборкаИнгр.Следующий() Цикл
ОбластьДетальныхИнгредиентов.Параметры.Заполнить(ВыборкаИнгр);
ТабДок.Вывести(ОбластьДетальныхИнгредиентов);
КонецЦикла;
Возврат Запрос.Выполнить();
КонецФункции


LxS
Моя идея не была понята..
Эмм. попытаюсь донести снова.

Функцию мы используем в моем случае для получения таблицы значений/выборки по конкретному блюду.
Вызываем ее из процедуры и получаем значение в процедуре же: для чего вы процедуру из функции возвращаем только запрос.выполнить(). В моем случае заполнять параметры детальных записей(состав блюда) предполагалось заполнять в процедуре.
Код
	Пока ВыборкаДетали.Следующий() Цикл
Если ВыборкаДетали.Меню.ЭтоГруппа Тогда
ОбластьГруппа.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьГруппа);
Иначе
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
//далее мы получаем состав блюда и должны вывести его в макет
СоставБлюда = ВернутьСостав(ВыборкаДетали).Выбрать();
//НО ты ничего не делаешь для этого!!! ты присвоил Счетчик и..
ОбластьДетальныхЗаписей.Параметры.Счетчик = Счетчик;
//вывел строку в макет
ТабДок.Вывести(ОбластьДетальныхЗаписей);
КонецЕсли;
КонецЦикла;



Далее функция:
Код
Функция ВернутьСостав(Блюда)
Запрос = Новый Запрос;
//текст - это хорошо. но мы же должны получить состав для конкретного блюда? или..?????
//я не наблюдаю параметра запроса. Ты фактически получил ВСЕ технологические карты. Зачем?
Запрос.Текст =
"ВЫБРАТЬ
| ТехнологическиеКарты.Номенклатура,
| ТехнологическиеКарты.Ингредиент,
| ТехнологическиеКарты.Единица,
| ТехнологическиеКарты.КоличествоНетто
|ИЗ
| РегистрСведений.ТехнологическиеКарты КАК ТехнологическиеКарты";
Результат = Запрос.Выполнить();
//это что? ты в функции работаешь с макетом???
Макет = ПолучитьМакет("Меню");
ТабДок = новый ТабличныйДокумент;

ОбластьДетальныхИнгредиентов = Макет.ПолучитьОбласть("Ингредиент");
ВыборкаИнгр = Результат.Выбрать();
Пока ВыборкаИнгр.Следующий() Цикл
ОбластьДетальныхИнгредиентов.Параметры.Заполнить(ВыборкаИнгр);
ТабДок.Вывести(ОбластьДетальныхИнгредиентов);
КонецЦикла;
Возврат Запрос.Выполнить();
КонецФункции


Что я хотел донести.
ТабДок ты создаешь в основной процедуре, где обрабатываешь блюда.
Макет получаешь там же.
Основные записи выводишь там же.
Детали(состав блюда) можешь выводить как в осн.проц. так и в функции. Я рассматривал первый вариант.
Соответственно, в функции необходимо для запроса описать параметр:
Код
Запрос.УстановитьПараметр("Блюдо", Блюда); //где Блюда - параметр, передаваемый в функцию

В самом запросе добавить условие отбора по блюду:
Код
| ГДЕ <Условие>

Дальше вернуть результат запроса в осн. процедуру:
Код
Возврат Запрос.Выполнить();

И уже в осн.процедуре вывести в макет:
Код
Пока СоставБлюда.Следующий() Цикл //ингр-тов же несколько!!!
ОбластьДетальныхИнгредиентов.Параметры.Заполнить(СоставБлюда);
ТабДок.Вывести(ОбластьДетальныхИнгредиентов);
КонецЦикла;


Ты же намутил... cowboy.gif
Dmitrij

Блюд тоже может быть несколько
LxS
И?? Ты к каждому блюду подбираешь состав?

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

З.Ы. Ответ пиши без комментов моих, загромождаешь страницу..
Dmitrij
Все равно что то не то aua.gif
вроде сделал все как советовали
Код
	Запрос.Текст = 
"ВЫБРАТЬ
| Меню.Ссылка КАК Меню,
| Меню.Представление КАК Представление,
| ИсторияЦенСрезПоследних.Цена,
| Меню.Единица КАК Единица,
| 1 КАК Объем,
| ТехКартаТовара.ТехКарта.ВыходБлюда КАК ВыходБлюда,
| ИсторияЦенСрезПоследних.Категория
|ИЗ
| Справочник.Меню КАК Меню
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ИсторияЦен.СрезПоследних(
| &Дата,
| Категория = &Категория
| И Фирма = &Фирма) КАК ИсторияЦенСрезПоследних
| ПО Меню.Номенклатура = ИсторияЦенСрезПоследних.Номенклатура
| И Меню.Единица = ИсторияЦенСрезПоследних.ЕдиницаИзмерения
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ДатыКарт.Товар КАК Товар,
| МАКСИМУМ(ТехнологическаяКарта.Ссылка) КАК ТехКарта
| ИЗ
| (ВЫБРАТЬ
| спрНоменклатура.Ссылка КАК Товар,
| МАКСИМУМ(ТехнологическаяКарта.Дата) КАК ДатаТехКарты
| ИЗ
| Справочник.Номенклатура КАК спрНоменклатура
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ТехнологическаяКарта КАК ТехнологическаяКарта
| ПО спрНоменклатура.Ссылка = ТехнологическаяКарта.Номенклатура
| ГДЕ
| ТехнологическаяКарта.Проведен
| И (ТехнологическаяКарта.Фирма = &Фирма
| ИЛИ ТехнологическаяКарта.Фирма = &ПустаяФирма)
|
| СГРУППИРОВАТЬ ПО
| спрНоменклатура.Ссылка) КАК ДатыКарт
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ТехнологическаяКарта КАК ТехнологическаяКарта
| ПО ДатыКарт.Товар = ТехнологическаяКарта.Номенклатура
| И ДатыКарт.ДатаТехКарты = ТехнологическаяКарта.Дата
| ГДЕ
| ТехнологическаяКарта.Проведен
| И (ТехнологическаяКарта.Фирма = &Фирма
| ИЛИ ТехнологическаяКарта.Фирма = &ПустаяФирма)
|
| СГРУППИРОВАТЬ ПО
| ДатыКарт.Товар) КАК ТехКартаТовара
| ПО Меню.Номенклатура = ТехКартаТовара.Товар
|ГДЕ
| Меню.ПометкаУдаления = ЛОЖЬ
| И Меню.НеПродавать = ЛОЖЬ
| И Меню.Номенклатура В ИЕРАРХИИ(&Группа)
| И Меню.Номенклатура = &блюда
|
|СГРУППИРОВАТЬ ПО
| Меню.Ссылка,
| Меню.Представление,
| ИсторияЦенСрезПоследних.Цена,
| Меню.Единица,
| ИсторияЦенСрезПоследних.Категория,
| ТехКартаТовара.ТехКарта.ВыходБлюда
|
|УПОРЯДОЧИТЬ ПО
| Меню.Наименование
|ИТОГИ ПО
| Меню ТОЛЬКО ИЕРАРХИЯ";

Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Категория", Категория);
Запрос.УстановитьПараметр("Фирма", Фирма);
Запрос.УстановитьПараметр("ПустаяФирма", Справочники.Организации.ПустаяСсылка());
Запрос.УстановитьПараметр("Блюда", Блюда);

Результат = Запрос.Выполнить();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
ОбластьДетальныхИнгредиентов = Макет.ПолучитьОбласть("Ингредиент");
ОбластьГруппа = Макет.ПолучитьОбласть("Группа");

ТабДок.Очистить();
ТабДок.Вывести(ОбластьШапкаТаблицы);

ВыборкаДетали = Результат.Выбрать();

Счетчик = 0;
Пока ВыборкаДетали.Следующий() Цикл
Если ВыборкаДетали.Меню.ЭтоГруппа Тогда
ОбластьГруппа.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьГруппа);
Иначе
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
СоставБлюда = ВернутьСостав(ВыборкаДетали).Выбрать();
ТабДок.Вывести(ОбластьДетальныхЗаписей);
Пока СоставБлюда.Следующий() Цикл
ОбластьДетальныхИнгредиентов.Параметры.Заполнить(СоставБлюда);
ТабДок.Вывести(ОбластьДетальныхИнгредиентов);
КонецЦикла;


КонецЕсли;
КонецЦикла;

ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
ТабДок.Защита = Истина;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Показать("Меню");
КонецПроцедуры

Функция ВернутьСостав(Блюда)
Запрос = Новый Запрос;

Запрос.Текст =
"ВЫБРАТЬ
| ТехнологическиеКарты.Номенклатура,
| ТехнологическиеКарты.Ингредиент,
| ТехнологическиеКарты.Единица,
| ТехнологическиеКарты.КоличествоНетто
|ИЗ
| РегистрСведений.ТехнологическиеКарты КАК ТехнологическиеКарты";

Результат = Запрос.Выполнить();
Ингредиент = Результат.Выбрать();
Возврат Запрос.Выполнить();
КонецФункции

LxS
Мда..

Первое.
Код
СоставБлюда = ВернутьСостав(ВыборкаДетали).Выбрать();



Неверно передаешь параметр функции. Тебе надо передать Ссылку на ОДНО блюдо. Судя по твоему мега запросу, ты передаешь туда выборку из рез. запроса - это неверно.

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



Вместо {БЛЮДО} необходимо указать имя реквизита Блюдо(я не знаю, что у тебя им является.
Мастер_миража
в меню для программистов 1с включай запрос megalol.gif
LxS
Цитата(Мастер_миража @ 1.10.2008, 16:36) *

в меню для программистов 1с включай запрос megalol.gif

Рейтинг набираешь?
Мастер_миража
offtopic.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2009 Invision Power Services, Inc.