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