Как правильно установить ограничение периода и условия в виртуальной таблице ОстаткиИОбороты

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

При работе с запросами в 1С:Предприятие 8 одной из самых частых задач является получение данных из регистров накопления. Виртуальная таблица ОстаткиИОбороты предоставляет мощный функционал для получения начальных и конечных остатков, а также оборотов за произвольный период. Однако начинающие разработчики часто сталкиваются с ошибками при попытке наложить фильтры непосредственно внутри параметров этой таблицы. Разберем детально, как избежать типичных ошибок и оптимизировать работу системы.

Разбор структуры параметров виртуальной таблицы

Для начала проанализируем ситуацию, возникшую в обсуждении. Ошибка "Неверные параметры" чаще всего возникает из-за несоблюдения порядка следования аргументов в функции виртуальной таблицы. В языке запросов 1С виртуальная таблица ОстаткиИОбороты может принимать до пяти параметров. Рассмотрим их назначение:

  1. Начало периода — тип Дата или МоментВремени.
  2. Конец периода — тип Дата или МоментВремени.
  3. Периодичность — определяет степень детализации (например, Период, День, Месяц, Регистратор).
  4. Метод дополнения периодов — определяет, нужно ли выводить строки за периоды, в которых не было движений (Движения или ДвиженияИПериодыДополнения).
  5. Условие — текст фильтра, который будет наложен на измерения регистра на уровне СУБД.

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


|ИЗ
|    РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты(&Дата1, &Дата2, , , 
|        АналитикаУчетаНоменклатуры.Номенклатура В ИЕРАРХИИ (&ВыбНоменклатура) 
|        И АналитикаУчетаНоменклатуры.МестоХранения В ИЕРАРХИИ (&ВыбМестоХранения)) КАК ТоварыОрганизацийОстаткиИОбороты

Обратите внимание на количество запятых: мы пропускаем 3-й и 4-й параметры, оставляя их пустыми, и помещаем наше условие строго в 5-ю позицию.

Преимущества фильтрации в параметрах по сравнению с секцией ГДЕ

Проанализируем ситуацию: почему важно стремиться переносить условия из секции ГДЕ в параметры виртуальной таблицы? Рассмотрим два подхода.

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

Подход 2: Использование 5-го параметра. Здесь фильтрация происходит в момент обращения к физическим таблицам базы данных (итогов и движений). СУБД сразу отбирает только те записи, которые соответствуют условию. Это на порядок ускоряет выполнение запроса и снижает нагрузку на сервер приложений.

Фильтрация по типу документа (Регистратору)

Рассмотрим более сложную задачу: что делать, если нужно отобрать данные только по определенным видам документов, например, только по "Реализации товаров и услуг"?

Здесь есть важный нюанс. Поле Регистратор не является измерением регистра, это стандартный реквизит. Поэтому его нельзя использовать в 5-м параметре виртуальной таблицы. Для решения этой задачи нам необходимо выполнить два шага:

  1. Установить 3-й параметр (Периодичность) в значение Регистратор.
  2. Наложить условие на тип ссылки регистратора в секции ГДЕ.

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


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

Важное замечание: использование периодичности Регистратор значительно увеличивает объем выборки, так как данные больше не агрегируются по периодам (дням/месяцам), а детализируются до каждой транзакции. Используйте этот метод только тогда, когда вам действительно нужен список документов в отчете.

Особенности работы с аналитикой в современных конфигурациях

В современных системах (таких как 1С:ERP или УТ 11) часто используется измерение АналитикаУчетаНоменклатуры. Это ключ связи, который ссылается на отдельный справочник. В запросе автора мы видим обращение через точку: АналитикаУчетаНоменклатуры.Номенклатура.

Проанализируем, как это работает на уровне SQL. При таком обращении внутри виртуальной таблицы платформа 1С выполняет неявное соединение (Left Join) с таблицей справочника ключей аналитики. Если записей много, это может замедлить запрос. Для оптимизации в высоконагруженных системах рекомендуется:

Проблема "пустого результата" и границы дат

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

Если вы передаете в &Дата2 значение 28.02.2023, то для 1С это означает 28.02.2023 00:00:00. Все документы, проведенные в течение этого дня, не попадут в выборку оборотов, так как они находятся "позже" границы. Чтобы избежать этого, всегда используйте функцию КонецПериода при установке параметров запроса в коде 1С:


Запрос.УстановитьПараметр("Дата1", НачалоДня(Объект.ДатаНачала));
Запрос.УстановитьПараметр("Дата2", КонецДня(Объект.ДатаОкончания));

Также стоит проверить, не перепутаны ли даты местами. Если Дата1 окажется больше Дата2, виртуальная таблица просто вернет пустой результат без выдачи ошибок.

Итоги и рекомендации

Подводя итог нашему разбору, выделим основные правила работы с ОстаткиИОбороты:

  1. Всегда считайте запятые! Условия по измерениям — это пятый параметр.
  2. Используйте 5-й параметр для фильтрации по Номенклатуре, Складу и другим измерениям для максимальной производительности.
  3. Если нужен фильтр по типу документа, обязательно ставьте периодичность Регистратор и используйте оператор ССЫЛКА в секции ГДЕ.
  4. При использовании условий В ИЕРАРХИИ убедитесь, что передаваемый параметр не является пустой ссылкой, иначе результат запроса может быть непредсказуемым.
  5. Следите за временем в датах: используйте КонецДня для корректного захвата оборотов последнего дня периода.

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

← На главную