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