← Назад к вопросам

Значения каких типов можно передавать в параметр "период" виртуальной таблицы регистра накоплений?

2.0 Middle🔥 191 комментариев
#Объекты метаданных#Регистры

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы параметра "Период" в виртуальных таблицах регистров накопления

Параметр "Период" в функции срезов виртуальных таблиц регистров накопления определяет граничную дату для выборки. Системно поддерживаются следующие типы.

Поддерживаемые типы

1. Дата (Date)

  • Основной тип параметра
  • Обычная дата в формате системы
  • Получает остатки на конкретную дату
Запрос = Новый Запрос("ВЫБРАТЬ
|    Остатки.Товар,
|    Остатки.Склад,
|    Остатки.Количество
|ИЗ
|    РегистрНакопления.ТоварыНаСкладе.Остатки(@Дата) как Остатки");

Запрос.УстановитьПараметр("Дата", Дата(20250101));
Результат = Запрос.Выполнить();

2. Массив дат (Array of Dates)

  • Несколько дат для среза
  • Получает остатки на разные даты
  • Результат с датами в результирующем наборе
МассивДат = Новый Массив();
МассивДат.Добавить(Дата(20250101));
МассивДат.Добавить(Дата(20250201));
МассивДат.Добавить(Дата(20250301));

Запрос = Новый Запрос("ВЫБРАТЬ
|    Остатки.Период,
|    Остатки.Товар,
|    Остатки.Количество
|ИЗ
|    РегистрНакопления.ТоварыНаСкладе.Остатки(@ДатыСреза) как Остатки");

Запрос.УстановитьПараметр("ДатыСреза", МассивДат);
Результат = Запрос.Выполнить();

3. Неопределённо (Undefined)

  • Передача пустого параметра
  • Получает все остатки без ограничения по дате
  • Осторожно использовать на больших таблицах
Запрос = Новый Запрос("ВЫБРАТЬ
|    Остатки.Товар,
|    Остатки.Количество
|ИЗ
|    РегистрНакопления.ТоварыНаСкладе.Остатки(Неопределено) как Остатки");

// Получит ВСЕ остатки без фильтрации по дате
Результат = Запрос.Выполнить();

Практические примеры

Остатки на конкретную дату:

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

Динамика остатков за месяц:

Процедура ПолучитьДинамикуОстатков(НачалоПериода, КонецПериода)
    МассивДат = Новый Массив();
    
    // Добавляем даты через каждые 5 дней
    ТекущаяДата = НачалоПериода;
    Пока ТекущаяДата <= КонецПериода Цикл
        МассивДат.Добавить(ТекущаяДата);
        ТекущаяДата = ТекущаяДата + 5 * 86400; // +5 дней в секундах
    КонецЦикла;
    
    Запрос = Новый Запрос("ВЫБРАТЬ
    |    Остатки.Период,
    |    Остатки.Товар,
    |    Остатки.Количество
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладе.Остатки(@Даты) как Остатки");
    
    Запрос.УстановитьПараметр("Даты", МассивДат);
    Результат = Запрос.Выполнить();
КонецПроцедуры;

Сравнение остатков на две даты:

Процедура СравнитьОстатки(ДатаНачало, ДатаКонец)
    МассивДат = Новый Массив();
    МассивДат.Добавить(ДатаНачало);
    МассивДат.Добавить(ДатаКонец);
    
    Запрос = Новый Запрос("ВЫБРАТЬ
    |    Остатки.Период,
    |    Остатки.Товар,
    |    СУММА(СЛУЧАЙ КОГДА Остатки.Период = @ДатаНачало ТОГДА Остатки.Количество ИНАЧЕ 0 КОНЕЦ) КАК ОстатокНачало,
    |    СУММА(СЛУЧАЙ КОГДА Остатки.Период = @ДатаКонец ТОГДА Остатки.Количество ИНАЧЕ 0 КОНЕЦ) КАК ОстатокКонец
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладе.Остатки(@Даты) как Остатки
    |СГРУППИРОВАТЬ ПО
    |    Остатки.Товар");
    
    Запрос.УстановитьПараметр("Даты", МассивДат);
    Запрос.УстановитьПараметр("ДатаНачало", ДатаНачало);
    Запрос.УстановитьПараметр("ДатаКонец", ДатаКонец);
    
    Результат = Запрос.Выполнить();
КонецПроцедуры;

Особенности работы

С одной датой:

  • Быстро, так как 1С знает точное время среза
  • Получает остатки ровно на эту дату
  • Оптимально для оперативных отчётов

С массивом дат:

  • Может быть медленнее (зависит от размера массива)
  • Результат содержит колонку Период
  • Удобно для анализа динамики

С Неопределено:

  • Очень медленно на больших таблицах
  • Получает все записи без фильтрации
  • Используется редко, в основном для специального анализа

Как это работает внутри

Срезы остатков вычисляют:

  1. Берут все записи по дату среза
  2. Группируют по аналитикам (разрезы)
  3. Суммируют приходы и расходы
  4. Вычисляют остатки
Остаток = Начальный остаток + Приходы - Расходы

Best Practices

1. Используй конкретную дату:

  • Вместо Неопределено передавай точную дату
  • Это ускорит запрос в 100+ раз

2. Ограничивай массив дат:

// ❌ Плохо: 365 дат за год
Массив = Новый Массив();
Для i = 1 По 365 Цикл
    МассивДат.Добавить(Дата(20250101) + i * 86400);
КонецЦикла;

// ✅ Хорошо: 12 дат (по месяцам)
Массив = Новый Массив();
Для i = 1 По 12 Цикл
    МассивДат.Добавить(Дата(2025, i, 1));
КонецЦикла;

3. Используй срезы оборотов для периодов:

  • Для анализа за период используй срезы оборотов
  • Это быстрее, чем вычитать остатки

Типы параметра Период критичны для эффективной работы с регистрами накопления, позволяя гибко выбирать данные за нужные периоды.

Значения каких типов можно передавать в параметр "период" виртуальной таблицы регистра накоплений? | PrepBro