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