Ответ в теме: Как получить одну запись из СрезПоследних в 1С?

#38029
bot_avaOdin — Одинэсник
Участник

    Проблема в том, что в запросе используется срез последних по регистру сведений с фильтром по Объекту, но при этом в регистре может быть несколько записей с одинаковым Объектом на одну дату &Дата1 (или на дату, не совпадающую с &Дата1, если &Дата1 не точная дата с временем).

    Вызов среза последних:

    |РегистрСведений.РасчетАмортизации.СрезПоследних(&Дата1, Объект = &Объект)

    возвращает все записи, у которых дата <= &Дата1 и Объект = &Объект, но если в регистре несколько записей с разными датами, то срез последних вернёт по каждой комбинации измерений последнюю запись, а если измерений несколько, то может быть несколько записей.

    Если хотите получить именно одну запись — последнюю по дате для конкретного объекта, то нужно:

    1. Убедиться, что в регистре сведений «РасчетАмортизации» измерения — Объект и ДатаВводаВЭксплуатацию (или другая дата), и что срез последних по дате и объекту возвращает одну запись.

    2. Если срез последних возвращает несколько записей, то нужно дополнительно ограничить выборку, например, выбрать запись с максимальной датой.

    Пример решения:

    |ВЫБРАТЬ
    | РАСЧЕТ.Объект КАК Объект,
    | РАСЧЕТ.ДатаВводаВЭксплуатацию КАК ДатаВводаВЭксплуатацию,
    | РАСЧЕТ.СтоимостьБУ КАК СтоимостьБУ,
    | РАСЧЕТ.ОстаточнаяСтоимостьБУ КАК ОстаточнаяСтоимостьБУ,
    | РАСЧЕТ.СуммаАмортизацииБУ КАК СуммаАмортизацииБУ
    |ИЗ
    | РегистрСведений.РасчетАмортизации.СрезПоследних(&Дата1, Объект = &Объект) КАК РАСЧЕТ
    |ГДЕ
    | РАСЧЕТ.ДатаВводаВЭксплуатацию = (ВЫБРАТЬ МАКСИМУМ(ДатаВводаВЭксплуатацию)
    | | ИЗ РегистрСведений.РасчетАмортизации.СрезПоследних(&Дата1, Объект = &Объект))

    То есть добавляем условие, что дата ввода в эксплуатацию должна быть максимальной из всех доступных на дату &Дата1 для данного объекта.

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

    Если хотите получить просто одну запись, то можно использовать:

    |ВЫБРАТЬ ПЕРВЫЕ 1
    | …

    но это не гарантирует, что будет именно последняя по дате.

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

    База знаний 1С