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

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как получить одну запись из СрезПоследних в 1С?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #38028
      Фото аватараOdineski
      Участник

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

        Что не так ? выбираются все записи, а не одна

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С