Консультация № 174854
04.12.2009, 01:16
0.00 руб.
0 8 2
Здравствуйте, господа эксперты. УТ. Имеется отчёт "Премии менеджерам оптового склада" (см. основную процедуру в приложении, Проц – реквизит формы, число). Требуется переделать отчёт так, чтобы был один запрос, а то директор говорит, что нерационально. Если можно, просьба несколько вариантов (для повышения образованности): с объединением, без него и т.д. Заранее благодарен

Приложение:
Процедура Отчет(ТабДок, КонПериода, НачПериода, Проц) Экспорт
Макет = ВнешнийОтчетОбъект.ПолучитьМакет("Отчет");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПартииТоваровНаСкладахОбороты.Регистратор,
| ПРЕДСТАВЛЕНИЕ(ПартииТоваровНаСкладахОбороты.Регистратор),
| СУММА(ПартииТоваровНаСкладахОбороты.СтоимостьРасход) КАК СтоимостьРасход,
| ПартииТоваровНаСкладахОбороты.Номенклатура,
| ПРЕДСТАВЛЕНИЕ(ПартииТоваровНаСкладахОбороты.Номенклатура),
| ПартииТоваровНаСкладахОбороты.СтоимостьРасход * &Проц / 100 КАК Прем
|ИЗ
| РегистрНакопления.ПартииТоваровНаСкладах.Обороты(&НачПериода, &КонПериода, Регистратор, ) КАК ПартииТоваровНаСкладахОбороты
|ГДЕ
| ПартииТоваровНаСкладахОбороты.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
|
|СГРУППИРОВАТЬ ПО
| ПартииТоваровНаСкладахОбороты.Регистратор,
| ПартииТоваровНаСкладахОбороты.Номенклатура,
| ПартииТоваровНаСкладахОбороты.СтоимостьРасход * &Проц / 100
|ИТОГИ
| СУММА(Прем)
|ПО
| ОБЩИЕ";

Запрос.УстановитьПараметр("КонПериода", КонецДня(КонПериода));
Запрос.УстановитьПараметр("НачПериода", НачПериода);
Запрос.УстановитьПараметр("Проц", Проц);

Результат = Запрос.Выполнить();

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

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

///
ОбластьВидОпер = Макет.ПолучитьОбласть("ВидОпер");
ОбластьВидОпер.Параметры.ВидОпер = "По перемещениям товаров";
ТабДок.Вывести(ОбластьВидОпер);
///

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

ТабДок.НачатьАвтогруппировкуСтрок();

ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

ВыборкаОбщийИтог.Следующий(); // Общий итог
ОбластьОбщийИтог.Параметры.Заполнить(ВыборкаОбщийИтог);
ТабДок.Вывести(ОбластьОбщийИтог, ВыборкаОбщийИтог.Уровень());

ВыборкаДетали = ВыборкаОбщийИтог.Выбрать();

Пока ВыборкаДетали.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
КонецЦикла;

ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
/////////////////////////////////////////////////////////////
Макет = ВнешнийОтчетОбъект.ПолучитьМакет("Отчет");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПродажиОбороты.Регистратор,
| ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Регистратор),
| СУММА(ПродажиОбороты.СтоимостьОборот) КАК СтоимостьОборот,
| ПродажиОбороты.Номенклатура,
| ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Номенклатура),
| ПродажиОбороты.СтоимостьОборот * &Проц / 100 КАК Прем
|ИЗ
| РегистрНакопления.Продажи.Обороты(&НачПериода, &КонПериода, Регистратор, ) КАК ПродажиОбороты
|ГДЕ
| ПродажиОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
|
|СГРУППИРОВАТЬ ПО
| ПродажиОбороты.Регистратор,
| ПродажиОбороты.Номенклатура,
| ПродажиОбороты.СтоимостьОборот * &Проц / 100
|ИТОГИ
| СУММА(Прем)
|ПО
| ОБЩИЕ";

