К статье
Практический материал

Отчеты и Аналитика · 13 мин

Как сделать отбор по дате в 1С: пошаговая инструкция для списков, отчётов и запросов

Практическое руководство по отбору по дате в 1С: настройка периода в списках и отчётах, отбор в консоли запросов, динамические списки и типичные ошибки.

Отбор по дате — одна из самых частых операций в 1С: бухгалтеру нужны документы за квартал, менеджеру — заказы за неделю, разработчику — записи регистра за произвольный интервал. При этом способ задать период зависит от того, где вы работаете: в обычном списке документов, в отчёте на СКД, в консоли запросов или в программном коде.

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

Ниже разобраны все основные сценарии: отбор в пользовательском режиме, настройка периода в отчётах, работа с датами в запросах и в коде, а также типичные ошибки и способы их проверить.

Как 1С хранит даты и почему это важно для отбора

В 1С дата документа — это не календарный день, а момент времени с точностью до секунды. Документ, проведённый 31 марта в 14:35:12, по значению даты больше, чем просто «31.03». Если в отборе указать условие «Дата <= 31.03», то 31 марта без времени интерпретируется как 31.03 00:00:00 — начало дня. Все документы, проведённые в течение этого дня позже полуночи, в выборку не попадут.

Именно из-за этой особенности возникает самая массовая ошибка: пользователь или разработчик задаёт период «с 01.03 по 31.03», а отчёт показывает данные только до 30 марта включительно. Правильное решение — использовать конец дня: в запросах функцию КОНЕЦПЕРИОДА(&Дата, ДЕНЬ), в пользовательских настройках — стандартные периоды («Этот месяц», «Прошлый квартал»), которые платформа рассчитывает корректно.

Ещё один нюанс — даты в регистрах сведений и накопления. У записей регистра есть поле «Период», и отбор по нему подчиняется тем же правилам: период хранится с точностью до секунды, а для виртуальных таблиц остатков граница «на дату» понимается как начало указанного момента.

Отбор по дате в списке документов

В типовых конфигурациях на управляемых формах (1С:Бухгалтерия 3.0, Управление торговлей 11, ERP) список документов по умолчанию уже ограничен периодом — обычно текущим месяцем. Поле периода отображается над списком; чтобы его изменить, нажмите на надпись с периодом и выберите нужный интервал: стандартный («Сегодня», «Эта неделя», «Произвольный период») или задайте даты вручную.

Если поля периода над списком нет, откройте меню «Ещё» и выберите пункт «Установить период» (в некоторых конфигурациях — «Показывать за период»). Для произвольного интервала выберите вариант «Произвольный период» и укажите дату начала и дату окончания. Платформа автоматически включает в выборку весь последний день.

Для более гибкого отбора используйте команду «Ещё → Настроить список». Здесь можно добавить условие по полю «Дата» с видом сравнения: равно, больше, больше или равно, в интервале, в списке. Этот способ полезен, когда нужно, например, показать только документы после определённой даты без верхней границы.

Отбор по дате в списке документов
  1. 1
    Откройте нужный список документов (например, «Поступления товаров и услуг»).
  2. 2
    Нажмите на поле периода над списком или «Ещё → Установить период».
  3. 3
    Выберите стандартный период или «Произвольный период» и укажите даты начала и окончания.
  4. 4
    Нажмите «ОК» — список обновится и покажет только документы внутри интервала.
  5. 5
    Для точного условия откройте «Ещё → Настроить список» и добавьте отбор по полю «Дата» с нужным видом сравнения.

Отбор в обычных формах (8.2 и старые конфигурации)

В конфигурациях на обычных формах (например, УТ 10.3, Бухгалтерия 2.0) над списком документов есть кнопка с изображением календаря или поля «с … по …». Нажмите кнопку выбора интервала, задайте даты и подтвердите. Дополнительно доступен «Отбор по значению» через правую кнопку мыши на колонке «Дата», но он позволяет выбрать только одно конкретное значение даты, а не интервал.

Настройка периода в отчётах

Практически все типовые отчёты (оборотно-сальдовая ведомость, анализ продаж, карточка счёта) построены на системе компоновки данных и имеют поле периода прямо в шапке формы. Укажите даты начала и окончания или выберите стандартный период через кнопку выбора, затем нажмите «Сформировать».

