Как программно установить отбор по периоду для формы списка регистра сведений?

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

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

Понимание архитектуры динамических списков

В управляемых формах 1С список данных (включая списки регистров сведений) базируется на объекте ДинамическийСписок. Для управления отображением данных используется встроенная система компоновки данных. Чтобы программно ограничить выборку, нам необходимо манипулировать коллекцией Отбор этого списка.

Важно помнить, что если мы просто открываем форму, пользователь видит все данные. Чтобы внедрить наши условия, мы должны получить форму до ее открытия, настроить ее элементы отбора и только после этого вызвать метод Открыть().

Решение задачи: пошаговое руководство

Для реализации задачи по фильтрации регистра сведений по дате (периоду) и дополнительному измерению, пройдем по следующим шагам:

  1. Получаем объект формы списка через ПолучитьФорму().
  2. Очищаем существующие элементы отбора, чтобы избежать наложения старых условий.
  3. Создаем новые элементы отбора типа ЭлементОтбораКомпоновкиДанных для каждого поля.
  4. Устанавливаем значения фильтров и виды сравнения.
  5. Открываем форму.

Рассмотрим пример кода, который решает эту задачу:


&НаКлиенте
Процедура ОтборСделки(Команда)
    
    // Получаем форму списка регистра сведений
    ФормаРегистра = ПолучитьФорму("РегистрСведений.МежфирменныеРеализации.ФормаСписка");
    
    // Очищаем существующие отборы перед добавлением своих
    ФормаРегистра.Список.Отбор.Элементы.Очистить();
    
    // Добавляем отбор по Заказчику, если он задан
    Если НЕ ОтчетКонечныйЗаказчик.Пустая() Тогда
        ЭлементОтбораСотрудник = ФормаРегистра.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбораСотрудник.ЛевоеЗначение = ФормаРегистра.Список.Отбор.ДоступныеПоляОтбора.Элементы.Найти("Заказчик").Поле;
        ЭлементОтбораСотрудник.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементОтбораСотрудник.Использование = Истина;
        ЭлементОтбораСотрудник.ПравоеЗначение = ОтчетКонечныйЗаказчик;
    КонецЕсли;
    
    // Устанавливаем нижнюю границу даты (Период >= ДатаНачала)
    Если НЕ ОтчетПериод.ДатаНачала = Дата(1,1,1) Тогда
        ЭлементОтбораДатаС = ФормаРегистра.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбораДатаС.ЛевоеЗначение = ФормаРегистра.Список.Отбор.ДоступныеПоляОтбора.Элементы.Найти("Период").Поле;
        ЭлементОтбораДатаС.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
        ЭлементОтбораДатаС.Использование = Истина;
        ЭлементОтбораДатаС.ПравоеЗначение = НачалоДня(ОтчетПериод.ДатаНачала);
    КонецЕсли;    
    
    // Устанавливаем верхнюю границу даты (Период <= ДатаОкончания)
    Если НЕ ОтчетПериод.ДатаОкончания = Дата(1,1,1) Тогда
        ЭлементОтбораДатаПо = ФормаРегистра.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбораДатаПо.ЛевоеЗначение = ФормаРегистра.Список.Отбор.ДоступныеПоляОтбора.Элементы.Найти("Период").Поле;
        ЭлементОтбораДатаПо.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
        ЭлементОтбораДатаПо.Использование = Истина;
        ЭлементОтбораДатаПо.ПравоеЗначение = КонецДня(ОтчетПериод.ДатаОкончания);
    КонецЕсли;    
    
    // Отображаем подготовленную форму
    ФормаРегистра.Открыть();
КонецПроцедуры

Альтернативные подходы

Помимо прямого манипулирования элементами отбора, существуют и другие способы управления поведением списка:

Использование фиксированных настроек

Если нам необходимо гарантировать, что пользователь не сможет изменить установленные нами фильтры, мы можем воспользоваться параметром ФиксированныеНастройки. Эти настройки становятся частью «жесткой» логики списка. В этом случае программист передает структуру настроек компоновки при открытии формы, и они недоступны для редактирования в пользовательском интерфейсе.

Важные замечания по работе с датами

При работе с типом Дата в 1С крайне важно учитывать время. Как видно из примера, мы используем функции НачалоДня() и КонецДня(). Если просто сравнить дату начала с началом периода без учета времени, записи за текущий день могут не попасть в выборку или, наоборот, захватить лишнее. Всегда приводите границы интервала к началу или концу суток, чтобы обеспечить полноту данных в вашем отчете.

Рекомендации

  1. Всегда очищайте коллекцию элементов отбора, если вы переиспользуете форму или работаете в контексте, где настройки могли остаться от предыдущего вызова.
  2. Для простых сценариев (вид сравнения Равно) можно использовать параметры формы Отбор, однако программное добавление элементов отбора через Тип("ЭлементОтбораКомпоновкиДанных") является наиболее гибким и профессиональным методом, подходящим для любых условий.
  3. При использовании ПолучитьФорму() вы получаете полный контроль над контекстом формы до её отрисовки, что позволяет избежать «мерцания» интерфейса при применении фильтров.
← На главную