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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто в процессе разработки конфигураций на платформе 1С возникает задача выбора актуальных данных из справочников. Например, нам нужно получить список номенклатур, где для каждой позиции будет указан только тот сертификат, который имеет самую позднюю ДатаОкончанияСертификата. В данной статье мы разберем, как реализовать это с помощью механизмов запросов 1С.

Постановка задачи

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

Решение с использованием временных таблиц

Наиболее надежным и понятным способом решения этой задачи является использование пакетного запроса. Мы разобьем нашу работу на два этапа: сначала определим максимальные даты для каждой позиции, а затем соединим полученные данные с исходным справочником.

Шаг 1: Определение максимальных дат

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


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

Шаг 2: Получение полных данных

Теперь, имея временную таблицу ВТ_МаксДаты, мы можем выполнить основной запрос. Мы соединяем исходный справочник с нашей временной таблицей по двум условиям: совпадению номенклатуры и совпадению даты. Это позволит отсечь все «старые» записи, оставив только актуальные сертификаты.


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

Важные нюансы реализации

  1. Проблема дублирования дат: Обратите внимание, что если у одной номенклатуры случайно окажется два разных сертификата с одинаковой максимальной датой, в итоговую выборку попадут оба. Если бизнес-логика требует только одну запись, можно добавить дополнительный критерий в условие соединения, например, Сертификаты.Ссылка = МИНИМУМ(ВТ.Ссылка), либо использовать конструкцию ПЕРВЫЕ 1 в подзапросе.
  2. Использование регистров сведений: Хотя задача решена для справочника, мы рекомендуем оценить архитектуру системы. Если сертификаты часто меняются и к ним идет постоянное обращение, лучше перенести эти данные в РегистрСведений с периодичностью «В пределах дня» или «В пределах секунды». Это позволит использовать мощный механизм СрезПоследних, который работает быстрее и проще написания соединений вручную.
  3. Производительность: Использование временных таблиц — это «золотой стандарт» для сложных выборок в 1С. Они индексируются платформой автоматически, что обеспечивает высокую скорость обработки данных даже при большом объеме справочника.

Теперь вы знаете, как организовать выборку последних сертификатов. Этот подход является универсальным и может применяться для поиска последних цен, актуальных статусов или любых других периодических данных в вашей системе.

← На главную