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

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

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

Давайте разберем, как реализовать такой поиск с помощью языка запросов 1С, учитывая различные варианты развития событий.

Использование виртуальной таблицы «Срез последних»

Самый простой и стандартный способ — использование виртуальной таблицы СрезПоследних. Она позволяет получить значение ресурса на указанный момент времени. Если записи на указанную дату нет, система вернет последнюю запись, датированную ранее этого периода.

Чтобы подставить дату документа в параметр таблицы, выполним следующие действия:

  1. Создадим запрос к виртуальной таблице РегистрСведений.НормаРасходаГСМ.СрезПоследних(&Период, ).
  2. Передадим параметр Период через объект Запрос непосредственно перед выполнением: Запрос.УстановитьПараметр("Период", Объект.ДатаДокумента).

Этот метод идеально подходит, если вам нужно найти значение, которое действовало «на момент» или «до момента» указанной даты.

Поиск ближайшей даты в прошлом и будущем

Если условие задачи требует найти не просто «последнее» значение, а именно «наиболее приближенное» (то есть, если ближайшая запись находится в будущем относительно даты документа, она тоже должна учитываться), стандартного СрезПоследних будет недостаточно. В этом случае мы применим математический подход.

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

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

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


ВЫБРАТЬ ПЕРВЫЕ 1
    Регистр.НормаРасхода КАК НормаРасхода,
    РАЗНОСТЬДАТ(Регистр.Период, &ДатаДокумента, СЕКУНДА) КАК Разница
ИЗ
    РегистрСведений.НормаРасходаГСМ КАК Регистр
УПОРЯДОЧИТЬ ПО
    ВЫБОР 
        КОГДА Разница < 0 ТОГДА -1 * Разница 
        ИНАЧЕ Разница 
    КОНЕЦ

Как работать со списком документов

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

  1. Поместите список дат ваших документов во ВременнуюТаблицу.
  2. Выполните соединение этой таблицы с основной таблицей регистра.
  3. Используйте условие на период в секции ГДЕ или в условии соединения, чтобы ограничить выборку для каждой строки.

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

Важные советы при реализации

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

← На главную