Как найти дату последней реализации по контрагенту или партнеру

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

В процессе разработки отчетов или механизмов анализа клиентской базы в 1С:Управление торговлей 11 (11.5) часто возникает задача определить дату последней отгрузки для каждого клиента. Это необходимо для сегментации базы, выявления «спящих» клиентов или расчета задолженности. Рассмотрим детально, как реализовать эту задачу с помощью эффективных запросов, разберем различные подходы и выясним, какой из них наиболее эффективен с точки зрения производительности. Для автоматизации работы с неактивной клиентской базой можно использовать отчет для возврата потерянных клиентов с формированием звонков.

Метод 1. Простой запрос к документам реализации

Самый очевидный способ — обратиться напрямую к таблице документов РеализацияТоваровУслуг. Разберем этот вариант, так как он наиболее прост в понимании для начинающих разработчиков 1С. Проанализируем ситуацию: нам нужно сгруппировать все документы по контрагенту и выбрать из каждой группы максимальное значение даты.

Рассмотрим пример кода:


ВЫБРАТЬ
    Док.Контрагент КАК Контрагент,
    МАКСИМУМ(Док.Дата) КАК ДатаПоследнейРеализации
ИЗ
    Документ.РеализацияТоваровУслуг КАК Док
ГДЕ
    Док.Проведен = ИСТИНА
СГРУППИРОВАТЬ ПО
    Док.Контрагент

В данном примере мы используем агрегатную функцию МАКСИМУМ, которая позволяет получить самую позднюю дату для каждого уникального Контрагент. Обязательно добавляем условие Док.Проведен = ИСТИНА, чтобы не учитывать черновики или помеченные на удаление документы, которые не создали фактической продажи.

Метод 2. Использование регистров накопления (оптимальный путь)

Хотя запрос к документам прост, на больших информационных базах он может работать медленно, так как системе приходится сканировать таблицу заголовков документов. В УТ 11 для целей учета продаж существует специализированный регистр накопления — ВыручкаИСебестоимостьПродаж. Проанализируем, почему работа с регистрами накопления предпочтительнее.

Данные в регистрах уже индексированы и оптимизированы для выборки. Кроме того, в этом регистре фиксируются не только «Реализации товаров и услуг», но и «Акты выполненных работ», что делает данные о «последней активности» более полными.

Посмотрим на структуру запроса к регистру:


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

Обратите внимание на использование поля АналитикаУчетаПоПартнерам. В УТ 11 данные хранятся в разрезе ключей аналитики. Если вам нужен конкретный Контрагент (юридическое лицо), вы можете развернуть это поле. Если же важен Партнер (управленческая сущность), используйте соответствующий реквизит ключа.

Метод 3. Решение проблемы «одинакового времени» (Эмуляция Среза последних)

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

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

Рассмотрим пошаговый алгоритм:

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

Пример реализации сложного запроса:


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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПоследниеДоки.Контрагент,
    ПоследниеДоки.МаксСсылка.Дата КАК Дата,
    ПоследниеДоки.МаксСсылка КАК Документ
ИЗ
    ВТ_ПоследниеДокументы КАК ПоследниеДоки

В этом коде мы гарантируем результат «один контрагент — один документ». Использование МАКСИМУМ(Ссылка) — это стандартный прием в запросах 1С для разрешения коллизий времени, так как ссылки уникальны и имеют внутренний порядок. Если требуется отобрать несколько последних записей в отчете, можно применить методику получения среза последних N записей в СКД.

Важные нюансы архитектуры УТ 11

Разберем ситуацию с разделением на Партнеров и Контрагентов. В типовых решениях на базе ERP-платформы (УТ 11, КА 2, ERP 2) это принципиально разные справочники:

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

Дополнительные инструменты: ABC-классификация

Посмотрим на ситуацию шире. Если вам нужно знать даты последних реализаций для маркетинговых целей, возможно, не стоит писать запрос с нуля. В 1С:УТ 11 встроен механизм ABC/XYZ-классификации клиентов. Проанализируем его возможности: система автоматически рассчитывает показатели активности клиентов, включая количество дней с последней продажи. Эти данные хранятся в соответствующих регистрах сведений (например, СтадииВзаимоотношенийСКлиентами) и обновляются регламентным заданием. Использование этих готовых механизмов классификации может значительно сэкономить ресурсы сервера.

Подведем итог: для быстрого получения даты используйте агрегатную функцию МАКСИМУМ к регистру ВыручкаИСебестоимостьПродаж. Если же требуется получить конкретный документ при совпадении времени — используйте пакетный запрос с временными таблицами и группировкой по ссылке.

← На главную