В процессе разработки отчетов в системе 1С:Предприятие часто возникает задача фильтрации данных по конкретным критериям. Одной из базовых, но требующих внимания задач является выборка документов, которые были созданы в определенный день и у которых установлен специфический признак — реквизит типа Булево (флажок). Рассмотрим подробно, как реализовать такую выборку, какие инструменты лучше использовать и на какие подводные камни стоит обратить внимание.
Если нам необходимо программно получить список документов и обработать их (например, вывести в окно сообщений или заполнить таблицу значений), наиболее эффективным способом будет использование объекта Запрос. Разберем по шагам, как правильно составить текст запроса и установить параметры.
Важно помнить, что в базе данных 1С время хранится вместе с датой. Чтобы получить все документы за конкретные сутки, нам нужно задать интервал от самого начала дня (00:00:00) до самого конца (23:59:59). Проанализируем пример кода:
// Создаем объект Запрос
Запрос = Новый Запрос;
// Определяем текст запроса.
// Замените "РеализацияТоваровУслуг" на имя вашего документа
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка КАК Ссылка,
| Док.Номер КАК Номер,
| Док.Дата КАК Дата
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ
| Док.Флажок = ИСТИНА
| И Док.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
// Устанавливаем параметры.
// Используем стандартные функции НачалоДня и КонецДня
НужнаяДата = ТекущаяДата(); // Здесь может быть любая дата, выбранная пользователем
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(НужнаяДата));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(НужнаяДата));
// Выполняем запрос и обходим выборку
Выборка = Запрос.Выполнить.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Найден документ: " + Выборка.Ссылка + " от " + Выборка.Дата);
КонецЦикла;
В этом примере мы используем оператор МЕЖДУ, который позволяет эффективно ограничить выборку документов временными рамками одних суток. Обратите внимание, что условие ГДЕ Док.Флажок = ИСТИНА можно сократить до простого ГДЕ Док.Флажок — язык запросов 1С это поддерживает.
Если задача заключается в создании полноценного пользовательского отчета, использование чистого кода (как в первом варианте) считается устаревшим подходом. Разберем, почему СКД в данном случае предпочтительнее:
СтандартныйПериод. Система сама предоставит пользователю удобный календарь и выбор интервалов (сегодня, вчера, текущая неделя).Чтобы реализовать это, создадим новый отчет, откроем схему компоновки данных и добавим набор данных — запрос. Текст запроса будет аналогичен приведенному выше, но параметры &НачалоПериода и &КонецПериода СКД подхватит автоматически на вкладке "Параметры".
Выясним важную деталь, которая часто вводит в заблуждение начинающих разработчиков. Проанализируем ситуацию: документ был создан 10 апреля, но флажок "Оплачено" в нем установили и перепровели его только 15 апреля.
Как сработает обычный запрос? Если в запросе вы укажете дату 15 апреля, этот документ не попадет в отчет. Стандартное поле Дата в таблице документа — это оперативная дата самого документа (момент его совершения в учете), а не время последнего изменения его реквизитов.
Если ваша задача — найти документы, в которых флажок был изменен именно сегодня (независимо от того, когда создан сам документ), есть два пути решения:
ВерсииОбъектов. Там хранится история всех изменений. Однако это трудозатратная операция, которая может замедлить отчет.ДатаУстановкиФлажка. В модуле объекта в процедуре ПередЗаписью пропишем логику: если значение флажка меняется с Ложь на Истина, записываем в этот реквизит текущую дату. Тогда в отчете мы будем фильтровать не по полю Дата, а по нашему новому полю.Посмотрим на ситуацию со стороны базы данных. Если в вашей базе сотни тысяч документов, поиск по булеву полю может выполняться медленно. Чтобы ускорить процесс, выполним следующие рекомендации:
1. Индексирование: В конфигураторе найдите ваш реквизит "Флажок". В свойствах установите значение "Индексировать". Это создаст в СУБД индекс, который позволит мгновенно находить документы с нужным значением признака, не перебирая всю таблицу целиком.
2. Журналы документов: Если вам нужно собрать данные сразу из нескольких видов документов (например, "Реализация" и "Акт"), лучше создать ОбщийЖурналДокументов, вывести в него нужный флажок и делать запрос к таблице журнала. Это работает значительно быстрее, чем объединение нескольких запросов через ОБЪЕДИНИТЬ ВСЕ.
Таким образом, выбор метода зависит от ваших целей: для быстрой разовой обработки подойдет простой запрос, а для удобства пользователей — отчет на базе СКД с обязательным учетом специфики хранения дат в 1С.