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

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

При разработке в среде 1С на обычных формах (версии 8.2 или 8.3 в режиме совместимости) программисты часто сталкиваются с задачей автоматической фильтрации данных при открытии журналов или списков документов. Типичный пример — показывать пользователю документы только за текущий месяц. Однако попытка реализовать это "в лоб" часто приводит к ошибке Поле объекта не обнаружено (ВидСравнения). В этой статье мы подробно разберем, почему возникает эта ошибка, как правильно обращаться к механизму отборов и какие методы наиболее эффективны для работы с датами.

Разбор типичной ошибки: Элементы формы против Данных

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


// ОШИБОЧНЫЙ КОД
НовОтбор = ЭлементыФормы.Список.НастройкаОтбора.Найти("Дата");
НовОтбор.ВидСравнения = ВидСравнения.БольшеИлиРавно;        
НовОтбор.Значение = НачалоМесяца(ТекущаяДата()); 
НовОтбор.Использование = Истина;

Почему этот код вызывает исключение? Проанализируем ситуацию: ЭлементыФормы.Список — это объект типа ТабличноеПоле, который лишь отображает данные. Его свойство НастройкаОтбора не предназначено для прямого управления фильтрацией строк. В обычных формах за логику отбора отвечает объект данных, который является источником для этого табличного поля (обычно это ДокументСписок или СправочникСписок). Свойство Отбор доступно напрямую в контексте формы, если основной реквизит формы — список документов.

Правильная установка отбора через коллекцию Отбор

Чтобы исправить ошибку, нам нужно обратиться непосредственно к свойству Отбор. Выясним причину успеха правильного подхода: в обычных формах переменная Отбор уже содержит все доступные поля для фильтрации. Мы можем использовать метод Найти() или обращаться к полям напрямую. Посмотрим на рабочий пример кода:


// ПРАВИЛЬНЫЙ КОД
НовОтбор = Отбор.Найти("Дата");
Если НовОтбор <> Неопределено Тогда
    НовОтбор.ВидСравнения = ВидСравнения.БольшеИлиРавно;        
    НовОтбор.Значение = НачалоМесяца(ТекущаяДата()); 
    НовОтбор.Использование = Истина;
КонецЕсли;

Этот способ гарантирует, что мы работаем с нужным объектом метаданных, и система корректно воспримет параметры ВидСравнения и Значение.

Оптимизация кода: прямое обращение к реквизитам

Рассмотрим еще более элегантный способ. Если поле «Дата» является стандартным реквизитом, к нему в коллекции отбора можно обращаться через точку. Это избавляет от необходимости использовать метод Найти(). Разберем по шагам, как это выглядит:


// Оптимизированный вариант
Отбор.Дата.ВидСравнения = ВидСравнения.БольшеИлиРавно;
Отбор.Дата.Значение = НачалоМесяца(ТекущаяДата());
Отбор.Дата.Использование = Истина;

Такой код гораздо легче читать, и он работает быстрее. Важный момент: всегда проверяйте правильность написания имени поля (в данном случае Дата), оно должно совпадать с именем реквизита в метаданных.

Использование интервалов для точной фильтрации

Часто задачи бизнеса требуют ограничить список не просто «с начала месяца», а строго рамками текущего календарного месяца. Если использовать только БольшеИлиРавно, в список могут попасть документы из будущего (если они были ошибочно введены). Проанализируем, как задать четкий период с помощью вида сравнения ИнтервалВключаяГраницы:


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

В этом случае мы используем два дополнительных свойства: ЗначениеС и ЗначениеПо, что позволяет полностью контролировать временной диапазон отображаемых данных.

Универсальный метод Установить()

Существует еще один профессиональный способ работы с отборами, который рекомендуется использовать для сокращения объема кода. Это метод Установить(). Он одновременно включает использование отбора, задает значение и (опционально) вид сравнения. Посмотрим на пример:


// Компактная запись отбора
Отбор.Дата.Установить(НачалоМесяца(ТекущаяДата()), Истина);
// В данном случае вид сравнения по умолчанию станет "Равно". 
// Если нужен другой вид сравнения, лучше использовать классический метод.

Где размещать код и как управлять доступностью

Чтобы отбор применялся сразу при открытии списка, код необходимо разместить в обработчике события ПриОткрытии формы документа или списка.

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


Процедура ПриОткрытии()
    // Устанавливаем фильтр
    Отбор.Дата.Значение = НачалоМесяца(ТекущаяДата());
    Отбор.Дата.ВидСравнения = ВидСравнения.БольшеИлиРавно;
    Отбор.Дата.Использование = Истина;
    
    // Запрещаем пользователю менять этот отбор вручную
    Отбор.Дата.Доступность = Ложь;
КонецПроцедуры

Благодаря установке Доступность = Ложь, поле даты в стандартном окне настройки отбора станет неактивным, что защитит логику вашего приложения от непреднамеренных изменений пользователем.

Заключение

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

← На главную