Если нужно отобрать данные по дате конкретного документа или по дополнительному полю, откройте «Настройки» (иногда — «Ещё → Изменить вариант» или кнопка «Настройки»), перейдите на закладку «Отбор» и добавьте условие по нужному полю даты. Там же можно поменять вид сравнения — например, «Больше или равно» для анализа данных после определённого события.

Обратите внимание: в отчётах по остаткам (складские, расчёты с контрагентами) часто задаётся не период, а одна дата — «на дату». Остатки будут рассчитаны на начало указанного момента. Если нужно видеть остатки на конец дня 31 марта, в некоторых отчётах есть отдельная настройка, а в универсальном отчёте границу придётся задавать как 01.04 с пониманием, что это начало следующего дня.

Отбор по дате в запросе: консоль запросов и конструктор

Для разработчиков и продвинутых пользователей основной инструмент — язык запросов 1С. Отбор по дате задаётся в секции ГДЕ через параметры. Классический шаблон выглядит так:

ВЫБРАТЬ

РеализацияТоваровУслуг.Ссылка,

РеализацияТоваровУслуг.Дата,

РеализацияТоваровУслуг.СуммаДокумента

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ГДЕ

РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода

И РеализацияТоваровУслуг.Проведен

Параметры передаются при выполнении запроса. Ключевой момент — корректная установка конца периода:

Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ДатаНачала));

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

Если вместо КонецДня() передать просто дату, в выборку попадут только документы, проведённые ровно в 00:00:00 последнего дня. Альтернатива — указать границу прямо в тексте запроса: ГДЕ Дата <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ). Оба подхода равнозначны, выбирайте тот, который удобнее поддерживать.

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

Виртуальные таблицы регистров

При обращении к виртуальным таблицам (Остатки, Обороты, ОстаткиИОбороты) период задаётся параметрами виртуальной таблицы в скобках, а не в секции ГДЕ. Например: РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, ) или Обороты(&НачалоПериода, &КонецПериода, , ). Это критично для производительности: отбор в параметрах виртуальной таблицы выполняется на уровне расчёта итогов, а условие в ГДЕ заставит СУБД сначала выбрать все записи, а потом фильтровать.

Программный отбор: динамические списки и выборки

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

ЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(

Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;

ЭлементОтбора.ПравоеЗначение = НачалоДня(ТекущаяДатаСеанса());

ЭлементОтбора.Использование = Истина;

Для обхода документов напрямую в коде используется метод Выбрать() с параметрами дат: Документы.РеализацияТоваровУслуг.Выбрать(НачалоДня(Дата1), КонецДня(Дата2)). Учтите, что такая выборка не позволяет задать дополнительные условия — для сложных отборов всегда используйте запрос, он быстрее и гибче.

Способы отбора по дате

Период в шапке списка или отчёта

Подходит пользователю для повседневной работы; не требует настроек, но ограничен предопределённым полем даты.

Настройка списка / отбор СКД

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

Язык запросов

Максимальная гибкость и скорость на больших объёмах; доступен только разработчику или через консоль запросов.

Метод Выбрать() в коде

Простой обход документов за период; не поддерживает сложные условия и медленнее запроса.

Производительность и ограничения

Отбор по дате — ещё и инструмент оптимизации. Запрос к таблице документов за пять лет без ограничения периода на крупной базе может выполняться десятки секунд и блокировать работу других пользователей. Всегда ограничивайте выборку разумным периодом, даже если бизнес-задача формально требует «все данные» — часто достаточно последних двух-трёх лет плюс итоговых данных.

Для регистров накопления помните о механизме итогов: быстрый расчёт остатков возможен только на границы хранимых итогов (обычно начало месяца). Если отчёты строятся на произвольные даты внутри месяца, платформа дочитывает движения — это нормально, но на больших объёмах заметно медленнее. В типовых конфигурациях есть регламентные задания расчёта итогов; убедитесь, что они выполняются.

Отдельное ограничение — дата запрета изменения данных. Документы в закрытом периоде отображаются в отборах и отчётах, но недоступны для редактирования. Это не влияет на сам отбор, однако пользователи иногда принимают невозможность открыть документ за закрытый период за ошибку отбора.

Типичные ошибки и как их проверить

Самая частая ошибка — потеря документов последнего дня периода из-за даты без времени в условии «меньше или равно». Признак: сверка показывает, что документ существует, проведён, но в отчёт или выборку не попадает. Проверьте, как задана верхняя граница: должна быть либо КонецДня(Дата), либо КОНЕЦПЕРИОДА(&Дата, ДЕНЬ).

Вторая ошибка — отбор по дате в секции ГДЕ вместо параметров виртуальной таблицы. Запрос работает правильно, но медленно, и с ростом базы проблема усиливается. Третья — использование ТекущаяДата() в запросе вместо параметра: на сервере и клиенте время может различаться, а в запросах корректнее передавать дату параметром через ТекущаяДатаСеанса().

Типичные ошибки
01
Условие «Дата <= 31.03» без времени — теряются все документы последнего дня, кроме проведённых ровно в полночь. Используйте КонецДня() или КОНЕЦПЕРИОДА.
02
Отбор по периоду в ГДЕ для виртуальных таблиц регистров — запрос корректен, но работает медленно. Период нужно передавать в параметры виртуальной таблицы.
03
Сравнение даты со строкой («Дата = "01.03"») — запрос вернёт пустой результат или ошибку. Даты передаются только параметрами типа Дата.
04
Отбор в настройках отчёта плюс период в шапке — пользователь забывает про одно из условий и получает неожиданно пустой отчёт.
Контрольные точки

Как проверить результат отбора

Количество документов за последний день периода
Норма

Документы последнего дня присутствуют в выборке

Тревожный признак

Документы последнего дня отсутствуют — граница задана началом дня

Скорость выполнения запроса к регистру
Норма

Запрос выполняется за секунды, период в параметрах виртуальной таблицы

Тревожный признак

Запрос «висит», период задан в секции ГДЕ

Совпадение итогов с эталонным отчётом
Норма

Суммы совпадают с ОСВ или аналогичным типовым отчётом за тот же период

Тревожный признак

Расхождения на документы граничных дат

FAQ: частые вопросы об отборе по дате

Почему в отчёт не попадают документы последнего дня периода?

Потому что дата без времени равна началу дня (00:00:00), а документы проведены позже. В пользовательских отчётах выбирайте стандартные периоды — платформа сама ставит конец дня. В запросах используйте КонецДня(Дата) или КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) для верхней границы.

