Группа: Пользователи
Сообщений: 312
Спасибо сказали: 1 раз
Рейтинг: 1
Здравствуйте! У меня есть отчет который считает стоимость блюд за период. Но он не разделяет меню по датам. А пишет все по очереди от и до и все тип одним числом.
// Установка параметров области "ОбластьШапка1" ОбластьШапка1.Параметры.Подразделение = Отчет.Подразделение.Наименование;
// Установка параметров области "ОбластьШапка2" ОбластьШапка2.Параметры.Подразделение = Отчет.Подразделение.Наименование; Отбор = новый Структура; Отбор.Вставить("Подразделение", Отчет.Подразделение); ИмяДиректора = РегистрыСведений.ОтветственныеЛица.ПолучитьПоследнее(ТекущаяДата(),Отбор).ОтвЛицоДиректор; ОбластьШапка2.Параметры.ИмяДиректора = ИмяДиректора;
// Установка параметров области "ОбластьШапкаЗаголовок" ОбластьШапкаЗаголовок.Параметры.НаименованиеДокумента = "Меню на"; ОбластьШапкаЗаголовок.Параметры.ДатаДокумента = Формат(Отчет.ДатаМеню, "ДЛФ=ДД");
// Установка параметров области "ОбластьШапкаСписокГП" ОбластьШапкаСписокГП.Параметры.СписокГруппПитания = Отчет.ГруппаПитания;
// Выводим все "шапки" в результирующий документ ВыводФорма.Вывести(ОбластьШапка1); ВыводФорма.Вывести(ОбластьШапка2); ВыводФорма.Вывести(ОбластьШапкаЗаголовок); ВыводФорма.Вывести(ОбластьШапкаСписокГП);
Если ДопПоля = 3 тогда ВыводФорма.Вывести(ОбластьЗаголовокЭнц); КонецЕсли;
// Собственно выборка меню на день ВыборкаМенюНаДень = ПолучитьМенюНаДень();
Пока ВыборкаМенюНаДень.Следующий() Цикл ОбластьЗаголовокПП1.Параметры.НаименованиеПриёмаПищи = ВыборкаМенюНаДень.ПриёмПищи; ВыводФорма.Вывести(ОбластьЗаголовокПП1);
// Выборка всех блюд по данному меню ВыборкаСписокБлюдВМеню = ПолучитьСписокБлюдВМеню(ВыборкаМенюНаДень.Ссылка);
Пока ВыборкаСписокБлюдВМеню.Следующий() Цикл // ДопПоля = 0 - простое меню, без цен и калорий Если ДопПоля = 0 Тогда Если Отчет.ПечататьНР тогда ОбластьБлюдо.Параметры.НаименованиеБлюда = ВыборкаСписокБлюдВМеню.Наименование + " (" + ВыборкаСписокБлюдВМеню.КодРецептуры + ")"; Иначе ОбластьБлюдо.Параметры.НаименованиеБлюда = ВыборкаСписокБлюдВМеню.Наименование; КонецЕсли; ОбластьБлюдо.Параметры.Выход = СформироватьВыходБлюда(ВыборкаСписокБлюдВМеню.Выход1, ВыборкаСписокБлюдВМеню.Выход2, ВыборкаСписокБлюдВМеню.Выход3); ОбластьБлюдо.Параметры.ЕД = ВыборкаСписокБлюдВМеню.ЕдИзм; ВыводФорма.Вывести(ОбластьБлюдо); КонецЕсли;
// ДопПоля = 1 - меню с ценой Если ДопПоля = 1 Тогда ОбластьБлюдоСЦеной.Параметры.НаименованиеБлюда = ВыборкаСписокБлюдВМеню.Наименование; ОбластьБлюдоСЦеной.Параметры.Выход = СформироватьВыходБлюда(ВыборкаСписокБлюдВМеню.Выход1, ВыборкаСписокБлюдВМеню.Выход2, ВыборкаСписокБлюдВМеню.Выход3); ОбластьБлюдоСЦеной.Параметры.ЕД = ВыборкаСписокБлюдВМеню.ЕдИзм; Цена = УправлениеМеню.ПолучитьЦенуБлюда(ВыборкаМенюНаДень.Ссылка, ВыборкаСписокБлюдВМеню.ИдентификаторБлюда, Отчет.БазаРасчётаЦен); ОбластьБлюдоСЦеной.Параметры.Цена = Формат(Цена, "ЧДЦ=2"); ОбластьБлюдоСЦеной.Параметры.Вал = Константы.БазоваяВалютаСистемы.Получить(); ВыводФорма.Вывести(ОбластьБлюдоСЦеной); Если Цена = NULL тогда Сообщить("Цена блюда " + ВыборкаСписокБлюдВМеню.Наименование + " не определена"); Иначе ОбщаяЦена = ОбщаяЦена + Цена; КонецЕсли;
КонецЕсли;
// ДопПоля = 2 - меню с калориями Если ДопПоля = 2 Тогда ОбластьБлюдоСКалор.Параметры.НаименованиеБлюда = ВыборкаСписокБлюдВМеню.Наименование; ОбластьБлюдоСКалор.Параметры.Выход = СформироватьВыходБлюда(ВыборкаСписокБлюдВМеню.Выход1, ВыборкаСписокБлюдВМеню.Выход2, ВыборкаСписокБлюдВМеню.Выход3); ОбластьБлюдоСКалор.Параметры.ЕД = ВыборкаСписокБлюдВМеню.ЕдИзм; ОбластьБлюдоСКалор.Параметры.Калор = Формат(ВыборкаСписокБлюдВМеню.КалорийностьБлюда, "ЧДЦ=2");
ВыводФорма.Вывести(ОбластьБлюдоСКалор); Если ВыборкаСписокБлюдВМеню.КалорийностьБлюда = NULL тогда Сообщить("Калорийность блюда " + ВыборкаСписокБлюдВМеню.Наименование + " не определена"); Иначе ОбщаяКалорийность = ОбщаяКалорийность + Число(ВыборкаСписокБлюдВМеню.КалорийностьБлюда); КонецЕсли; КонецЕсли;
Если НЕ ВыборкаСписокБлюдВМеню.КалорийностьБлюда = NULL тогда ОбщаяКалорийность = ОбщаяКалорийность + Число(ВыборкаСписокБлюдВМеню.КалорийностьБлюда); КонецЕсли;
Если НЕ ВыборкаСписокБлюдВМеню.КалорийностьБлюда = NULL тогда ВсегоБелки = ВсегоБелки + Число(ВыборкаСписокБлюдВМеню.Белки); КонецЕсли;
Если НЕ ВыборкаСписокБлюдВМеню.КалорийностьБлюда = NULL тогда ВсегоЖиры = ВсегоЖиры + Число(ВыборкаСписокБлюдВМеню.Жиры); КонецЕсли;
Если НЕ ВыборкаСписокБлюдВМеню.КалорийностьБлюда = NULL тогда ВсегоУглеводы = ВсегоУглеводы + Число(ВыборкаСписокБлюдВМеню.Углеводы); КонецЕсли;
КонецЕсли;
КонецЦикла; КонецЦикла;
// Если меню с ценой - выводим общую цену по меню Если ДопПоля = 1 Тогда ПодвалМенюСЦеной.Параметры.ЦенаВсего = Формат(ОбщаяЦена, "ЧДЦ=2"); ПодвалМенюСЦеной.Параметры.Вал = Константы.БазоваяВалютаСистемы.Получить(); ВыводФорма.Вывести(ПодвалМенюСЦеной); КонецЕсли;
// Если меню с калориями - выводим общую калорийность Если ДопПоля = 2 Тогда ПодвалМенюСКалор.Параметры.КалорВсего = Формат(ОбщаяКалорийность, "ЧДЦ=2"); ВыводФорма.Вывести(ПодвалМенюСКалор); КонецЕсли;
Группа: Местный
Сообщений: 365
Из: Slovensko
Спасибо сказали: 78 раз
Рейтинг: 0
ЗапросМенюНаДень.Текст = "ВЫБРАТЬ | Меню.Ссылка, | Меню.ПриёмПищи КАК ПриёмПищи, | Меню.КоличествоПитающихся |ИЗ | Документ.Меню КАК Меню |ГДЕ | Меню.ДатаМеню МЕЖДУ &НачалоПериода и &КонецПериода | И Меню.Подразделение = &ПараметрПодразделение | И Меню.ГруппаПитания = &ПараметрГруппаПитания | И Меню.ПометкаУдаления = ЛОЖЬ |Итоги по Меню.Дата";
Будет методически правильно добавить явно поле Меню.Дата, по которому есть итоги. Чтобы получилось вот так:
ЗапросМенюНаДень.Текст = "ВЫБРАТЬ | Меню.Ссылка как Ссылка, | Меню.Дата как Дата, // <----- поле с датой задано явно | Меню.ПриёмПищи КАК ПриёмПищи, ...
Если пока нет понимания, что сделать, создайте новый внешний отчет или обработку и с помощью "конструктора выходной формы" по этому запросу создать выходную форму.
Дополню еще:
Эти документы Меню делают ли какие движения? Например, в регистр оборотов или регистр сведений, записывая все меню в базу данных? Если так, то лучше переделать запрос по этому регистру - будет работать значительно быстрее (хотя... смотря, какие объёмы). Если нет - то надо добавить такой регистр и движения документов, для того же анализа и планирования.
Я правильно понимаю, что это самописная конфигурация с одним-двумя-тремя документами и несколькими отчетами?
Группа: Пользователи
Сообщений: 312
Спасибо сказали: 1 раз
Рейтинг: 1
Vladal @ Сегодня, 10:14 , Сделал так
ЗапросМенюНаДень.Текст = "ВЫБРАТЬ | Меню.Ссылка, | Меню.ПриёмПищи КАК ПриёмПищи, | Меню.Дата как Дата, | Меню.КоличествоПитающихся |ИЗ | Документ.Меню КАК Меню |ГДЕ | Меню.ДатаМеню МЕЖДУ &НачалоПериода и &КонецПериода | И Меню.Подразделение = &ПараметрПодразделение | И Меню.ГруппаПитания = &ПараметрГруппаПитания | И Меню.ПометкаУдаления = ЛОЖЬ |Итоги по Меню.Дата";
и ничего. после ужина за 26 не идет графа 27 число.
А в документах за 27 число нет пометки на удаление? или они не проведены? Судя по условиям отбора в запросе - Меню.ПометкаУдаления = ЛОЖЬ, есть такие документы, удовлетворяющие указанным подразделению, группе питания?
Группа: Пользователи
Сообщений: 312
Спасибо сказали: 1 раз
Рейтинг: 1
Vladal @ Сегодня, 11:32 , Смотрите у меня стоит период. с 26 по 27. меню он считает за 27. видно на скрине как идет завтрак после ужина. это уже 27. Мне нужно имено чтобы после ужина было написано Меню на 27 Июля 2016г. как вначале с 26 июля.
Группа: Местный
Сообщений: 365
Из: Slovensko
Спасибо сказали: 78 раз
Рейтинг: 0
Советую обзавестись инструментами для более удобной разработки - например, консолью запросов или вытащить из типовой "Универсальный отчет" и/или "консоль отчетов".
Что еще я усмотрел: в отборах "Меню.ДатаМеню МЕЖДУ ..." что означает? Это реквизит шапки документа, притом дата меню может отличаться от даты документа и тут появляется несоответствие: - в запросе выборка по Меню.ДатаМеню, а итоги по Меню.Дата. - надо и итоги тоже привести к одному виду: ИТОГИ ПО Меню.ДатаМеню.
Примерно так:
ВЫБРАТЬ Меню.Ссылка, Меню.ПриёмПищи КАК ПриёмПищи, Меню.Дата как Дата, // это дата документа Меню.ДатаМеню как ДатаМеню, // это "дата меню", по которой отбор и сортировка Меню.КоличествоПитающихся КАК КоличествоПитающихся ИЗ Документ.Меню КАК Меню ГДЕ Меню.ДатаМеню МЕЖДУ &НачалоПериода и &КонецПериода И Меню.Подразделение = &ПараметрПодразделение И Меню.ГруппаПитания = &ПараметрГруппаПитания И НЕ Меню.ПометкаУдаления ИТОГИ ПО Меню.ДатаМеню
Группа: Пользователи
Сообщений: 312
Спасибо сказали: 1 раз
Рейтинг: 1
Vladal @ Сегодня, 11:40 , Итоги поменял ничего не изменилось. Как я понимаю мне нужно в макете еще дописать строку чтобы там выводилась дата за каждое число. дата документа и дата меню могут быть разные, меню можно делать наперед.
Группа: Местный
Сообщений: 365
Из: Slovensko
Спасибо сказали: 78 раз
Рейтинг: 0
упс... не смог отредактировать ответ.
Если реквизит ДатаМеню не содержит времени, то запрос отраотает и так. Но будет лучше, если итоги будут выглядеть так:
ИТОГИ ПО НАЧАЛОПЕРИОДА(Меню.ДатаМеню, ДЕНЬ)
Цитата(burza @ 27.07.16, 11:48)
Итоги поменял ничего не изменилось. Как я понимаю мне нужно в макете еще дописать строку чтобы там выводилась дата за каждое число. дата документа и дата меню могут быть разные, меню можно делать наперед.
Да, по идее, надо в обходе выборки запроса (группировки по дате) и выводить дату. Таким образом и получится - данные сгруппированы и отсортированы по дате, мы циклически обходим каждую дату и на эту дату получили новое меню, которое и вывели. Еще можно самим запросом по связанным данным вытягивать калорийность и энергетическую ценность продуктов - то, что делается "вручную" в цикле обхода результата запроса.
Группа: Пользователи
Сообщений: 312
Спасибо сказали: 1 раз
Рейтинг: 1
Vladal @ Сегодня, 11:48 , не работает.ошибки. мне кажется что надо не тут копать а тут
Пока ВыборкаМенюНаДень.Следующий() Цикл ОбластьЗаголовокПП1.Параметры.НаименованиеПриёмаПищи = ВыборкаМенюНаДень.ПриёмПищи; ВыводФорма.Вывести(ОбластьЗаголовокПП1);
Группа: Местный
Сообщений: 365
Из: Slovensko
Спасибо сказали: 78 раз
Рейтинг: 0
Могу в качестве "гуманитарной помощи начинающим" вечерком глянуть эту базу и доделать эту обработку.
Цитата(burza @ 26.07.16, 16:53)
Пока ВыборкаМенюНаДень.Следующий() Цикл ОбластьЗаголовокПП1.Параметры.НаименованиеПриёмаПищи = ВыборкаМенюНаДень.ПриёмПищи; ВыводФорма.Вывести(ОбластьЗаголовокПП1);
Обход результата запроса какой? С группировками? Или прямолинейный? Мы ведь сделали "ИТОГ ПО" дате меню? Сделали.
Поиграйтесь с новым внешним отчетом, там конструктором добавьте этот запрос, выберите вывод в таблицу, на форму поместите поля ввода для отборов (даты начала и конца, подразделение, группы питания) и посмотрите, что выведет конструктор. Может и картинка не такая красивая будет, но сам принцип должен быть показан.
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!