Ситуация такая. Очень много товара продалось в минус и соответственно списание товаров по партиям и запись в регистр накопления ПродажиСебестоимость не произошло.
Для исправления ситуации создал новый отчет - по типу цены. Идея такова - берем все данные с регистра накопления - Продажи, для каждой номенклатуры получаем цену закупки на тот момент времени. ЦенаПродажи - ЦенаЗакупки = Чистая прибыль.
Есть табличная часть Товары с реквизитами - Номенклатура, Количество, СуммаПродажи, Себестоимость, ЧистаяПрибыль.
Вот код запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Продажи.Номенклатура,
| Продажи.Количество,
| Продажи.Стоимость КАК СуммаПродажи,
| ВЫРАЗИТЬ(ЦеныНоменклатурыСрезПоследних.Цена * Продажи.Количество КАК ЧИСЛО(15, 2)) КАК Себестоимость,
| ВЫРАЗИТЬ(Продажи.Стоимость - ЦеныНоменклатурыСрезПоследних.Цена * Продажи.Количество КАК ЧИСЛО(15, 2)) КАК ЧистаяПрибыль
|ИЗ
| РегистрНакопления.Продажи КАК Продажи
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
| ПО Продажи.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
|ГДЕ
| Продажи.Период МЕЖДУ &ДатаНач И &ДатаКон
| И ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен";
Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ДатаНач));
Запрос.УстановитьПараметр("ДатаКон", КонецДня(ДатаКон));
Запрос.УстановитьПараметр("ТипЦен", ТипЦеныСебестоимости);
Товары.Загрузить(Запрос.Выполнить().Выгрузить());
Товары.Свернуть("Номенклатура","Количество,СуммаПродажи,Себестоимость,ЧистаяПрибыль");
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
| ПО Продажи.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура И Продажи.Период = ЦеныНоменклатурыСрезПоследних.Период
http://pro1c.org.ua/index.php?showtopic=6419
Никак руки не доходили продолжить. Решил не брать с регистра ЦеныНоменклатуры, так как не для всей номенклатуры была указанна закупочная цена, а с регистра накопления ПартииТоваровНаСкладах, так как все оприходования, поступления и т.д. записываются в данный регистр.
Вот код:
КодОперации=Новый Массив;
КодОперации.Добавить(Перечисления.КодыОперацийПартииТоваров.Оприходование);
КодОперации.Добавить(Перечисления.КодыОперацийПартииТоваров.Поступление);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Продажи.Номенклатура,
| Продажи.Количество,
| Продажи.Стоимость КАК СуммаПродажи,
| Продажи.Период КАК Период,
| ВЫРАЗИТЬ(ПартииТоваровНаСкладах.Стоимость / ПартииТоваровНаСкладах.Количество * Продажи.Количество КАК ЧИСЛО(15, 2)) КАК Себестоимость,
| ВЫРАЗИТЬ(Продажи.Стоимость - (ВЫРАЗИТЬ(ПартииТоваровНаСкладах.Стоимость / ПартииТоваровНаСкладах.Количество * Продажи.Количество КАК ЧИСЛО(15, 2))) КАК ЧИСЛО(15, 2)) КАК ЧистаяПрибыль
|ИЗ
| РегистрНакопления.Продажи КАК Продажи
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
| ПО Продажи.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
| И Продажи.Период >= ПартииТоваровНаСкладах.Период
|ГДЕ
| ПартииТоваровНаСкладах.КодОперации В(&КодОперации)
| И Продажи.Период МЕЖДУ &ДатаНач И &ДатаКон
|
|УПОРЯДОЧИТЬ ПО
| Период";
Запрос.УстановитьПараметр("КодОперации", КодОперации);
Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ДатаНач));
Запрос.УстановитьПараметр("ДатаКон", КонецДня(ДатаКон));
Товары.Загрузить(Запрос.Выполнить().Выгрузить());
И Продажи.Период >= ПартииТоваровНаСкладах.Период
, но как записать чтобы выбиралась только одна первая по дате запись из регистра ПартииТоваровНаСкладах?
Когда-то писал:
Выбрать
Продажи.Период,
Продажи.Контрагент,
Продажи.Номенклатура,
Продажи.КоличествоОборот КАК Количество,
Продажи.СтоимостьОборот КАК Стоимость,
ЦеныНоменклатуры.Цена
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ПО Продажи.Номенклатура = ЦеныНоменклатуры.Номенклатура
И (ЦеныНоменклатуры.ТипЦен = &ТипЦен)
И (ЦеныНоменклатуры.Период В
(ВЫБРАТЬ ПЕРВЫЕ 1
Цены.Период
ИЗ
РегистрСведений.ЦеныНоменклатуры КАК Цены
ГДЕ Цены.Период <= Продажи.Период
И Цены.Номенклатура = Продажи.Номенклатура
И Цены.ТипЦен = &ТипЦен
УПОРЯДОЧИТЬ ПО Цены.Период УБЫВ))
Можете подсказать на данном примере как создать вложенный запрос, а то ещё не сталкивался с таким, а по манам не очень понятно, особенно когда спешишь
Буду очень благодарен.
Спасибо sava1.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Продажи.Номенклатура,
| Продажи.Количество,
| Продажи.Стоимость КАК СуммаПродажи,
| Продажи.Период КАК Период,
| ВЫРАЗИТЬ(ПартииТоваровНаСкладах.Стоимость / ПартииТоваровНаСкладах.Количество * Продажи.Количество КАК ЧИСЛО(15, 2)) КАК Себестоимость,
| ВЫРАЗИТЬ(Продажи.Стоимость - (ВЫРАЗИТЬ(ПартииТоваровНаСкладах.Стоимость / ПартииТоваровНаСкладах.Количество * Продажи.Количество КАК ЧИСЛО(15, 2))) КАК ЧИСЛО(15, 2)) КАК ЧистаяПрибыль
|ИЗ
| РегистрНакопления.Продажи КАК Продажи
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
| ПО Продажи.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
| И (ПартииТоваровНаСкладах.Период В
| (ВЫБРАТЬ ПЕРВЫЕ 1
| Цены.Период
| ИЗ
| РегистрНакопления.ПартииТоваровНаСкладах КАК Цены
| ГДЕ Цены.Период <= Продажи.Период
| И Цены.Номенклатура = Продажи.Номенклатура
| И Цены.КодОперации В(&КодОперации)
| УПОРЯДОЧИТЬ ПО Цены.Период УБЫВ))
|ГДЕ
| Продажи.Период МЕЖДУ &ДатаНач И &ДатаКон";
Пакетные запросы+Вложенные запросы
Короткое видео:
Длинное видео:
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua