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

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

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

Метод 1: Использование временной таблицы для поиска даты

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

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

  1. Создаем временную таблицу, в которую отбираем только идентификатор владельца (ссылку) и максимальное значение даты изменения.
  2. Используем ПОМЕСТИТЬ для сохранения результатов первого этапа во временную таблицу.
  3. Соединяем полученную временную таблицу с исходной табличной частью, используя в качестве условий соединения и ссылку на владельца, и дату.

Посмотрим на пример реализации такого кода:


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

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

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

Метод 2: Использование номера строки для точной идентификации

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

Разберем, как это реализовать:


ВЫБРАТЬ 
    ВодителиТаблицаСтатуса.Ссылка КАК Водитель, 
    ВодителиТаблицаСтатуса.ДатаИзмененияСтатуса КАК ДатаИзмененияСтатуса, 
    ВодителиТаблицаСтатуса.ТекущийСтатус КАК ТекущийСтатус, 
    ВодителиТаблицаСтатуса.НомерСтроки 
ПОМЕСТИТЬ ВТВсеЗаписи 
ИЗ 
    Справочник.Водители.ТаблицаСтатуса КАК ВодителиТаблицаСтатуса 
ГДЕ 
    ВодителиТаблицаСтатуса.Ссылка.Уволен = ЛОЖЬ; 

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

ВЫБРАТЬ 
    Срез.Водитель, 
    ВсеЗаписи.ТекущийСтатус 
ИЗ 
    ВТСрез КАК Срез 
ЛЕВОЕ СОЕДИНЕНИЕ ВТВсеЗаписи КАК ВсеЗаписи 
ПО 
    Срез.Водитель = ВсеЗаписи.Водитель 
    И Срез.ПоследняяСтрока = ВсеЗаписи.НомерСтроки

Почему это важно для архитектуры?

Разбирая этот вопрос, мы с вами видим, что работа с «последней записью» в табличной части — это всегда поиск компромисса. Табличные части справочников в 1С изначально не предназначены для хранения истории изменений с частой выборкой «последнего состояния».

Поэтому, проектируя систему, помните о следующих советах:

Надеемся, что теперь задача получения последней записи табличной части стала для вас понятной и вы легко сможете реализовать её в своих проектах!

← На главную