Запрос.УстановитьПараметр("КонПериода", КонецДня(КонПериода));
Запрос.УстановитьПараметр("НачПериода", НачПериода);
Запрос.УстановитьПараметр("Проц", Проц);

Результат = Запрос.Выполнить();

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

ТабДок.НачатьАвтогруппировкуСтрок();

ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

ВыборкаОбщийИтог.Следующий(); // Общий итог
ОбластьОбщийИтог.Параметры.Заполнить(ВыборкаОбщийИтог);
ТабДок.Вывести(ОбластьОбщийИтог, ВыборкаОбщийИтог.Уровень());

ВыборкаДетали = ВыборкаОбщийИтог.Выбрать();

Пока ВыборкаДетали.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
КонецЦикла;

ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
КонецПроцедуры

Обсуждение

Неизвестный
04.12.2009, 14:03
общий
TPavel:
1. Для связки двух регистров нужно знать, по каким полям это делать. Напишите какие измерения есть в регистрах ПартииТоваровНаСкладах и Продажи.
2. Очень странно, что для начисления премии менеджерам Вы используете информацию о перемещениях. То есть многократным перегоном товара между складами можно поднять себе премию?
3. Как выглядит печатная таблица?
4. Странно, что в запросе отсутствует менеджер. Или Вы рассчитиваете премию сразу на всех?
Неизвестный
04.12.2009, 21:54
общий
Денис!
1. Я писал, что конфигурация УТ, типовая, неизменённая, релиз 10.3.8.9. У Вас, Денис, он есть?
2. Имеется ввиду, что перемещения будут только с оптового склада в розничные магазины.
3. Таблица произвольная. Поля таблицы соответствуют полям выборки запроса.
4. Премия, правильно, рассчитывается на всех.
Спасибо за помощь.
Неизвестный
04.12.2009, 22:50
общий
TPavel:
1. К сожалению у меня ее нет. Но если Вы напишете измерения выше упомяннутых регистров, думаю смогу Вам помочь.
2. ОК. Какой признак того, что перемещение в магазин?
3. ОК
4. ОК
давно
Студент
218854
56
07.12.2009, 10:14
общий
TPavel:
Судя по запросам надо получить долю стоимости списанных товаров с оптовых складов по документам Реализация и Перемещение в розничный склад?
А выводить надо в одну печатную форму или в две, как сейчас реализовано?
Неизвестный
08.12.2009, 08:45
общий
Денису.
1. Измерения регистра ПартииТоваровНаСкладах: Номенклатура (СправочникСсылка.Номенклатура), Склад(СправочникСсылка.Склады), ХарактеристикаНоменклатуры (СправочникСсылка.ХарактеристикиНоменклатуры), СерияНоменклатуры(СправочникСсылка.СерииНоменклатуры), ДокументОприходования (ДокументСсылка.ВозвратТоваровОтПокупателя, ДокументСсылка.ПриходныйОрдерНаТовары, ДокументСсылка.ПоступлениеТоваровУслугВНТТ, ДокументСсылка.КомплектацияНоменклатуры, ДокументСсылка.ОприходованиеТоваров, ДокументСсылка.ПоступлениеТоваровУслуг, ДокументСсылка.АвансовыйОтчет), СтатусПартии (ПеречислениеСсылка.СтатусыПартийТоваров), Заказ (ДокументСсылка.ЗаказПокупателя), Качество (СправочникСсылка.Качество).
Измерения регистра Продажи: Номенклатура (СправочникСсылка.Номенклатура), ХарактеристикаНоменклатуры (СправочникСсылка.ХарактеристикиНоменклатуры), ЗаказПокупателя (ДокументСсылка.ЗаказПокупателя, ДокументСсылка.СчетНаОплатуПокупателю), ДоговорКонтрагента (СправочникСсылка.ДоговорыКонтрагентов), ДокументПродажи (ДокументСсылка.ВозвратТоваровОтПокупателя, ДокументСсылка.ОтчетКомитентуОПродажах, ДокументСсылка.ОтчетОРозничныхПродажах, ДокументСсылка.ОтчетКомиссионераОПродажах, ДокументСсылка.РеализацияТоваровУслуг), Подразделение (СправочникСсылка.Подразделения), Проект (СправочникСсылка.Проекты), Организация (СправочникСсылка.Организации), Контрагент (СправочникСсылка.Контрагенты).
2. Считать, что ВСЕ перемещения ТОЛЬКО с оптового склада в розничный магазин.
Спасибо заранее.
Неизвестный
08.12.2009, 08:59
общий
Барановой Ирине Николаевне.
1. Нет, долей никаких получать не надо. Надо получить: по регистру ПартииТоваровНаСкладах: суммы списания товаров со склада документами ПеремещениеТоваров (оборот по расходу ресурса Стоимость). Желательно в разбивке по документам. И умножить на процент премии эти суммы списания. Потом по регисру Продажи: суммы продаж документами РеализацияТоваровУслуг (оборот ресурса Стоимость). Тоже желательно в разбивке по документам. И тоже умножить на процент премии эти суммы продаж. И итоговую премию получить. Это всё делает мой отчёт. Но там ДВА запроса, а надо ОДНИМ. Только это надо изменить в алгоритме получения данных.
2. Выводить в одну печатную форму.
Заранее спасибо
давно
Студент
218854
56
08.12.2009, 10:56
общий
это ответ
Здравствуйте, TPavel.
Предлагаю вашему вниманию вариант отчета с объединением.
Я бы в запрос еще добавила проверку корректности перемещения и реализации. С оптового ли склада выполняется операция. (у складов есть реквизит ВидСклада)

