Как вывести список документов за определенную дату по значению флажка?

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

В процессе разработки отчетов в системе 1С:Предприятие часто возникает задача фильтрации данных по конкретным критериям. Одной из базовых, но требующих внимания задач является выборка документов, которые были созданы в определенный день и у которых установлен специфический признак — реквизит типа Булево (флажок). Рассмотрим подробно, как реализовать такую выборку, какие инструменты лучше использовать и на какие подводные камни стоит обратить внимание.

Решение 1: Использование программного запроса

Если нам необходимо программно получить список документов и обработать их (например, вывести в окно сообщений или заполнить таблицу значений), наиболее эффективным способом будет использование объекта Запрос. Разберем по шагам, как правильно составить текст запроса и установить параметры.

Важно помнить, что в базе данных 1С время хранится вместе с датой. Чтобы получить все документы за конкретные сутки, нам нужно задать интервал от самого начала дня (00:00:00) до самого конца (23:59:59). Проанализируем пример кода:


// Создаем объект Запрос
Запрос = Новый Запрос;

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

// Устанавливаем параметры. 
// Используем стандартные функции НачалоДня и КонецДня
НужнаяДата = ТекущаяДата(); // Здесь может быть любая дата, выбранная пользователем
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(НужнаяДата));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(НужнаяДата));

// Выполняем запрос и обходим выборку
Выборка = Запрос.Выполнить.Выбрать();

Пока Выборка.Следующий() Цикл
    Сообщить("Найден документ: " + Выборка.Ссылка + " от " + Выборка.Дата);
КонецЦикла;

В этом примере мы используем оператор МЕЖДУ, который позволяет эффективно ограничить выборку документов временными рамками одних суток. Обратите внимание, что условие ГДЕ Док.Флажок = ИСТИНА можно сократить до простого ГДЕ Док.Флажок — язык запросов 1С это поддерживает.

Решение 2: Использование Системы компоновки данных (СКД)

Если задача заключается в создании полноценного пользовательского отчета, использование чистого кода (как в первом варианте) считается устаревшим подходом. Разберем, почему СКД в данном случае предпочтительнее:

  1. Автоматическая работа с периодами: В СКД можно добавить параметр с типом СтандартныйПериод. Система сама предоставит пользователю удобный календарь и выбор интервалов (сегодня, вчера, текущая неделя).
  2. Гибкие отборы: Пользователь сможет самостоятельно добавлять дополнительные условия (например, отобрать документы только по конкретному складу или контрагенту), не обращаясь к программисту для правки кода.
  3. Производительность: СКД оптимизирует SQL-запросы на уровне платформы, обеспечивая максимально быстрое получение данных.

Чтобы реализовать это, создадим новый отчет, откроем схему компоновки данных и добавим набор данных — запрос. Текст запроса будет аналогичен приведенному выше, но параметры &НачалоПериода и &КонецПериода СКД подхватит автоматически на вкладке "Параметры".

Важный нюанс: Дата документа против Даты изменения

Выясним важную деталь, которая часто вводит в заблуждение начинающих разработчиков. Проанализируем ситуацию: документ был создан 10 апреля, но флажок "Оплачено" в нем установили и перепровели его только 15 апреля.

Как сработает обычный запрос? Если в запросе вы укажете дату 15 апреля, этот документ не попадет в отчет. Стандартное поле Дата в таблице документа — это оперативная дата самого документа (момент его совершения в учете), а не время последнего изменения его реквизитов.

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

Оптимизация и производительность

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

1. Индексирование: В конфигураторе найдите ваш реквизит "Флажок". В свойствах установите значение "Индексировать". Это создаст в СУБД индекс, который позволит мгновенно находить документы с нужным значением признака, не перебирая всю таблицу целиком.

2. Журналы документов: Если вам нужно собрать данные сразу из нескольких видов документов (например, "Реализация" и "Акт"), лучше создать ОбщийЖурналДокументов, вывести в него нужный флажок и делать запрос к таблице журнала. Это работает значительно быстрее, чем объединение нескольких запросов через ОБЪЕДИНИТЬ ВСЕ.

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

← На главную