Как задать отбор по дате «за всё время»?

В списке документов: «Ещё → Установить период» и вариант «Все время» (или снимите флаг ограничения периода). В запросе просто уберите условие по дате. Учтите, что на больших базах это может работать медленно — лучше ограничивать период разумными рамками.

Можно ли отобрать документы за несколько несвязанных периодов сразу?

В стандартном поле периода — нет, задаётся один непрерывный интервал. В настройках списка или отчёта можно добавить несколько условий по полю «Дата» и объединить их группой «ИЛИ». В запросе используйте конструкцию с ИЛИ: (Дата МЕЖДУ ... И ...) ИЛИ (Дата МЕЖДУ ... И ...).

Чем отличается «Стандартный период» от обычных дат в запросе?

Стандартный период (СтандартныйПериод) — это объект с датами начала и окончания, удобный для передачи в СКД: он автоматически корректно вычисляет границы. В обычных запросах проще передавать два параметра типа Дата, явно применяя НачалоДня() и КонецДня().

Почему отбор по дате в динамическом списке сбрасывается при переоткрытии?

Отборы, установленные через «Настроить список», сохраняются в пользовательских настройках формы. Если настройки не сохраняются, проверьте, не отключено ли сохранение настроек в свойствах формы, и не очищаются ли они программно в обработчике ПриСозданииНаСервере. Отбор, установленный кодом, нужно восстанавливать кодом при каждом открытии.

Как отобрать записи регистра сведений по периоду, если регистр непериодический?

У непериодического регистра сведений поля «Период» нет — отбор по дате невозможен, если только в регистре не заведено отдельное реквизитное поле типа «Дата». В этом случае отбирайте по этому реквизиту обычным условием. Если историчность нужна, регистр должен быть периодическим с заданной периодичностью (секунда, день, месяц и т.д.).

Итог

Что важно запомнить

В пользовательском режиме период задаётся через «Установить период» или настройки отчёта, в запросах — через параметры с КонецДня() для верхней границы. Для виртуальных таблиц регистров период передаётся в параметры таблицы, а не в ГДЕ. Главная ошибка — дата без времени в условии «меньше или равно», из-за которой теряются документы последнего дня.