Почему в печатную форму 1С попадают лишние данные за все дни вместо текущего?

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

При разработке печатных форм в среде 1С новички часто сталкиваются с ситуацией, когда запрос, который должен выбирать данные за конкретный день, возвращает «весь массив» записей из базы данных. Эта проблема обычно связана с некорректной фильтрацией или отсутствием параметров в запросе. Давайте вместе разберем, как исправить эту ошибку и настроить правильный отбор данных.

1. Работа с виртуальными таблицами

В 1С данные часто извлекаются из виртуальных таблиц, таких как Остатки, Обороты или СрезПоследних. Ошибка «вывода всего» чаще всего возникает из-за того, что вы не передали в таблицу параметры периода. Параметры указываются непосредственно в скобках после имени таблицы в тексте запроса.

Чтобы ограничить выборку, необходимо передать параметры НачалоПериода и КонецПериода. Если параметры не заданы, платформа по умолчанию не накладывает ограничений. Рассмотрим пример корректной записи:


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

Здесь параметры &НачалоДня и &КонецДня жестко задают временные рамки для виртуальной таблицы.

2. Использование блока ГДЕ в запросе

Если вы работаете с обычной таблицей регистра или справочника, фильтрация выполняется с помощью блока ГДЕ. Без этого условия запрос будет «видеть» всю базу данных. Посмотрим, как правильно составить это условие:


ВЫБРАТЬ
    РеализацияТоваров.Дата,
    РеализацияТоваров.СуммаДокумента
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваров
ГДЕ
    РеализацияТоваров.Дата МЕЖДУ &НачалоДня И &КонецДня

Использование оператора МЕЖДУ позволяет гарантированно ограничить выборку документов временным интервалом текущего дня.

3. Передача параметров из программного кода

Мало прописать параметры в тексте запроса — их нужно инициализировать в коде 1С с помощью метода УстановитьПараметр. Если вы забудете это сделать, 1С либо выдаст ошибку при выполнении, либо проигнорирует условие. Давайте разберем правильный подход в коде:


Запрос = Новый Запрос;
Запрос.Текст = "... (текст запроса с параметрами) ...";
Запрос.УстановитьПараметр("НачалоДня", НачалоДня(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецДня", КонецДня(ТекущаяДата()));
Результат = Запрос.Выполнить().Выгрузить();

Обязательно проверяйте, чтобы переменные, передаваемые в параметры, не были пустыми (например, через отладчик), иначе условие не сработает.

4. Преимущества использования СКД

Современный стандарт разработки 1С рекомендует использовать Систему Компоновки Данных (СКД) вместо ручного формирования табличного документа через Цикл. В СКД параметры периода являются стандартными настройками отчета. Вам не нужно вручную прописывать ГДЕ — достаточно добавить параметры в список доступных, и система сама наложит нужный фильтр. Это значительно снижает риск ошибок, связанных с ручным перебором записей и формированием ТабличныйДокумент.

5. Отладка и анализ результата

Если данные все равно попадают «лишние», воспользуйтесь Консолью запросов. Вставьте туда ваш текст запроса, вручную укажите параметры и посмотрите, какой результат вернет система. Это лучший способ понять, где именно нарушена логика: на уровне текста запроса или на этапе передачи параметров из модуля.

Совет: Всегда проверяйте границы периода. Часто новички указывают ТекущаяДата() в качестве конца периода, из-за чего в выборку попадают только документы, созданные до текущей секунды, а не за весь день. Всегда используйте функции НачалоДня() и КонецДня() для формирования границ временного интервала.

← На главную