Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Отчет по валовой прибыли по типу цены
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
Fabri
Ситуация такая. Очень много товара продалось в минус и соответственно списание товаров по партиям и запись в регистр накопления ПродажиСебестоимость не произошло.
Для исправления ситуации создал новый отчет - по типу цены. Идея такова - берем все данные с регистра накопления - Продажи, для каждой номенклатуры получаем цену закупки на тот момент времени. ЦенаПродажи - ЦенаЗакупки = Чистая прибыль.
Есть табличная часть Товары с реквизитами - Номенклатура, Количество, СуммаПродажи, Себестоимость, ЧистаяПрибыль.

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

        
    Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ДатаНач));
    Запрос.УстановитьПараметр("ДатаКон", КонецДня(ДатаКон));
    Запрос.УстановитьПараметр("ТипЦен", ТипЦеныСебестоимости);

    Товары.Загрузить(Запрос.Выполнить().Выгрузить());
    
    Товары.Свернуть("Номенклатура","Количество,СуммаПродажи,Себестоимость,ЧистаяПрибыль");


Проблема в том что себестоимость, т.е. закупочную цену получаем не за тот момент времени когда продавался товар, а просто последнюю цену и естественно часто получаем что закупка больше чем продажа.
Ставил в запросе - ЛЕВОЕ СОЕДИНЕНИЕ - не помогло.
Дописывал
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
|        ПО Продажи.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура И Продажи.Период = ЦеныНоменклатурыСрезПоследних.Период

Но так вообще ничего не выводит.
Подскажите как правильно сформировать данный запрос. Спасибо.
Vofka
необходимо зарегистрироваться для просмотра ссылки
Fabri
Никак руки не доходили продолжить. Решил не брать с регистра ЦеныНоменклатуры, так как не для всей номенклатуры была указанна закупочная цена, а с регистра накопления ПартииТоваровНаСкладах, так как все оприходования, поступления и т.д. записываются в данный регистр.

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

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


Проблема в том что выводятся дубли записей, по 3-4 записи одной той же номенклатуры за один и тот же период.
Проблема видимо в строке
И Продажи.Период >= ПартииТоваровНаСкладах.Период
, но как записать чтобы выбиралась только одна первая по дате запись из регистра ПартииТоваровНаСкладах?
logist
Цитата(Fabri @ 06.05.14, 12:09) необходимо зарегистрироваться для просмотра ссылки
но как записать чтобы выбиралась только одна первая по дате запись из регистра ПартииТоваровНаСкладах?

Вложенный запрос.
sava1
Когда-то писал:

Выбрать
Продажи.Период,
Продажи.Контрагент,
Продажи.Номенклатура,
Продажи.КоличествоОборот КАК Количество,
Продажи.СтоимостьОборот КАК Стоимость,
ЦеныНоменклатуры.Цена
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ПО Продажи.Номенклатура = ЦеныНоменклатуры.Номенклатура
И (ЦеныНоменклатуры.ТипЦен = &ТипЦен)
И (ЦеныНоменклатуры.Период В
(ВЫБРАТЬ ПЕРВЫЕ 1
Цены.Период
ИЗ
РегистрСведений.ЦеныНоменклатуры КАК Цены
  ГДЕ Цены.Период <= Продажи.Период
          И Цены.Номенклатура = Продажи.Номенклатура
          И Цены.ТипЦен = &ТипЦен
      УПОРЯДОЧИТЬ ПО Цены.Период УБЫВ))
Fabri
Можете подсказать на данном примере как создать вложенный запрос, а то ещё не сталкивался с таким, а по манам не очень понятно, особенно когда спешишь sad.gif
Буду очень благодарен.

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


Длинное видео:
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.