Как получить дату и сумму последней продажи по партнеру в 1С:УТ 11?

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

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

Почему возникают сложности с виртуальными таблицами?

Виртуальная таблица Обороты предназначена для получения итоговых данных за определенный интервал времени. Когда мы применяем группировку, система сворачивает все движения по выбранным аналитикам (например, по Партнеру и Организации) в одну строку и суммирует все показатели. Если мы хотим получить данные конкретного последнего документа, нам нужно сменить подход: работать с физической таблицей регистра накопления.

Пошаговое решение задачи

Для корректного решения мы воспользуемся механизмом временных таблиц. Такой подход позволит нам сначала вычислить «точку отсчета» (дату последней продажи), а затем извлечь сумму именно этого документа.

  1. Создание временной таблицы с последними датами: Мы должны получить для каждого партнера максимальное значение поля Период или Регистратор.
  2. Соединение с физической таблицей: Получив список последних дат, мы объединим его с основной таблицей регистра, чтобы «вытащить» сумму по конкретному документу.

Реализация через пакетный запрос

Рассмотрим пример кода, который позволяет решить эту задачу. В качестве примера будем использовать регистр накопления ВыручкаИСебестоимостьПродаж.

Сначала сформируем временную таблицу ВТ_ПоследниеПродажи, в которой определим время последнего события для каждого контрагента:


ВЫБРАТЬ
    ВыручкаИСебестоимостьПродаж.АналитикаУчетаПоПартнерам.Партнер КАК Партнер,
    МАКСИМУМ(ВыручкаИСебестоимостьПродаж.Период) КАК ПоследняяДата
ПОМЕСТИТЬ ВТ_ПоследниеПродажи
ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК ВыручкаИСебестоимостьПродаж
СГРУППИРОВАТЬ ПО
    ВыручкаИСебестоимостьПродаж.АналитикаУчетаПоПартнерам.Партнер
;

Теперь, имея список партнеров и дат их последних операций, выполним соединение с основной таблицей. Обратите внимание: соединение необходимо выполнять не только по Партнеру, но и по Периоду, чтобы получить сумму из одной конкретной записи:


ВЫБРАТЬ
    ВТ_ПоследниеПродажи.Партнер,
    ВТ_ПоследниеПродажи.ПоследняяДата,
    Регистр.СуммаВыручки КАК СуммаПоследнейПродажи
ИЗ
    ВТ_ПоследниеПродажи КАК ВТ_ПоследниеПродажи
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК Регистр
        ПО ВТ_ПоследниеПродажи.Партнер = Регистр.АналитикаУчетаПоПартнерам.Партнер
            И ВТ_ПоследниеПродажи.ПоследняяДата = Регистр.Период

Важные замечания и советы

При работе с регистрами накопления важно помнить несколько нюансов:

Используя этот подход, вы сможете гарантированно получить актуальные данные по любому партнеру, избежав ошибки «схлопывания» сумм, которая происходит при использовании группировок в виртуальных таблицах.

← На главную