Как настроить отбор документов по дате и периоду в обычных формах 1С?

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

При разработке пользовательских интерфейсов в обычных формах 1С часто возникает задача фильтрации списка документов за выбранный период. Рассмотрим по шагам, почему запрос может не отбирать данные, как правильно передавать параметры дат и какие существуют альтернативные способы решения этой задачи.

Способ 1. Использование параметров в запросе и обработка границ периода

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

Разберем алгоритм настройки интерактивного выбора периода и выполнения запроса:

  1. Вызовем диалог настройки периода для интерактивного выбора дат пользователем.
  2. Передадим выбранные границы в параметры запроса.
  3. Используем функции языка запросов НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА для точного охвата всех документов.
  4. Выгрузим результат запроса в табличное поле формы.

Посмотрим на пример реализации обработки выбора периода:


Процедура ВыбПериодНажатие(Элемент)
    НастройкаПериода = Новый НастройкаПериода;
    НастройкаПериода.РедактироватьКакИнтервал = Истина;
    НастройкаПериода.РедактироватьКакПериод = Истина;
    НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период;
    НастройкаПериода.УстановитьПериод(НачПериода, ?(КонПериода = '00010101', КонПериода, КонецДня(КонПериода)));
    
    Если НастройкаПериода.Редактировать() Тогда
        НачПериода = НастройкаПериода.ПолучитьДатуНачала();
        КонПериода = НастройкаПериода.ПолучитьДатуОкончания();
    КонецЕсли;     
КонецПроцедуры

Теперь проанализируем процедуру заполнения и выполнения запроса с установкой параметров:


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

Способ 2. Отбор через стандартный список документов без написания запросов

Если на форме используется стандартное табличное поле, связанное с типом ДокументСписок, писать ручной запрос вовсе не обязательно. Платформа 1С предоставляет встроенные механизмы фильтрации через объект Отбор.

Рассмотрим, как применить отбор по дате программно:


Процедура УстановитьОтборПоПериоду()
    ОтборДата = ЭлементыФормы.СписокДокументов.Отбор.Дата;
    ОтборДата.Использование = Истина;
    ОтборДата.ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы;
    ОтборДата.ЗначениеС = НачПериода;
    ОтборДата.ЗначениеПо = КонецДня(КонПериода);
КонецПроцедуры

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

Организация прикрепления файлов к документам в списке

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

  1. Файлы сохраняются в подчиненный справочник или регистр сведений в реквизит с типом ХранилищеЗначения с использованием объекта ДвоичныеДанные.
  2. В запрос выборки списка добавляется левое соединение с хранилищем файлов для определения признака наличия документов.
  3. В табличном поле создается колонка с типом Булево (для отображения флажка) или колонка с иконкой (скрепка).
  4. Нажатие на ячейку обрабатывается в событии Выбор или Нажатие табличного поля, где вызывается ДиалогВыбораФайла для загрузки нового файла или открытия существующего.
← На главную