Приложение:
Процедура Отчет(ТабДок, КонПериода, НачПериода, Проц) Экспорт
Макет = ВнешнийОтчетОбъект.ПолучитьМакет("Отчет");

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

ТекстЗапроса =
"ВЫБРАТЬ
| ВложенныйЗапрос.Регистратор,
| ПРЕДСТАВЛЕНИЕ(ВложенныйЗапрос.Регистратор) КАК РегистраторПредставление,
| ВложенныйЗапрос.Номенклатура,
| ПРЕДСТАВЛЕНИЕ(ВложенныйЗапрос.Номенклатура) КАК НоменклатураПредставление,
| ВложенныйЗапрос.СтоимостьРасход,
| ВложенныйЗапрос.Прем КАК Прем,
| ВложенныйЗапрос.ВидОперации КАК ВидОперации
|ИЗ
| (ВЫБРАТЬ
| ПартииТоваровНаСкладахОбороты.Регистратор КАК Регистратор,
| СУММА(ПартииТоваровНаСкладахОбороты.СтоимостьРасход) КАК СтоимостьРасход,
| ПартииТоваровНаСкладахОбороты.Номенклатура КАК Номенклатура,
| ПартииТоваровНаСкладахОбороты.СтоимостьРасход * &Проц / 100 КАК Прем,
| 1 КАК ВидОперации
| ИЗ
| РегистрНакопления.ПартииТоваровНаСкладах.Обороты(&НачПериода, &КонПериода, Регистратор, ) КАК ПартииТоваровНаСкладахОбороты
| ГДЕ
| ПартииТоваровНаСкладахОбороты.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
|
| СГРУППИРОВАТЬ ПО
| ПартииТоваровНаСкладахОбороты.Регистратор,
| ПартииТоваровНаСкладахОбороты.Номенклатура,
| ПартииТоваровНаСкладахОбороты.СтоимостьРасход * &Проц / 100
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ПродажиОбороты.Регистратор,
| СУММА(ПродажиОбороты.СтоимостьОборот),
| ПродажиОбороты.Номенклатура,
| ПродажиОбороты.СтоимостьОборот * &Проц / 100,
| 2
| ИЗ
| РегистрНакопления.Продажи.Обороты(&НачПериода, &КонПериода, Регистратор, ) КАК ПродажиОбороты
| ГДЕ
| ПродажиОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
|
| СГРУППИРОВАТЬ ПО
| ПродажиОбороты.Регистратор,
| ПродажиОбороты.Номенклатура,
| ПродажиОбороты.СтоимостьОборот * &Проц / 100) КАК ВложенныйЗапрос
|
|УПОРЯДОЧИТЬ ПО
| ВидОперации
|ИТОГИ
| СУММА(Прем)
|ПО
| ВидОперации";

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("КонПериода", КонецДня(КонПериода));
Запрос.УстановитьПараметр("НачПериода", НачПериода);
Запрос.УстановитьПараметр("Проц", Проц);
Запрос.Текст = ТекстЗапроса;

Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат;
КонецЕсли;

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

