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