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