ВыборкаВидОперации = ВыборкаОбщие.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "ВидОперации");
Пока ВыборкаВидОперации.Следующий() Цикл

Если ВыборкаВидОперации.ВидОперации = 1 Тогда
ОбластьВидОпер.Параметры.ВидОпер = "По перемещениям товаров";
ИначеЕсли ВыборкаВидОперации.ВидОперации = 2 Тогда
ОбластьВидОпер.Параметры.ВидОпер = "По реализациям";
Иначе
Продолжить;
КонецЕсли;
ТабДок.Вывести(ОбластьВидОпер);
ТабДок.Вывести(ОбластьШапкаТаблицы);

ТабДок.НачатьАвтогруппировкуСтрок();

ОбластьОбщийИтог.Параметры.Заполнить(ВыборкаВидОперации);
ТабДок.Вывести(ОбластьОбщийИтог, ВыборкаВидОперации.Уровень());

ВыборкаДетали = ВыборкаВидОперации.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
КонецЦикла;

ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
КонецЦикла;
КонецПроцедуры
5
Спасибо большое
Неизвестный
10.12.2009, 09:58
общий
это ответ
Здравствуйте, TPavel.

Процедура Отчет(ТабДок, КонПериода, НачПериода, Проц) Экспорт

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

Запрос.УстановитьПараметр("КонПериода", КонПериода);
Запрос.УстановитьПараметр("НачПериода", НачПериода);
Запрос.УстановитьПараметр("Проц", Проц);

Результат = Запрос.Выполнить();

ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОбластьОбщийИтог = Макет.ПолучитьОбласть("ОбщиеИтоги");
ОбластьРегистраторПродажа = Макет.ПолучитьОбласть("РегистраторПродажа");
ОбластьРегистраторПартии = Макет.ПолучитьОбласть("РегистраторПартии");
ОбластьНоменклатура = Макет.ПолучитьОбласть("Номенклатура");

ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогруппировкуСтрок();

ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

ВыборкаОбщийИтог.Следующий(); // Общий итог
ОбластьОбщийИтог.Параметры.Заполнить(ВыборкаОбщийИтог);
ТабДок.Вывести(ОбластьОбщийИтог, ВыборкаОбщийИтог.Уровень());

ВыборкаРегистраторПродажа = ВыборкаОбщийИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаРегистраторПродажа.Следующий() Цикл
ОбластьРегистраторПродажа.Параметры.Заполнить(ВыборкаРегистраторПродажа);
ТабДок.Вывести(ОбластьРегистраторПродажа, ВыборкаРегистраторПродажа.Уровень());

ВыборкаРегистраторПартии = ВыборкаРегистраторПродажа.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаРегистраторПартии.Следующий() Цикл
ОбластьРегистраторПартии.Параметры.Заполнить(ВыборкаРегистраторПартии);
ТабДок.Вывести(ОбластьРегистраторПартии, ВыборкаРегистраторПартии.Уровень());

ВыборкаНоменклатура = ВыборкаРегистраторПартии.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаНоменклатура.Следующий() Цикл
ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура);
ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень());
КонецЦикла;
КонецЦикла;
КонецЦикла;

ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);

КонецПроцедуры
Форма ответа