Как получить цену последней продажи товара в запросе 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Часто в процессе разработки отчетов или механизмов подбора товаров перед программистом 1С встает задача: определить цену, по которой товар был продан в последний раз. На первый взгляд, задача кажется тривиальной, однако попытка решить ее через простую группировку СГРУППИРОВАТЬ ПО часто приводит к получению всех исторических цен, а не одной актуальной. Давайте разберем, почему это происходит и как правильно построить запрос.

Почему группировка не дает нужного результата?

Рассмотрим ошибку в исходном запросе автора. Использование МАКСИМУМ(Период) вместе с группировкой по полям, включая рассчитанную цену, заставляет систему 1С формировать уникальные записи для каждой комбинации товара и цены. В итоге, если товар продавался по разным ценам, вы получите список всех этих цен, так как для каждой из них существует свой Период. Чтобы получить именно последнюю цену, нам нужно сначала выделить дату последней операции, а затем привязать к этой дате конкретные данные.

Решение 1: Использование конструкции ВЫБРАТЬ ПЕРВЫЕ

Если вам нужно получить последнюю цену для одного конкретного товара, самым простым и наглядным способом является ограничение выборки и сортировка по периоду в обратном порядке.

Разберем это решение по шагам:

  1. Выбираем данные из таблицы регистра.
  2. Сортируем записи по полю Период в порядке убывания (сначала самые свежие).
  3. Ограничиваем выборку первой записью с помощью инструкции ВЫБРАТЬ ПЕРВЫЕ 1.

Пример кода для такой задачи:


ВЫБРАТЬ ПЕРВЫЕ 1
    ПродажиОбороты.СуммаОборот / ПродажиОбороты.КоличествоОборот КАК Цена
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, Номенклатура = &НужныйТовар) КАК ПродажиОбороты
УПОРЯДОЧИТЬ ПО
    ПродажиОбороты.Период УБЫВ

Решение 2: Поиск через максимальную дату

Если же перед нами стоит задача получить последние цены для целого списка товаров, метод ВЫБРАТЬ ПЕРВЫЕ 1 в рамках одного запроса не сработает напрямую. В таких случаях мы используем пакетные запросы или временные таблицы. Суть метода заключается в разделении логики на два этапа:

  1. Этап 1: Поиск максимальной даты (регистратора) для каждого товара и сохранение этого результата во временную таблицу.
  2. Этап 2: Соединение полученной временной таблицы с основной таблицей регистра продаж для извлечения суммы и количества на эту конкретную дату.

Этот подход значительно эффективнее, так как он оптимизирует работу СУБД, позволяя избежать сканирования всей истории регистра. Помните, что для обеспечения высокой скорости работы критически важно, чтобы по полю Номенклатура и Период в регистре были настроены индексы.

Рекомендации по оптимизации

Проанализируем ситуацию: полная история продаж может насчитывать годы, и поиск последней цены во всем массиве данных — ресурсоемкая операция. Чтобы отчеты не «зависали», придерживайтесь следующих правил:

Надеемся, что этот разбор поможет вам правильно реализовать механизм поиска последней цены и избежать проблем с производительностью запросов!

← На главную