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