1С 7.7 Последняя розничная цена в выбранном периоде

1. S_VA 27.10.23 10:20 Сейчас в теме
Как в торговле и склад 9.2 получить последнюю цену номенклатуры за выбранный период по типу цен "Розничная" до изменения?
Например делаю так в документе

Если КоличествоСтрок()>0 тогда
 УдалитьСтроки(); 
 КонецЕсли;
спрНом = СоздатьОбъект("Справочник.Номенклатура");
спрЦен = СоздатьОбъект("Справочник.Цены");
спрТипЦен = СоздатьОбъект("Справочник.ТипыЦен");
спрТипЦен.НайтиПоНаименованию("Розничная");
Пер = СоздатьОбъект("Периодический");
спрНом.ВыбратьЭлементы();
Пока спрНом.ПолучитьЭлемент() = 1 Цикл
Если спрНом.ЭтоГруппа() = 1 Тогда Продолжить КонецЕсли;
спрЦен.ИспользоватьВладельца(спрНом.ТекущийЭлемент());
Если спрЦен.НайтиПоРеквизиту("ТипЦен",спрТипЦен.ТекущийЭлемент(),0) = 1 Тогда
Пер.ИспользоватьОбъект("Цена",СпрЦен.ТекущийЭлемент());

Пер.ВыбратьЗначения(ДатаНач,ДатаКон);

Если Пер.ПолучитьЗначение() = 1 Тогда
ДействующаяЦена=глПолучитьЦену(спрНом.ТекущийЭлемент(),ТипЦен, РабочаяДата(),, ,,);	
ЦенаСтарая=Пер.Значение;  
Разница=ДействующаяЦена-ЦенаСтарая;
Если ПустоеЗначение(Разница)=0 Тогда
	НоваяСтрока();
	Номенклатура=(спрНом.ТекущийЭлемент());
	ВидТМЦ = Перечисление.ВидыТМЦ.Товар;
	Цена=ЦенаСтарая;
	РозничнаяЦена=ДействующаяЦена;
	Если Цена>0 тогда
    РозничнаяНаценка=РозничнаяЦена/Цена*100-100; 
	КонецЕсли;
    Количество=1;  
    Единица=Номенклатура.БазоваяЕдиница;
	Коэффициент=Номенклатура.БазоваяЕдиница.Коэффициент;
	Сумма=РозничнаяЦена*Количество;
 КонецЕсли;

КонецЕсли;
 


//КонецЦикла;
КонецЕсли;

КонецЦикла;
Показать


В итоге получаю цену саму первую в выбранном периоде
Если допустим в октябре цена менялась два раза то надо получить последнюю
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user856012 13 27.10.23 12:08 Сейчас в теме
(1)
Если допустим в октябре цена менялась два раза то надо получить последнюю
Не особо вникая в код - может быть, метод ОбратныйПорядок() поможет?
Пер.ИспользоватьОбъект("Цена",СпрЦен.ТекущийЭлемент());

Пер.ОбратныйПорядок(1);

Пер.ВыбратьЗначения(ДатаНач,ДатаКон);
3. Vlad_M_75 27.10.23 14:00 Сейчас в теме
А чем не устраивает просто СпрЦен.Цена.Получить(ДатаКон)?
4. пользователь 28.10.23 02:22
Сообщение было скрыто модератором.
...
5. CheBurator 3119 28.10.23 02:24 Сейчас в теме
спрТипЦен.НайтиПоНаименованию("Розничная");
- так делать не надо, есть Константа.РозничныйТипЦен
6. CheBurator 3119 28.10.23 02:27 Сейчас в теме
Если КоличествоСтрок()>0 тогда
УдалитьСтроки();
КонецЕсли;

убрать из кода вообще, имеет смысл использовать только если у вас в базе работает человек 30-50 и эта обработка запускается часто очень
7. CheBurator 3119 28.10.23 02:40 Сейчас в теме
судя по всему автор хочет (мутно выражаясь при этом)
период с 25.10 - сейчас.

20.10.23 = 150руб
25.10.23 = 180руб
27.10.23 = 200руб.
28.10.23 = сегодня
автор хочет получить предыдущую к последней измененной. последняя измененная =200 руб. Предыдущая (которую хочет) = 180.
код автора - не вникая глубоко - будет лажать, бо Пер.Значение у него будет не 180, а 150.
Правильный путь указан в (2) - запустить выборку в обратном направлении и получить два значения - последнее и предпоследнее
9. CheBurator 3119 28.10.23 13:56 Сейчас в теме
(7) ..при этом надо учесть, что возможны ситуации (сплошь и рядом встречается, особенно при костыльных доработках)
.
20.10.23 = 150руб
25.10.23 = 180руб
26.10.23 = 200руб.
27.10.23 = 200руб.
28.10.23 = сегодня
.
и тут вопрос - последня цена какая? 200...
а предпоследняя - какая?
10. CheBurator 3119 28.10.23 14:00 Сейчас в теме
(7) .. причем можно и как (3) заметил, сделать получение от ДатаК к ДатаН СпрЦены.Цена.Получить()...только тут будет недостаток в том что если идут две подряд одинаковые цены (сплошь и рядом такое бывает) - они будут "неразличимы, то есть для алгоритма это будет как бы "продолжающаяся" цена без изменения, а в зависимости от того что автору надо - это может быть критично...
8. CheBurator 3119 28.10.23 02:45 Сейчас в теме
ну и чисто так..
.ТекущийЭлемент() - дергает из базы каждый раз.
достаточно дернуть один раз

МояНоменклатура = СпрНом.ТекущийЭлемент()
и там где нужна ссылка использовать МояНоменклатура

то есть - не надо часто передергивать!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот