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

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

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

Рассмотрим, как правильно реализовать подобное ограничение, разберем причины возникновения ошибок при установке видов сравнения и изучим альтернативные способы решения этой задачи.

Выясним причину ошибки «Недопустимый тип сравнения»

При попытке установить отбор в обычном приложении через программный код разработчики часто сталкиваются со ошибкой выполнения:

Ошибка при установке значения атрибута контекста (ВидСравнения): Недопустимый тип сравнения

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

Шаг 1. Настройка реквизита в Конфигураторе

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

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

Шаг 2. Программная настройка отбора в форме списка

После включения индексации пропишем логику фильтрации в модуле формы списка документов. Настройку отбора необходимо выполнять в обработчике события ПриОткрытии.

Рассмотрим пример кода, который скрывает документы, чья целевая дата еще не наступила:


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

КонецПроцедуры

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

Альтернативные варианты решения задачи

Если штатной настройки отбора в форме списка недостаточно, рассмотрим другие способы реализации бизнес-логики:

  1. Ограничение прав на уровне записей (RLS): Если документ должен быть скрыт не только в форме списка, но и в отчетах, глобальном поиске или программных выборках, необходимо настроить RLS в ролях пользователей с условием ГДЕ РеквизитДата <= ТекущаяДата.
  2. Замена источника данных на Таблицу Значений: Можно отказаться от стандартного объекта ДокументСписок, назначив источником табличного поля ТаблицаЗначений. При открытии формы выполняется прямой запрос к базе данных. Однако при этом подходе утрачивается динамическая порционная считываемость данных.
  3. Использование граф Журнала документов: Если реквизит скрытия используется в нескольких типах документов, их можно объединить в общий журнал. Графы журнала документов индексируются платформой автоматически.
← На главную