Отчеты и Аналитика · 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Откройте нужный список документов (например, «Поступления товаров и услуг»).
- 2Нажмите на поле периода над списком или «Ещё → Установить период».
- 3Выберите стандартный период или «Произвольный период» и укажите даты начала и окончания.
- 4Нажмите «ОК» — список обновится и покажет только документы внутри интервала.
- 5Для точного условия откройте «Ещё → Настроить список» и добавьте отбор по полю «Дата» с нужным видом сравнения.
Отбор в обычных формах (8.2 и старые конфигурации)
В конфигурациях на обычных формах (например, УТ 10.3, Бухгалтерия 2.0) над списком документов есть кнопка с изображением календаря или поля «с … по …». Нажмите кнопку выбора интервала, задайте даты и подтвердите. Дополнительно доступен «Отбор по значению» через правую кнопку мыши на колонке «Дата», но он позволяет выбрать только одно конкретное значение даты, а не интервал.
Настройка периода в отчётах
Практически все типовые отчёты (оборотно-сальдовая ведомость, анализ продаж, карточка счёта) построены на системе компоновки данных и имеют поле периода прямо в шапке формы. Укажите даты начала и окончания или выберите стандартный период через кнопку выбора, затем нажмите «Сформировать».
Если нужно отобрать данные по дате конкретного документа или по дополнительному полю, откройте «Настройки» (иногда — «Ещё → Изменить вариант» или кнопка «Настройки»), перейдите на закладку «Отбор» и добавьте условие по нужному полю даты. Там же можно поменять вид сравнения — например, «Больше или равно» для анализа данных после определённого события.
Обратите внимание: в отчётах по остаткам (складские, расчёты с контрагентами) часто задаётся не период, а одна дата — «на дату». Остатки будут рассчитаны на начало указанного момента. Если нужно видеть остатки на конец дня 31 марта, в некоторых отчётах есть отдельная настройка, а в универсальном отчёте границу придётся задавать как 01.04 с пониманием, что это начало следующего дня.
Отбор по дате в запросе: консоль запросов и конструктор
Для разработчиков и продвинутых пользователей основной инструмент — язык запросов 1С. Отбор по дате задаётся в секции ГДЕ через параметры. Классический шаблон выглядит так:
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка,
РеализацияТоваровУслуг.Дата,
РеализацияТоваровУслуг.СуммаДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода
И РеализацияТоваровУслуг.Проведен
Параметры передаются при выполнении запроса. Ключевой момент — корректная установка конца периода:
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ДатаНачала));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(ДатаОкончания));
Если вместо КонецДня() передать просто дату, в выборку попадут только документы, проведённые ровно в 00:00:00 последнего дня. Альтернатива — указать границу прямо в тексте запроса: ГДЕ Дата <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ). Оба подхода равнозначны, выбирайте тот, который удобнее поддерживать.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка, Дата ИЗ Документ.РеализацияТоваровУслуг ГДЕ Дата МЕЖДУ &Начало И &Конец";
Запрос.УстановитьПараметр("Начало", НачалоДня(ДатаНачала));
Запрос.УстановитьПараметр("Конец", КонецДня(ДатаОкончания));
Результат = Запрос.Выполнить().Выгрузить();Виртуальные таблицы регистров
При обращении к виртуальным таблицам (Остатки, Обороты, ОстаткиИОбороты) период задаётся параметрами виртуальной таблицы в скобках, а не в секции ГДЕ. Например: РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, ) или Обороты(&НачалоПериода, &КонецПериода, , ). Это критично для производительности: отбор в параметрах виртуальной таблицы выполняется на уровне расчёта итогов, а условие в ГДЕ заставит СУБД сначала выбрать все записи, а потом фильтровать.
Программный отбор: динамические списки и выборки
В управляемых формах списки строятся на динамических списках. Если нужно программно установить отбор по дате из кода формы, работайте с коллекцией отборов компоновки данных:
ЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(
Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
ЭлементОтбора.ПравоеЗначение = НачалоДня(ТекущаяДатаСеанса());
ЭлементОтбора.Использование = Истина;
Для обхода документов напрямую в коде используется метод Выбрать() с параметрами дат: Документы.РеализацияТоваровУслуг.Выбрать(НачалоДня(Дата1), КонецДня(Дата2)). Учтите, что такая выборка не позволяет задать дополнительные условия — для сложных отборов всегда используйте запрос, он быстрее и гибче.
Способы отбора по дате
Подходит пользователю для повседневной работы; не требует настроек, но ограничен предопределённым полем даты.
Гибкие условия (интервалы, сравнения, несколько полей); требует понимания видов сравнения.
Максимальная гибкость и скорость на больших объёмах; доступен только разработчику или через консоль запросов.
Простой обход документов за период; не поддерживает сложные условия и медленнее запроса.
Производительность и ограничения
Отбор по дате — ещё и инструмент оптимизации. Запрос к таблице документов за пять лет без ограничения периода на крупной базе может выполняться десятки секунд и блокировать работу других пользователей. Всегда ограничивайте выборку разумным периодом, даже если бизнес-задача формально требует «все данные» — часто достаточно последних двух-трёх лет плюс итоговых данных.
Для регистров накопления помните о механизме итогов: быстрый расчёт остатков возможен только на границы хранимых итогов (обычно начало месяца). Если отчёты строятся на произвольные даты внутри месяца, платформа дочитывает движения — это нормально, но на больших объёмах заметно медленнее. В типовых конфигурациях есть регламентные задания расчёта итогов; убедитесь, что они выполняются.
Отдельное ограничение — дата запрета изменения данных. Документы в закрытом периоде отображаются в отборах и отчётах, но недоступны для редактирования. Это не влияет на сам отбор, однако пользователи иногда принимают невозможность открыть документ за закрытый период за ошибку отбора.
Типичные ошибки и как их проверить
Самая частая ошибка — потеря документов последнего дня периода из-за даты без времени в условии «меньше или равно». Признак: сверка показывает, что документ существует, проведён, но в отчёт или выборку не попадает. Проверьте, как задана верхняя граница: должна быть либо КонецДня(Дата), либо КОНЕЦПЕРИОДА(&Дата, ДЕНЬ).
Вторая ошибка — отбор по дате в секции ГДЕ вместо параметров виртуальной таблицы. Запрос работает правильно, но медленно, и с ростом базы проблема усиливается. Третья — использование ТекущаяДата() в запросе вместо параметра: на сервере и клиенте время может различаться, а в запросах корректнее передавать дату параметром через ТекущаяДатаСеанса().
Как проверить результат отбора
Документы последнего дня присутствуют в выборке
Документы последнего дня отсутствуют — граница задана началом дня
Запрос выполняется за секунды, период в параметрах виртуальной таблицы
Запрос «висит», период задан в секции ГДЕ
Суммы совпадают с ОСВ или аналогичным типовым отчётом за тот же период
Расхождения на документы граничных дат
FAQ: частые вопросы об отборе по дате
Почему в отчёт не попадают документы последнего дня периода?
Потому что дата без времени равна началу дня (00:00:00), а документы проведены позже. В пользовательских отчётах выбирайте стандартные периоды — платформа сама ставит конец дня. В запросах используйте КонецДня(Дата) или КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) для верхней границы.
Как задать отбор по дате «за всё время»?
В списке документов: «Ещё → Установить период» и вариант «Все время» (или снимите флаг ограничения периода). В запросе просто уберите условие по дате. Учтите, что на больших базах это может работать медленно — лучше ограничивать период разумными рамками.
Можно ли отобрать документы за несколько несвязанных периодов сразу?
В стандартном поле периода — нет, задаётся один непрерывный интервал. В настройках списка или отчёта можно добавить несколько условий по полю «Дата» и объединить их группой «ИЛИ». В запросе используйте конструкцию с ИЛИ: (Дата МЕЖДУ ... И ...) ИЛИ (Дата МЕЖДУ ... И ...).
Чем отличается «Стандартный период» от обычных дат в запросе?
Стандартный период (СтандартныйПериод) — это объект с датами начала и окончания, удобный для передачи в СКД: он автоматически корректно вычисляет границы. В обычных запросах проще передавать два параметра типа Дата, явно применяя НачалоДня() и КонецДня().
Почему отбор по дате в динамическом списке сбрасывается при переоткрытии?
Отборы, установленные через «Настроить список», сохраняются в пользовательских настройках формы. Если настройки не сохраняются, проверьте, не отключено ли сохранение настроек в свойствах формы, и не очищаются ли они программно в обработчике ПриСозданииНаСервере. Отбор, установленный кодом, нужно восстанавливать кодом при каждом открытии.
Как отобрать записи регистра сведений по периоду, если регистр непериодический?
У непериодического регистра сведений поля «Период» нет — отбор по дате невозможен, если только в регистре не заведено отдельное реквизитное поле типа «Дата». В этом случае отбирайте по этому реквизиту обычным условием. Если историчность нужна, регистр должен быть периодическим с заданной периодичностью (секунда, день, месяц и т.д.).
Что важно запомнить
В пользовательском режиме период задаётся через «Установить период» или настройки отчёта, в запросах — через параметры с КонецДня() для верхней границы. Для виртуальных таблиц регистров период передаётся в параметры таблицы, а не в ГДЕ. Главная ошибка — дата без времени в условии «меньше или равно», из-за которой теряются документы последнего дня.