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