Часто в процессе разработки отчетов или механизмов подбора товаров перед программистом 1С встает задача: определить цену, по которой товар был продан в последний раз. На первый взгляд, задача кажется тривиальной, однако попытка решить ее через простую группировку СГРУППИРОВАТЬ ПО часто приводит к получению всех исторических цен, а не одной актуальной. Давайте разберем, почему это происходит и как правильно построить запрос.
Рассмотрим ошибку в исходном запросе автора. Использование МАКСИМУМ(Период) вместе с группировкой по полям, включая рассчитанную цену, заставляет систему 1С формировать уникальные записи для каждой комбинации товара и цены. В итоге, если товар продавался по разным ценам, вы получите список всех этих цен, так как для каждой из них существует свой Период. Чтобы получить именно последнюю цену, нам нужно сначала выделить дату последней операции, а затем привязать к этой дате конкретные данные.
Если вам нужно получить последнюю цену для одного конкретного товара, самым простым и наглядным способом является ограничение выборки и сортировка по периоду в обратном порядке.
Разберем это решение по шагам:
Период в порядке убывания (сначала самые свежие).ВЫБРАТЬ ПЕРВЫЕ 1.Пример кода для такой задачи:
ВЫБРАТЬ ПЕРВЫЕ 1
ПродажиОбороты.СуммаОборот / ПродажиОбороты.КоличествоОборот КАК Цена
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, Номенклатура = &НужныйТовар) КАК ПродажиОбороты
УПОРЯДОЧИТЬ ПО
ПродажиОбороты.Период УБЫВ
Если же перед нами стоит задача получить последние цены для целого списка товаров, метод ВЫБРАТЬ ПЕРВЫЕ 1 в рамках одного запроса не сработает напрямую. В таких случаях мы используем пакетные запросы или временные таблицы. Суть метода заключается в разделении логики на два этапа:
Этот подход значительно эффективнее, так как он оптимизирует работу СУБД, позволяя избежать сканирования всей истории регистра. Помните, что для обеспечения высокой скорости работы критически важно, чтобы по полю Номенклатура и Период в регистре были настроены индексы.
Проанализируем ситуацию: полная история продаж может насчитывать годы, и поиск последней цены во всем массиве данных — ресурсоемкая операция. Чтобы отчеты не «зависали», придерживайтесь следующих правил:
РегистрСведений с признаком периодичности, всегда отдавайте предпочтение виртуальной таблице СрезПоследних. Она была создана платформой 1С специально для таких задач.Надеемся, что этот разбор поможет вам правильно реализовать механизм поиска последней цены и избежать проблем с производительностью запросов!