Дело в том, что одной строке состава реализации может соответствовать несколько строк списываемых партий и если мы бы соединяли в запросе то ресурсы реализации могут задвоиться, затроиться и т.д. На скриншоте выделена колонка суммы количества из реализации и видно, что отдельные партии не суммируются, но отдельные реализации суммируются. Вычисляемые поля прибыли и рентабельности (Рентабельность=(Цена продажи-Цена поступления)*100/Цена поступления ), диаграммы.
step by step
1. Создаём новый отчет и открываем схему компоновки данных (СКД).
2. Нам надо создать два набора данных. Продажи и Партии.
Текст запроса продаж:
ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
ПродажиОбороты.ХарактеристикаНоменклатуры,
ПродажиОбороты.ЗаказПокупателя,
ПродажиОбороты.ДоговорКонтрагента,
ПродажиОбороты.ДокументПродажи,
ПродажиОбороты.Подразделение,
ПродажиОбороты.Проект,
ПродажиОбороты.Организация,
ПродажиОбороты.Контрагент,
СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборотПродажи,
СУММА(ПродажиОбороты.СтоимостьОборот) КАК СтоимостьОборотПродажи,
СУММА(ПродажиОбороты.СтоимостьБезСкидокОборот) КАК СтоимостьБезСкидокОборотПродажи,
СУММА(ПродажиОбороты.НДСОборот) КАК НДСОборотПродажи,
СРЕДНЕЕ(ВЫБОР
КОГДА ПродажиОбороты.КоличествоОборот <> 0
ТОГДА ПродажиОбороты.СтоимостьОборот / ПродажиОбороты.КоличествоОборот
ИНАЧЕ 0
КОНЕЦ) КАК СредняяЦенаПродажи
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты
СГРУППИРОВАТЬ ПО
ПродажиОбороты.Номенклатура,
ПродажиОбороты.ХарактеристикаНоменклатуры,
ПродажиОбороты.ЗаказПокупателя,
ПродажиОбороты.ДоговорКонтрагента,
ПродажиОбороты.ДокументПродажи,
ПродажиОбороты.Подразделение,
ПродажиОбороты.Проект,
ПродажиОбороты.Организация,
ПродажиОбороты.Контрагент
Текст запроса партий:
ВЫБРАТЬ
ПартииСУчетомВозвратов.Регистратор КАК Регистратор,
ПартииСУчетомВозвратов.Номенклатура КАК Номенклатура,
ПартииСУчетомВозвратов.ДокументОприходования КАК ДокументОприходования,
ПартииСУчетомВозвратов.Возвраты_КоличествоРасходПартии КАК Возвраты_КоличествоРасходПартии,
ПартииСУчетомВозвратов.Реализации_КоличествоРасходПартии КАК Реализации_КоличествоРасходПартии,
ПартииСУчетомВозвратов.КоличествоРасходПартии КАК КоличествоРасходПартии,
ПартииСУчетомВозвратов.СтоимостьРасходПартии,
СРЕДНЕЕ(ВЫБОР
КОГДА ПартииСУчетомВозвратов.КоличествоРасходПартии <> 0
ТОГДА ПартииСУчетомВозвратов.СтоимостьРасходПартии / ПартииСУчетомВозвратов.КоличествоРасходПартии
ИНАЧЕ 0
КОНЕЦ) КАК СредняяЦенаСписанияПартии,
ПартииСУчетомВозвратов.ХарактеристикаНоменклатуры
ИЗ
(ВЫБРАТЬ
Реализации.Регистратор КАК Регистратор,
Реализации.Номенклатура КАК Номенклатура,
Реализации.КоличествоРасходПартии + ЕСТЬNULL(Возвраты.КоличествоРасходПартии, 0) КАК КоличествоРасходПартии,
Реализации.ДокументОприходования КАК ДокументОприходования,
Возвраты.КоличествоРасходПартии КАК Возвраты_КоличествоРасходПартии,
Реализации.КоличествоРасходПартии КАК Реализации_КоличествоРасходПартии,
Реализации.СтоимостьРасходПартии + ЕСТЬNULL(Возвраты.СтоимостьРасходПартии, 0) КАК СтоимостьРасходПартии,
Реализации.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
ИЗ
(ВЫБРАТЬ
ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор КАК Регистратор,
ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
СУММА(ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьРасход) КАК СтоимостьРасходПартии,
ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоРасход КАК КоличествоРасходПартии,
ПартииТоваровНаСкладахОстаткиИОбороты.ДокументОприходования КАК ДокументОприходования,
ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор.Сделка КАК Сделка,
ПартииТоваровНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
ИЗ
РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, ДвиженияИГраницыПериода, ) КАК ПартииТоваровНаСкладахОстаткиИОбороты
ГДЕ
ПартииТоваровНаСкладахОстаткиИОбороты.Период МЕЖДУ &НачалоПериода И &КонецПериода
И ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
СГРУППИРОВАТЬ ПО
ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор,
ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура,
ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоРасход,
ПартииТоваровНаСкладахОстаткиИОбороты.ДокументОприходования,
ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор.Сделка,
ПартииТоваровНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры) КАК Реализации
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
ПартииТоваровНаСкладахОстаткиИОбороты.ДокументОприходования КАК ДокументОприходования,
СУММА(ЕСТЬNULL(ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьРасход, 0)) КАК СтоимостьРасходПартии,
ЕСТЬNULL(ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоРасход, 0) КАК КоличествоРасходПартии,
Продажи.ДокументПродажи КАК ДокументПродажи,
ПартииТоваровНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
ИЗ
РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, ДвиженияИГраницыПериода, ) КАК ПартииТоваровНаСкладахОстаткиИОбороты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи КАК Продажи
ПО ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор = Продажи.Регистратор
И ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура = Продажи.Номенклатура
И ПартииТоваровНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры = Продажи.ХарактеристикаНоменклатуры
ГДЕ
ПартииТоваровНаСкладахОстаткиИОбороты.Период МЕЖДУ &НачалоПериода И &КонецПериода
И ПартииТоваровНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя
СГРУППИРОВАТЬ ПО
ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура,
ПартииТоваровНаСкладахОстаткиИОбороты.ДокументОприходования,
ПартииТоваровНаСкладахОстаткиИОбороты.Заказ,
ЕСТЬNULL(ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоРасход, 0),
Продажи.ДокументПродажи,
ПартииТоваровНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры) КАК Возвраты
ПО Реализации.ХарактеристикаНоменклатуры = Возвраты.ХарактеристикаНоменклатуры
И Реализации.ДокументОприходования = Возвраты.ДокументОприходования
И Реализации.Регистратор = Возвраты.ДокументПродажи
И Реализации.Номенклатура = Возвраты.Номенклатура) КАК ПартииСУчетомВозвратов
ГДЕ
ПартииСУчетомВозвратов.КоличествоРасходПартии <> 0
СГРУППИРОВАТЬ ПО
ПартииСУчетомВозвратов.Регистратор,
ПартииСУчетомВозвратов.Номенклатура,
ПартииСУчетомВозвратов.ДокументОприходования,
ПартииСУчетомВозвратов.Возвраты_КоличествоРасходПартии,
ПартииСУчетомВозвратов.Реализации_КоличествоРасходПартии,
ПартииСУчетомВозвратов.КоличествоРасходПартии,
ПартииСУчетомВозвратов.СтоимостьРасходПартии,
ПартииСУчетомВозвратов.ХарактеристикаНоменклатуры
Первый запрос тривиален. Все самое интересное во втором.
Я соединяю те движения партий, которые сделаны реализацией, с движениями которые делает возврат покупателя. Чтобы правильно их соединить (для вычитания сторно) , надо соединять по номенклатуре, характеристике, документу оприходования и документу продажи. С документом оприходования все понятно, но откуда в партиях взять документ продажи? Ответ прост. Возврат делает движения по продажам тоже и мы можем во вложеном запросе возвратов сделать соединение с продажами по регистратору (номенклатуре, характеристике) и вытащить таким образом документ продажи.
В СКД всегда так. Сначала долго думаешь, потом быстро делаешь.
Далее номера скриншотов соответствуют пунктам.
3. Теперь на уровне СКД делаем соединение наших наборов данных.
4. Создаем вычисляемые поля.
5. Ресурсы. Для цен продаж, списания и рентабельности задаём агрегатную функцию Среднее()
6. Параметры. Надо проверить ограничение доступности.
7. Настройки. Так должны выглядеть в конечном итоге. Для этого правой кнопкой на корне дерева, добавляем контрагента, номенклатуру. Характеристику добавляем в группировку номенклатуры. Потом документы.
8. Выбираем поля ресурсов, которые хотим видеть.
9. Отключаем рентабельность в группировке документа оприходования. она там не нужна.
10. Сортируем отчет по убыванию прибыли.
11. Задаем макет оформления.
12. Правой кнопкой на корне и добавляем новую диаграмму.
13. Добавляем серии и выбранные поля у диаграммы. Устанавливаем её тип.