Почему запрос к виртуальной таблице оборотов регистра накопления возвращает пустой результат при указании дат?

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

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


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

Если этот запрос возвращает данные без параметров &д1 и &д2, но «молчит» при их заполнении, необходимо последовательно проанализировать несколько технических факторов.

Нарушение порядка следования параметров

Разберем самую распространенную и банальную ошибку: перепутанные местами значения даты начала и даты конца периода. В виртуальной таблице Обороты первый параметр — это начало периода, а второй — конец. Если в переменную &д1 передать, например, 31.12.2023, а в &д2 — 01.12.2023, платформа попытается найти записи, период которых одновременно больше конца месяца и меньше его начала. Математически такое множество пусто, поэтому запрос вернет пустой результат без ошибок.

Решение: Проверьте код инициализации параметров. Убедитесь, что дата начала строго меньше или равна дате конца.

Особенности границ периода (Время 00:00:00)

Проанализируем ситуацию с передачей дат. Если вы передаете в качестве параметра конца периода дату без указания времени, 1С воспринимает ее как начало дня (00:00:00). В этом случае записи, сделанные в течение этого дня (например, в 12:00:00), в выборку не попадут.

Для корректного захвата данных за весь последний день периода рекомендуется использовать следующие подходы:

Типизация параметров в программном вызове

Выясним причину, связанную с типами данных. Если запрос выполняется программно через объект Запрос, критически важно, чтобы в УстановитьПараметр() передавался объект типа Дата. Если по ошибке туда попадает строка, пустая ссылка или Неопределено, запрос может выполниться (если тип позволяет неявное приведение), но результат будет непредсказуемым или пустым.

Всегда проверяйте заполнение параметров перед выполнением:


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

Специфика регистра «Выручка и себестоимость продаж»

Посмотрим на особенности конкретного регистра, используемого в конфигурациях 1С:ERP, КА 2 и УТ 11. Данный регистр имеет свою специфику заполнения:

  1. Отложенное проведение: Себестоимость в этом регистре может появляться только после выполнения регламентной операции «Закрытие месяца» или «Распределение доходов и расходов». Если вы ищете обороты по полю СебестоимостьОборот в середине месяца, данных может не быть, хотя выручка уже отражена.
  2. Виды учета: Обратите внимание, какие ресурсы вы выбираете. В регистре разделены суммы управленческого, регламентированного учета и учета без НДС. Если документы проведены только по одному виду учета, а вы запрашиваете другой, результат будет нулевым.

Влияние системы RLS и настроек СКД

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

Методы диагностики

Для окончательной проверки и поиска ошибки воспользуемся проверенным алгоритмом:

  1. Выполните простой запрос к физической таблице этого же регистра с условием ГДЕ Период МЕЖДУ &д1 И &д2. Если физическая таблица возвращает записи, значит проблема в логике использования виртуальной таблицы или в границах периода.
  2. Используйте внешнюю консоль запросов. Введите те же самые даты вручную через календарь. Это исключит ошибки программного формирования дат в коде.
  3. Убедитесь в наличии движений через стандартный интерфейс «Функции для технического специалиста» — «Регистры накопления». Проверьте поле Период в найденных записях.
← На главную