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