При работе с запросами в 1С:Предприятие программисты часто сталкиваются с ситуацией, когда запрос к виртуальной таблице Обороты работает корректно без указания параметров, но выдает пустой результат, как только накладываются ограничения по периоду. Рассмотрим типичный пример такого запроса к регистру накопления ВыручкаИСебестоимостьПродаж:
ВЫБРАТЬ
ВыручкаИСебестоимостьПродажОбороты.Подразделение,
ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот,
ВыручкаИСебестоимостьПродажОбороты.СебестоимостьОборот
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&д1, &д2, Авто, ) КАК ВыручкаИСебестоимостьПродажОбороты
Если этот запрос возвращает данные без параметров &д1 и &д2, но «молчит» при их заполнении, необходимо последовательно проанализировать несколько технических факторов.
Разберем самую распространенную и банальную ошибку: перепутанные местами значения даты начала и даты конца периода. В виртуальной таблице Обороты первый параметр — это начало периода, а второй — конец. Если в переменную &д1 передать, например, 31.12.2023, а в &д2 — 01.12.2023, платформа попытается найти записи, период которых одновременно больше конца месяца и меньше его начала. Математически такое множество пусто, поэтому запрос вернет пустой результат без ошибок.
Решение: Проверьте код инициализации параметров. Убедитесь, что дата начала строго меньше или равна дате конца.
Проанализируем ситуацию с передачей дат. Если вы передаете в качестве параметра конца периода дату без указания времени, 1С воспринимает ее как начало дня (00:00:00). В этом случае записи, сделанные в течение этого дня (например, в 12:00:00), в выборку не попадут.
Для корректного захвата данных за весь последний день периода рекомендуется использовать следующие подходы:
КонецПериода(ДатаКонца, "ДЕНЬ") перед передачей в запрос.Граница с видом Включая. Это гарантирует, что записи, созданные ровно в последнюю секунду периода, будут включены в расчет оборотов.Выясним причину, связанную с типами данных. Если запрос выполняется программно через объект Запрос, критически важно, чтобы в УстановитьПараметр() передавался объект типа Дата. Если по ошибке туда попадает строка, пустая ссылка или Неопределено, запрос может выполниться (если тип позволяет неявное приведение), но результат будет непредсказуемым или пустым.
Всегда проверяйте заполнение параметров перед выполнением:
Запрос.УстановитьПараметр("д1", НачалоДня(ВыбраннаяДата));
Запрос.УстановитьПараметр("д2", КонецДня(ВыбраннаяДатаКонца));
Посмотрим на особенности конкретного регистра, используемого в конфигурациях 1С:ERP, КА 2 и УТ 11. Данный регистр имеет свою специфику заполнения:
СебестоимостьОборот в середине месяца, данных может не быть, хотя выручка уже отражена.Если программный код выглядит верно, стоит проверить окружение, в котором выполняется запрос:
&д1 и &д2.Для окончательной проверки и поиска ошибки воспользуемся проверенным алгоритмом:
ГДЕ Период МЕЖДУ &д1 И &д2. Если физическая таблица возвращает записи, значит проблема в логике использования виртуальной таблицы или в границах периода.Период в найденных записях.